精易论坛

标题: 关于 类_位图操作 取出位图数据 取指定位深度 [打印本页]

作者: 斗战胜猴    时间: 2025-5-23 13:11
标题: 关于 类_位图操作 取出位图数据 取指定位深度
本帖最后由 斗战胜猴 于 2025-5-23 23:47 编辑

关于 类_位图操作  取出位图数据 取指定位深度
标准的位图文件头
无需多次转换  位深度:  1, 4, 8, 16, 24, 32
调色板和 api调用请自行更改 还有取指针

  
子程序名返回值类型公开备 注
取出位图数据字节集 BMP位图 文件头+信息头+调色板+颜色数据
参数名类 型参考可空数组备 注
新的位图深度整数型位深度:  1, 4, 8, 16, 24, 32
变量名类 型静态数组备 注
BITMAPINFOBITMAPINFO 
位图像素点阵字节集 
位图信息字节集字节集 
位图文件头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 = 0
BITMAPINFO.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)
' GetDIBits_BITMAPINFO (场景句柄1, 位图句柄1, 0, BITMAPINFO.biHeight, 位图像素点阵, BITMAPINFO, BITMAPINFO.biClrUsed)
调用子程序_通用型 (GetProcAddress_汇编 (GetModuleHandleA_汇编 (“gdi32.dll”), “SelectObject”), , , 场景句柄1, 旧位图句柄1)
调用子程序_通用型 (GetProcAddress_汇编 (GetModuleHandleA_汇编 (“gdi32.dll”), “DeleteObject”), , , 位图句柄1)
调用子程序_通用型 (GetProcAddress_汇编 (GetModuleHandleA_汇编 (“gdi32.dll”), “DeleteDC”), , , 场景句柄1)
位图像素点阵 = 指针到字节集 (位图指针, BITMAPINFO.biSizeImage)
' GetDIBits_BITMAPINFO (场景句柄, 位图句柄, 0, BITMAPINFO.biHeight, 位图像素点阵, BITMAPINFO, BITMAPINFO.biClrUsed)
返回 (位图文件头字节集 + 位图信息字节集 + 位图调色板 + 位图像素点阵)
数据类型名公开备 注
BITMAPINFO 位图结构信息头 BITMAPINFO
成员名类 型传址数组备 注
biSize整数型 biSize 结构大小 40
biWidth整数型 biWidth 位图宽度
biHeight整数型 biHeight 位图高度
biPlanes短整数型 biPlanes 位图标志
biBitCount短整数型 biBitCount 位深度
biCompression整数型 biCompression 压缩率
biSizeImage整数型 biSizeImage 位图字节数
biXPelsPerMeter整数型 biXPelsPerMeter 水平折像度
biYPelsPerMeter整数型 biYPelsPerMeter 垂直折像度
biClrUsed整数型 biClrUsed 位图颜色表索引
biClrImportant整数型 biClrImportant 位图显示索引
数据类型名公开备 注
BITMAPFILEHEADER 位图文件头
成员名类 型传址数组备 注
bfType短整数型  
bfSize整数型  
bfReserved1短整数型  
bfReserved2短整数型  
bfOffBits整数型  

DLL命令名返回值类型公开备 注
RtlMoveMemory_BITMAPINFO整数型 位图信息字节集
DLL库文件名:
kernel32.dll
在DLL库中对应命令名:
RtlMoveMemory
参数名类 型传址数组备 注
Destination字节集
SourceBITMAPINFO
Length整数型
DLL命令名返回值类型公开备 注
RtlMoveMemory_BITMAPFILEHEADER整数型 位图文件头字节集
DLL库文件名:
kernel32.dll
在DLL库中对应命令名:
RtlMoveMemory
参数名类 型传址数组备 注
Destination字节集
SourceBITMAPFILEHEADER
Length整数型
DLL命令名返回值类型公开备 注
GetDIBits_BITMAPINFO整数型 gdi32.dll将来自一幅位图的二进制位复制到一幅与设备无关的位图里  非零表示成功,零表示失败。在Windows 95中,返回值是返回的扫描线数量
DLL库文件名:
gdi32.dll
在DLL库中对应命令名:
GetDIBits
参数名类 型传址数组备 注
设备场景句柄整数型aHDC,定义了与设备有关位图hBitmap的配置信息的一个设备场景的句柄
源位图句柄整数型hBitmap,源位图的句柄。绝对不能将这幅位图选入设备场景
扫描线初始编号整数型nStartScan,欲复制到DIB中的第一条扫描线的编号
扫描线数量整数型nNumScans,欲复制的扫描线数量
缓冲区指针字节集lpBits,指向一个缓冲区的指针。这个缓冲区将用于装载采用DIB格式的信息,但不取回数据(用ByVal传递零值)
位图结构BITMAPINFOlpBI,BITMAPINFO,对lpBits DIB的格式及颜色进行说明的一个结构。在BITMAPINFOHEADER结构中,从biSize到biCompression之间的所有字段都必须初始化
常量标志整数型wUsage,下述常数之一:;DIB_PAL_COLORS:在颜色表中装载一个16位所以数组,它们与当前选定的调色板有关;DIB_RGB_COLORS:在颜色表中装载RGB颜色;



截图32位20250523011105.png (15.25 KB, 下载次数: 0)

截图32位20250523011105.png

截图32位20250523011122.png (52.27 KB, 下载次数: 0)

截图32位20250523011122.png

作者: 初心白丶    时间: 2025-5-23 14:59
感谢分享
作者: 白云飘飘    时间: 2025-5-23 16:55
感谢分享
作者: xiangkun586    时间: 2025-5-23 17:26
感谢分享
作者: pipicool    时间: 2025-5-23 20:09
学习一下
作者: 1184798949    时间: 2025-5-23 20:43
感谢分享
作者: 豆豆灰常开心    时间: 2025-5-24 07:12
感谢您对论坛的支持!
作者: 查过    时间: 2025-5-24 07:17
感谢楼主分享!
作者: renhe2018    时间: 2025-5-24 07:26
功能好强大,支持一下
作者: shengli666    时间: 2025-5-24 07:33
        给人援助,手有余香。
作者: 一指温柔    时间: 2025-5-24 10:46
感谢分享,很给力!~
作者: q35588    时间: 2025-5-24 16:04
感谢分享,很给力!~
作者: year1970    时间: 2025-5-24 21:46
感谢分享
作者: 神奇的哆啦A梦    时间: 2025-5-24 23:11
功德+1    大米饭+3碗
作者: 豆豆灰常开心    时间: 2025-5-25 07:08
感谢楼主分享!
作者: 查过    时间: 2025-5-25 07:13
全都是大佬~
作者: please    时间: 2025-5-26 09:38
感谢分享,支持开源!!!




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4