SDL2解析並顯示24位bmp

2021-08-09 15:07:21 字數 3529 閱讀 3421

記錄一下,備忘

1.sdl2 畫點參考

選擇 24位bmp 的原因是 這種格式最簡單

資源:第乙個圖用於測試,第二個是自己用 畫圖板除錯時用的,只有4x2大小,方便觀察格式內容,開發過程中便於除錯

開發過程中遇到的問題:

1.bmp 檔案資料的組織排列形式(小端)

2.檔案讀取時的邏輯錯誤。最終用乙個自己手繪的 4x2的小圖,參照 hex 16進製制編輯器 (sublime ,notepad++ 都有外掛程式可以用,vitual studio 可以監視記憶體),最後解決讀取時錯誤的記憶體偏移

**:***.h ***.cpp

定義了 24位bmp 的 類,並實現了乙個 讀取bmp 檔案的函式

1.main.cpp

#include "***.h"

miao***::the24bitbmp bitmap;

int main()

***.h

#ifndef __***_h__

#define __***_h__

#include namespace miao***

long filesize;

long dataoffset;

int width;

int height;

char* data;

int fillzeroperline;

int sizeperline;

unsigned char getrat(int x, int y);

unsigned char getgat(int x, int y);

unsigned char getbat(int x, int y);

char* getaddrat(int x, int y);

}; void test***(std::string filepath, the24bitbmp& bitmap);

}#endif //__***_h__

***.cpp

#include "***.h"

#include namespace miao***

unsigned char the24bitbmp::getgat(int x, int y)

unsigned char the24bitbmp::getbat(int x, int y)

char* the24bitbmp::getaddrat(int x, int y)

long filesize(file* fp)

/*addr 位址

bytes 多少位元組 (每個位元組是8位)

*/ int getdecimal(char* addr,int bytes)

return ret;

} void test***(std::string file,the24bitbmp& bitmap)

fread(fd, size,1, fp);

fclose(fp);

bitmap.dataoffset = getdecimal(fd + 10, 4);

bitmap.filesize = getdecimal(fd + 2, 4);

bitmap.width = getdecimal(fd + 18, 4);

bitmap.height = getdecimal(fd + 22, 4);

long datasize = bitmap.filesize - bitmap.dataoffset;

bitmap.data = new char[datasize]();

memcpy(bitmap.data, fd + bitmap.dataoffset, datasize);

int shouldbytesperline = bitmap.width * 3;

bitmap.fillzeroperline = 0;

if (shouldbytesperline %4 != 0)

bitmap.sizeperline = shouldbytesperline + bitmap.fillzeroperline;

delete fd;

}}

#include "sdl.h"

;#include #include #include "***.h"

const int scale_factor = 1;

//const int scale_factor = 200;

: _pwindow(nullptr)

, _pscreensu***ce(nullptr)

, _prenderer(nullptr)

, _screenwidth(100)

, _screenheight(100)

_screenwidth = screenwidth * scale_factor;

_screenheight = screenheight * scale_factor;

_pwindow = sdl_createwindow("msdl1", sdl_windowpos_undefined, sdl_windowpos_undefined, _screenwidth, _screenheight, sdl_window_shown | sdl_window_resizable);

//_pwindow = sdl_createwindow("msdl1", sdl_windowpos_undefined, sdl_windowpos_undefined, _screenwidth, _screenheight, sdl_window_shown | sdl_window_fullscreen);

if (_pwindow == nullptr)

int w, h;

sdl_getwindowsize(_pwindow, &w, &h);

printf("viewport size: %d,%d\n",w,h);

_pscreensu***ce = sdl_getwindowsu***ce(_pwindow);

_prenderer = sdl_createrenderer(_pwindow, -1, sdl_renderer_accelerated);

if (_prenderer == nullptr)

sdl_fillrect(_pscreensu***ce, nullptr, sdl_maprgba(_pscreensu***ce->format, 0, 0, 0, 0));

return true;

} }

;sdl_renderfillrect(_prenderer, &fillrect);

} for (int row = 0; row < _screenheight; row++)

}sdl_renderpresent(_prenderer); }}

結果:

SDL2函式簡單介紹01

int sdl init uint32 flags 內部呼叫了sdl initsubsystem 功能 初始化sdl庫,呼叫其他sdl函式之前必須先呼叫此函式 引數 falgs 子系統初始化標誌取下列值的or sdl init timer timer subsystem sdl init audio...

SDL2函式簡單介紹04

1.sdl thread sdl createthread sdl threadfunction fn,const char name,void data 功能 建立乙個新的執行緒 引數 fn 新執行緒中呼叫的函式 name 執行緒的名字 data 傳給fn的引數 返回值 成功返回給新執行緒不透明指...

SDL2 遊戲開發日誌(二)

構建框架 場景,渲染。負責載入和渲染,它將可以新增到指定的 場景 中,當 場景 被 場景管理類 呼叫時,它將每一幀都被呼叫和更新。pragma once include include using namespace std class renderable virtual renderable i...