找回密码
 加入
搜索
楼主: heavenm

[AU3基础] 还是图片取色的问题,有句代码看不懂是啥意思

[复制链接]
发表于 2020-7-2 19:55:47 | 显示全部楼层
haijie1223 发表于 2020-7-2 19:30
哦哦,忘了api里面可以指定颜色格式了。
另外,我觉得获取数据那里,应该是      Stride* Height  ,Wid ...

是的,看使用场景,以前测试过,似乎各有利弊,具体忘了
发表于 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


发表于 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
发表于 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,我这样理解对吗?


发表于 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读取。是这样吗?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-13 16:02 , Processed in 0.078078 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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