afan
发表于 2020-7-2 19:55:47
haijie1223 发表于 2020-7-2 19:30
哦哦,忘了api里面可以指定颜色格式了。
另外,我觉得获取数据那里,应该是 Stride* Height,Wid ...
是的,看使用场景,以前测试过,似乎各有利弊,具体忘了
haijie1223
发表于 2020-7-2 20:03:32
afan 发表于 2020-7-2 19:55
是的,看使用场景,以前测试过,似乎各有利弊,具体忘了
嗯嗯,晓得了,多谢a版解答。
水木子
发表于 2020-7-2 22:54:04
本帖最后由 水木子 于 2020-7-2 22:57 编辑
afan 发表于 2020-7-2 18:21
因为前面就是使用的 $GDIP_PXF32ARGB,如果是24位RGB那就 * 3 吧
按前辈您说的方法,我写了个测试代码,发现还是有问题。获取到的图片像素数据,不是多了,就是少了。不知问题出在何处呢?图片尺寸越大,错误越明显。
#include <Array.au3>
#include <GDIPlus.au3>
_GDIPlus_Startup()
Local $hTimer = TimerInit()
$sBMPData = BitmapGetPixel('图像1.Bmp')
MsgBox(0, TimerDiff($hTimer), $sBMPData)
_GDIPlus_Shutdown()
Func BitmapGetPixel($sFileName)
Local $hImage = _GDIPlus_ImageLoadFromFile($sFileName)
If @error Then
_GDIPlus_Shutdown()
Return False
EndIf
Local $iW = _GDIPlus_ImageGetWidth($hImage)
Local $iH = _GDIPlus_ImageGetHeight($hImage)
Local $tBitmapData = _GDIPlus_BitmapLockBits($hImage, 0, 0, $iW, $iH, $GDIP_ILMREAD, $GDIP_PXF32RGB)
;~ Local $iStride = DllStructGetData($tBitmapData, 'Stride')
Local $Scan0 = DllStructGetData($tBitmapData, 'Scan0')
Local $tPixelData = DllStructCreate('byte[' & $iW * $iH * 4 & ']', $Scan0)
Local $sBmpData = StringTrimLeft(DllStructGetData($tPixelData, 1), 2)
_GDIPlus_BitmapUnlockBits($hImage, $tBitmapData)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
Return $sBmpData
EndFunc ;==>BitmapGetPixel
afan
发表于 2020-7-3 11:57:44
水木子 发表于 2020-7-2 22:54
按前辈您说的方法,我写了个测试代码,发现还是有问题。获取到的图片像素数据,不是多了,就是少了。不知 ...
$GDIP_PXF32RGB 是不是掉了A啊 $GDIP_PXF32ARGB
水木子
发表于 2020-7-3 13:07:49
afan 发表于 2020-7-3 11:57
$GDIP_PXF32RGB 是不是掉了A啊 $GDIP_PXF32ARGB
不是很明白,这个地方必须得用 $GDIP_PXF32ARGB吗?
如果用$GDIP_PXF32RGB不行吗?或者$GDIP_PXF24RGB
afan
发表于 2020-7-3 13:10:22
水木子 发表于 2020-7-3 13:07
不是很明白,这个地方必须得用 $GDIP_PXF32ARGB吗?
如果用$GDIP_PXF32RGB不行吗?或者$GDIP_PXF24RGB
没有A就少了相关数据*4 就得 *3 了
水木子
发表于 2020-7-3 13:17:13
afan 发表于 2020-7-3 13:10
没有A就少了相关数据*4 就得 *3 了
哦!好的,明白了,也就是说带A的,有透明值,是由8个字符组成,所以*4
不带A的是由6个字符组成,所以*3,我这样理解对吗?
afan
发表于 2020-7-3 13:18:56
本帖最后由 afan 于 2020-7-3 13:22 编辑
水木子 发表于 2020-7-3 13:17
哦!好的,明白了,也就是说带A的,有透明值,是由8个字符组成,所以*4
不带A的是由6个字符组成,所以*3 ...
是的~
比如 ARGB 数据格式 为 0xFF123456
那么 RGB 就只有 0x123456,少了一个字节的数据,但是你取值却是按4的倍数取的,自然就错位了。
有兴趣的话你将这些像素按数据着色显示出来比对,就会发现完全不同那就肯定错了~
水木子
发表于 2020-7-3 13:26:06
本帖最后由 水木子 于 2020-7-3 13:28 编辑
afan 发表于 2020-7-3 13:18
是的~
比如 ARGB 数据格式 为 0xFF123456
那么 RGB 就只有 0x123456,少了一个字节的数据,但是你取值 ...
哦!好的,明白了。
那么_GDIPlus_BitmapLockBits 这个函数对图片文件本身的$iFormat并没有什么特殊要求是吗?无论什么格式的图片都能按指定$iFormat读取。是这样吗?