本帖最后由 斗战胜猴 于 2025-5-23 23:47 编辑
关于 类_位图操作 取出位图数据 取指定位深度
标准的位图文件头
无需多次转换 位深度: 1, 4, 8, 16, 24, 32
调色板和 api调用请自行更改 还有取指针
变量名 | 类 型 | 静态 | 数组 | 备 注 | BITMAPINFO | BITMAPINFO | | | 位图像素点阵 | 字节集 | | | 位图信息字节集 | 字节集 | | | 位图文件头 | BITMAPFILEHEADER | | | 位图文件头字节集 | 字节集 | | | 位图调色板 | 字节集 | | | 场景句柄1 | 整数型 | | | 位图句柄1 | 整数型 | | | 旧位图句柄1 | 整数型 | | | 位图数据1 | 字节集 | | | 位图指针1 | 整数型 | | |
BITMAPINFO.biSize = 40 GetDIBits_BITMAPINFO (场景句柄, 位图句柄, 0, 0, { }, BITMAPINFO, 0 )新的位图深度 = 选择 (新的位图深度 ≠ 1 且 新的位图深度 ≠ 4 且 新的位图深度 ≠ 8 且 新的位图深度 ≠ 16 且 新的位图深度 ≠ 24 且 新的位图深度 ≠ 32, 0, 新的位图深度 ) 如果 (新的位图深度 > 0 且 BITMAPINFO.biBitCount ≠ 新的位图深度 ) BITMAPINFO.biBitCount = 新的位图深度  BITMAPINFO.biSizeImage = 左移 (右移 (BITMAPINFO.biWidth × BITMAPINFO.biBitCount + 31, 5 ), 2 ) × BITMAPINFO.biHeight  判断 (BITMAPINFO.biBitCount = 1 )  位图调色板 = 生成调色板1位图 ()  BITMAPINFO.biClrUsed = 2   BITMAPINFO.biClrImportant = 2  判断 (BITMAPINFO.biBitCount = 4 )  位图调色板 = 生成调色板4位图 ()  BITMAPINFO.biClrUsed = 16   BITMAPINFO.biClrImportant = 16  判断 (BITMAPINFO.biBitCount = 8 )  位图调色板 = 生成调色板8位图 ()  BITMAPINFO.biClrUsed = 256   BITMAPINFO.biClrImportant = 256  判断 (BITMAPINFO.biBitCount = 16 )  BITMAPINFO.biClrUsed = 0   BITMAPINFO.biClrImportant = 0  判断 (BITMAPINFO.biBitCount = 24 )  BITMAPINFO.biClrUsed = 0   BITMAPINFO.biClrImportant = 0  判断 (BITMAPINFO.biBitCount = 32 )  BITMAPINFO.biClrUsed = 0   BITMAPINFO.biClrImportant = 0        判断 (BITMAPINFO.biBitCount = 1 )  位图调色板 = 生成调色板1位图 () 判断 (BITMAPINFO.biBitCount = 4 )  位图调色板 = 生成调色板4位图 () 判断 (BITMAPINFO.biBitCount = 8 )  位图调色板 = 生成调色板8位图 ()     BITMAPINFO.biCompression = 0BITMAPINFO.biXPelsPerMeter = 3780 BITMAPINFO.biYPelsPerMeter = 3780 BITMAPINFO.biPlanes = 1 位图信息字节集 = 取空白字节集 (BITMAPINFO.biSize )RtlMoveMemory_BITMAPINFO (位图信息字节集, BITMAPINFO, BITMAPINFO.biSize )位图文件头.bfType = 19778 位图文件头.bfOffBits = 14 + BITMAPINFO.biSize + BITMAPINFO.biClrUsed × 4 位图文件头.bfSize = 位图文件头.bfOffBits + BITMAPINFO.biSizeImage 位图文件头.bfReserved1 = 0 位图文件头.bfReserved2 = 0 位图文件头字节集 = 取空白字节集 (14 )RtlMoveMemory_BITMAPFILEHEADER (位图文件头字节集, 位图文件头, 14 ) 如果 (新的位图深度 > 0 ) 位图像素点阵 = 取空白字节集 (BITMAPINFO.biSizeImage ) 位图数据1 = 位图信息字节集 + 位图调色板 + 位图像素点阵 调用子程序_通用型 (GetProcAddress_汇编 (GetModuleHandleA_汇编 (“gdi32.dll”), “CreateCompatibleDC”), , 场景句柄1, 0 ) 调用子程序_通用型 (GetProcAddress_汇编 (GetModuleHandleA_汇编 (“gdi32.dll”), “CreateDIBSection”), , 位图句柄1, 0, PtrBin (位图数据1 ), 0, PtrInt (位图指针1 ), 0, 0 ) 调用子程序_通用型 (GetProcAddress_汇编 (GetModuleHandleA_汇编 (“gdi32.dll”), “SelectObject”), , 旧位图句柄1, 场景句柄1, 位图句柄1 ) 调用子程序_通用型 (GetProcAddress_汇编 (GetModuleHandleA_汇编 (“gdi32.dll”), “BitBlt”), , , 场景句柄1, 0, 0, BITMAPINFO.biWidth, BITMAPINFO.biHeight, 场景句柄, 0, 0, 13369376 ) 调用子程序_通用型 (GetProcAddress_汇编 (GetModuleHandleA_汇编 (“gdi32.dll”), “GdiFlush”), , ) 位图像素点阵 = 指针到字节集 (位图指针1, BITMAPINFO.biSizeImage ) 调用子程序_通用型 (GetProcAddress_汇编 (GetModuleHandleA_汇编 (“gdi32.dll”), “SelectObject”), , , 场景句柄1, 旧位图句柄1 ) 调用子程序_通用型 (GetProcAddress_汇编 (GetModuleHandleA_汇编 (“gdi32.dll”), “DeleteObject”), , , 位图句柄1 ) 调用子程序_通用型 (GetProcAddress_汇编 (GetModuleHandleA_汇编 (“gdi32.dll”), “DeleteDC”), , , 场景句柄1 ) 位图像素点阵 = 指针到字节集 (位图指针, BITMAPINFO.biSizeImage ) 返回 (位图文件头字节集 + 位图信息字节集 + 位图调色板 + 位图像素点阵)|
BITMAPINFO | | |
biSize | 整数型 | | | biWidth | 整数型 | | | biHeight | 整数型 | | | biPlanes | 短整数型 | | | biBitCount | 短整数型 | | | biCompression | 整数型 | | | biSizeImage | 整数型 | | | biXPelsPerMeter | 整数型 | | | biYPelsPerMeter | 整数型 | | | biClrUsed | 整数型 | | | biClrImportant | 整数型 | | |
|
BITMAPFILEHEADER | | |
bfType | 短整数型 | | | bfSize | 整数型 | | | bfReserved1 | 短整数型 | | | bfReserved2 | 短整数型 | | | bfOffBits | 整数型 | | |
|
RtlMoveMemory_BITMAPINFO | 整数型 | | |
kernel32.dll | |
RtlMoveMemory | |
Destination | 字节集 | | | Source | BITMAPINFO | | | Length | 整数型 | | |
|
RtlMoveMemory_BITMAPFILEHEADER | 整数型 | | |
kernel32.dll | |
RtlMoveMemory | |
Destination | 字节集 | | | Source | BITMAPFILEHEADER | | | Length | 整数型 | | |
|
GetDIBits_BITMAPINFO | 整数型 | | |
gdi32.dll | |
GetDIBits | |
设备场景句柄 | 整数型 | | | 源位图句柄 | 整数型 | | | 扫描线初始编号 | 整数型 | | | 扫描线数量 | 整数型 | | | 缓冲区指针 | 字节集 | | | 位图结构 | BITMAPINFO | | | 常量标志 | 整数型 | | |
|