请教关于_GDIPlus_BitmapLockBits和stride
本帖最后由 ScriptFans 于 2016-4-9 00:25 编辑以上图片大小为7×14
首先,据我所知用_GDIPlus_BitmapLockBits得到的图片信息"stride"意为图片每行像素的字节数(不知正确否?)
那么,下面代码按理来说得到的"stride"应该是21(7×3,因为代码中用的是$GDIP_PXF24RGB格式,1个像素占用3个字节)
而运行结果得到的"stride"为24,多了3个字节,不知何故?
又,如果把$GDIP_PXF24RGB格式换为$GDIP_PXF32RGB 格式的话,得到的"stride"为正确的28(7×4,因为$GDIP_PXF32RGB 格式是1个像素占用4个字节)
请熟悉这方面知识的仁兄不吝赐教!!感谢!!
#include <GDIPlus.au3>
Local $hBitmap,$iWidth,$iHeight,$tBitmapData,$iStride
_GDIPlus_Startup()
$hBitmap= _GDIPlus_BitmapCreateFromFile("0.jpg")
$iWidth=_GDIPlus_ImageGetWidth($hBitmap)
$iHeight=_GDIPlus_ImageGetHeight($hBitmap)
$tBitmapData = _GDIPlus_BitmapLockBits($hBitmap,0,0,$iWidth,$iHeight,$GDIP_ILMREAD, $GDIP_PXF24RGB)
$iStride = DllStructGetData($tBitmapData,"stride")
MsgBox(0,"","stride:"&$iStride&@CRLF&"width:"&$iWidth)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown() 图片呢?发上来 stride是4字节对齐的,计算方法应该是:
$GDIP_PXF24RGB格式:7*24/8=21,由于21不是4的整数倍,所以 stride=21+(4-(21 mod 4))=24
$GDIP_PXF32RGB格式:7*32/8=28,是4的整数倍,所以stride=28 就该就和硬盘的簇一个道理吧,如果簇大小是4K,那么小于4k的文件占用空间都是4K;5、6、7、8k占用空间都是8K。 回复 4# haijie1223
非常非常好,感谢感谢!(图片就是那个"0")
这让我想起了DllStructCreate里面的"align",兄弟可否顺便给解释下"align"的作用:
帮助文档中有:
DllStructCreate("byte;double") ; structure is 16 bytes, the "double" is at offset 8
DllStructCreate("align 4;byte;double") ; structure is 12 bytes, the "double" is at offset 4
是否意为:每个元素都按照align指定的数量分配字节数,如上面的double就被限定为4个字节。又,按其描述,align 4本身是否也占用4个字节? 自己再顶一下! 还有人能解答吗,期待{:face (280):}
页:
[1]