找回密码
 加入
搜索
查看: 2980|回复: 6

[图形处理] 请教关于_GDIPlus_BitmapLockBits和stride

[复制链接]
发表于 2016-4-9 00:23:39 | 显示全部楼层 |阅读模式
本帖最后由 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()

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-4-9 10:10:46 | 显示全部楼层
图片呢?发上来
发表于 2016-4-9 10:39:30 | 显示全部楼层
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
发表于 2016-4-9 10:41:36 | 显示全部楼层
就该就和硬盘的簇一个道理吧,如果簇大小是4K,那么小于4k的文件占用空间都是4K;5、6、7、8k占用空间都是8K。
 楼主| 发表于 2016-4-9 13:29:18 | 显示全部楼层
回复 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个字节?
 楼主| 发表于 2016-4-11 15:45:52 | 显示全部楼层
自己再顶一下!
 楼主| 发表于 2016-7-13 16:19:15 | 显示全部楼层
还有人能解答吗,期待
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-5 10:46 , Processed in 0.077876 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表