【实战】将24位BMP图像转换为32位(含透明通道)的像素数据

文摘   社会   2024-10-29 00:08   广西  

24位位图在去掉信息头后,剩下的部分就是所需的像素数据。需要注意的是,这些像素数据是以BGR格式排列的,并且数据存储顺序是从位图的左下角开始,向右、向上读取。此外,24位位图没有透明通道。

我需要将这些数据转换为RGB格式,并且从上到下进行读取。此外,我还希望能够显示透明色,这意味着需要将24位位图转换为32位位图,即在读取数据时增加一个透明通道(设置为0表示透明)。
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;}

暮色的狐
这是一只高强度上网冲浪、高质量输出内容的狐狸。主打ACGN杂谈、技术干货分享、第九艺术鉴赏、网梗百科解析、情感树洞鸡汤、正能量价值观~
 最新文章