24位位图在去掉信息头后,剩下的部分就是所需的像素数据。需要注意的是,这些像素数据是以BGR格式排列的,并且数据存储顺序是从位图的左下角开始,向右、向上读取。此外,24位位图没有透明通道。
from PIL import Image
def convert_bmp_to_rgba(input_file, output_file):
# 打开24位BMP图像
with Image.open(input_file) as img:
# 确保图像为24位
if img.mode != 'RGB':
raise ValueError("输入图像不是24位RGB格式")
# 转换为RGBA模式,添加透明通道
img = img.convert('RGBA')
# 处理像素数据
data = img.getdata()
# 创建新的像素数据,添加透明通道
new_data = []
for r, g, b in data:
new_data.append((r, g, b, 0)) # 将透明度设置为0
# 更新图像数据
img.putdata(new_data)
# 保存为32位BMP图像
img.save(output_file, format='BMP')
# 使用示例
convert_bmp_to_rgba('input.bmp', 'output.bmp')
BYTE* GetImageData(CBitmap* cBitmap)
{
BITMAP bmp;
cBitmap->GetBitmap(&bmp);
HBITMAP hbm = (HBITMAP)*cBitmap;
HDC hDC = ::GetDC(NULL);
LONG width = bmp.bmWidth * 4;
LONG height = bmp.bmHeight;
//定义位图信息
BITMAPINFO bi;
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biWidth = bmp.bmWidth;
bi.bmiHeader.biHeight = bmp.bmHeight;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biSizeImage = width * height;
bi.bmiHeader.biClrUsed = 0;
bi.bmiHeader.biImportant = 0;
//获取位图数据
BYTE* lpvBits = new BYTE[width * height];
::ZeroMemory(lpvBits, width * height);
::GetDC(NULL);
::GetDIBits(hDC, hbm, 0, height, lpvBits, &bi, DIB_RGB_COLORS);
BYTE buffer = 0;
BYTE* pData=new BYTE[width * height];
int temp = 0;
for(int i= height - 1;i >= 0; --i)
{
for(int j=0;j < width; ++j)
{
if(j % 4 == 0)
{
BYTE tempBR = 0;
tempBR = lpvBits[width * i + j];//b赋给temp
lpvBits[width * i + j] = lpvBits[width * i + j + 2];//r赋给b
lpvBits[width * i + j + 2] = tempBR;//temp赋给r
}
if(j % 4 == 3)//透明通道
{
if(lpvBits[width * i + j - 3] == 255 && lpvBits[width * i + j - 2] == 255 && lpvBits[width * i + j - 1] == 255)
{
lpvBits[width * i + j] == 0;
}
else
{
lpvBits[width * i + j] == 255;
}
}
buffer = lpvBits[width * i + j];
memcpy(&pData[temp++], &buffer, 1);
}
}
if(lpvBits != 0)
{
delete lpvBits;
lpvBits = 0;
}
::ReleaseDC(NULL, hDC);
DeleteObject(cBitmap);
return pData;
}