我有一個軟體是用來給大影像分塊的,大致上是這個樣子

現在呢遇到個問題就是,比如我要取上圖中紅框的第一塊的資料,這個通過一個已經封裝好的dll的介面取到了,不過呢當時為了后續其他演算法,他的介面是這么設計的
BYTE* StretchData(RECT rt);
也就是說這塊區域取出來呢是已經給你拉伸完的灰度值,本來倒也沒什么,但是后來加了個需求,需要把這塊記憶體圖片形式輸出來,于是我new了快記憶體將BYTE重新拉伸,大致是這樣。
int* pucBuffer = new int[lBufferSize];
for (long long i = 0; i < lBufferSize; i ++ )
{
pucBuffer[i] = RGB(bVal[i],bVal[i],bVal[i]);
}
結果出來了個這鳥玩意

很明顯兩個問題,一個是我拉伸的不對,第二個是圖片倒了,猜想bmp的存盤方式起始點與他BYTE*記憶體的方式不一致,他的事從左上角開始的,而bmp看來是右下

在這里求一段能將這樣的BYTE陣列存成bmp的代碼。
uj5u.com熱心網友回復:
糾正下,看圖片來說bmp像是左下。uj5u.com熱心網友回復:
在DIB中 本來底部就是第一行uj5u.com熱心網友回復:
http://blog.csdn.net/why_up/article/details/12625389保存bmp用的這段代碼
uj5u.com熱心網友回復:
仁兄意思是要我自己實作水平翻轉?但是第一個拉伸的問題沒解決啊
uj5u.com熱心網友回復:
bi.biBitCount = 32;另外 8位及以下的位圖 還有調色板
uj5u.com熱心網友回復:
你好,可以加下你的微信嗎或者qq,程式員想轉微信了,希望前輩給點建議uj5u.com熱心網友回復:
bmp資料是是又低行向頂行順序排列的uj5u.com熱心網友回復:
bmp資料每行位元組數是4的倍數。uj5u.com熱心網友回復:
有沒有 BYTE* StretchData(RECT rt); 代碼 ?uj5u.com熱心網友回復:
bmp在記憶體中是從右邊底部往上面排列的uj5u.com熱心網友回復:
void SaveBitmap(DWORD height, DWORD width, char* pdata){
BITMAPFILEHEADER bmfHeader = {0};
BITMAPINFOHEADER bi = {0};
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bmpScreen.bmWidth;
bi.biHeight = bmpScreen.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
DWORD dwBmpSize = ((width * bi.biBitCount + 31) / 32) * 4 * height;
// Add the size of the headers to the size of the bitmap to get the total file size
DWORD dwSizeofDIB = dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
//Offset to where the actual bitmap bits start.
bmfHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
//Size of the file
bmfHeader.bfSize = dwSizeofDIB;
//bfType must always be BM for Bitmaps
bmfHeader.bfType = 0x4D42; //BM
HANDLE hFile = CreateFile(L"test.bmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwBytesWritten = 0;
WriteFile(hFile, (LPSTR)&bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);
WriteFile(hFile, (LPSTR)pdata, dwBmpSize, &dwBytesWritten, NULL);
CloseHandle(hFile);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/65466.html
標籤:基礎類
