matlab 将24位图转换为8位图,实现1位,4位,8位,24位BMP位图的互相转换的方法

这段代码展示了如何在MATLAB环境中将24位位图转换为8位位图,同时提供了1位、4位、8位及24位BMP位图之间的转换方法。通过使用C++的函数`SaveTrueBmp`和`ChangeToTrueBmp`,实现了从位图文件加载、处理调色板、获取DIB位图数据并最终保存为不同位深BMP文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BOOL SaveTrueBmp(HBITMAP hBitmap, CString FileName)

{

//设备描述表

HDC hDC;

//真彩色位图中每象素所占字节数为24

WORD wBitCount=24;

//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数

DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0,

dwWritten=0;

//位图属性结构

BITMAP Bitmap; //位图文件头结构

BITMAPFILEHEADER bmfHdr; //位图信息头结构

BITMAPINFOHEADER bi; //指向位图信息头结构 LPBITMAPINFOHEADER lpbi; //定义文件,分配内存句柄,调色板句柄

HANDLE fh, hDib, hPal,hOldPal=NULL;

GetObject(hBitmap, sizeof(Bitmap),

(LPSTR)&Bitmap);

bi.biSize = sizeof(BITMAPINFOHEADER);

bi.biWidth = Bitmap.bmWidth;

bi.biHeight = Bitmap.bmHeight;

bi.biPlanes = 1;

bi.biBitCount = wBitCount;

bi.biCompression = BI_RGB;

bi.biSizeImage = 0;

bi.biXPelsPerMeter = 0;

bi.biYPelsPerMeter = 0;

bi.biClrImportant = 0;

bi.biClrUsed = 0;

dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 *

Bitmap.bmHeight;

//为位图内容分配内存

hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize +

sizeof(BITMAPINFOHEADER));

lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);

*lpbi = bi;

// 处理调色板 hPal = GetStockObject(DEFAULT_PALETTE);

if (hPal)

{

hDC = ::GetDC(NULL);

hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);

RealizePalette(hDC);

}

// 获取该调色板下新的像素值

GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi +

sizeof(BITMAPINFOHEADER)

+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);

//恢复调色板 if (hOldPal)

{

::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);

RealizePalette(hDC);

::ReleaseDC(NULL, hDC);

}

//创建位图文件 fh = CreateFile(FileName, GENERIC_WRITE,0, NULL,

CREATE_ALWAYS,

FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if (fh == INVALID_HANDLE_VALUE) return

FALSE;

// 设置位图文件头

bmfHdr.bfType = 0x4D42; // "BM"

dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +

dwPaletteSize + dwBmBitsSize; bmfHdr.bfSize = dwDIBSize;

bmfHdr.bfReserved1 = 0;

bmfHdr.bfReserved2 = 0;

bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) +

(DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;

// 写入位图文件头

WriteFile(fh, (LPSTR)&bmfHdr,

sizeof(BITMAPFILEHEADER), &dwWritten, NULL);

// 写入位图文件其余内容

WriteFile(fh, (LPSTR)lpbi, dwDIBSize,

&dwWritten, NULL);

//清除 GlobalUnlock(hDib);

GlobalFree(hDib);

CloseHandle(fh);

return TRUE;

}

BOOL ChangeToTrueBmp(CString FileName)

{

HBITMAP

hImage=(HBITMAP)LoadImage(NULL,FileName,IMAGE_BITMAP,0,0,

LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_DEFAULTSIZE);

return SaveTrueBmp(hImage,FileName);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值