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

[图形处理] 为什么函数PixelGetColor跟_ScreenCapture_Capture中的参数坐标不一致

 火... [复制链接]
发表于 2013-1-3 03:05:25 | 显示全部楼层
回复 30# arjken
那要看你会不会折腾了,设置色深用gdi++调节就行了吧,具体怎么做不清楚,但是知道原理的话,调用就完了,模拟精灵应该也不过是把api的东西为了操作简单封装一下罢了
东西好坏是相比较来看的,方便和灵活性看个人取舍
发表于 2013-1-3 07:13:16 | 显示全部楼层
把回复从头到尾看了一遍,佩服蛋蛋,这么晚了还不睡,难道老男孩真的是精力旺盛
我看楼主搞错了一个问题,你5#的代码:
    #include <ScreenCapture.au3>
Local $cl
_ScreenCapture_Capture("test.jpg",100,100,200,200)
$cl=PixelGetColor(100,100)
MsgBox(0,"像素颜色",$cl)

其中PixelGetColor没有指定句柄,$cl的颜色值是屏幕的颜色值,和test.jpg一点关系都没有啊。
再有就是你加上句柄之后,获取到的是jpg和bmp肯定是有差距的。bmp是位图,没有压缩的,jpg是有损压缩,像素肯定会丢失。
以上纯属个人理解,如有错误,请指正。
发表于 2013-1-3 08:16:41 | 显示全部楼层
回复 32# haijie1223


    其实它就是要获取屏幕的颜色,问题就是出在格式上,它还想当然的以为是一样的
发表于 2013-1-3 19:15:51 | 显示全部楼层
本帖最后由 netegg 于 2013-1-3 19:22 编辑

回复 33# annybaby
不是格式的事,应该是坐标错了,lz抓(100,100)的屏幕点,到图像test.***是(0,0)
screencapture的参数,是$x,$y,$w,$h,如果直接用pixelgetcolor,默认是屏幕左上角,根本不在图像上
图像格式并不会改变颜色值,只是改变了显示模式,渲染模式等等而已
发表于 2013-1-3 19:35:17 | 显示全部楼层
回复 34# netegg

呵呵,其实楼主的坐标没有错,是你理解错了
请看楼主5楼的代码,或者上面32楼的

    #include <ScreenCapture.au3>
Local $cl
_ScreenCapture_Capture("test.jpg",100,100,200,200)
$cl=PixelGetColor(100,100)
MsgBox(0,"像素颜色",$cl)

   
注意它的两个函数的坐标,第一个截屏函数的起点坐标是100,100,下面的屏幕取色也是100,100,这里你已经可以猜到了,不是坐标的问题,然后再看楼主9楼的帖子

回复  arjken

我就是问你哪里看了像素不一样了
annybaby 发表于 2013-1-2 13:36



    像素(100,100)跟test.jpg的第一个像素


可以看出,它们的确是同一个坐标的位置,这一点楼主没有理解错,它只是想当然地以为所有格式的图像是一样的,换成BMP位置即可,JPG是有损压缩,像素已经被均化了~~
发表于 2013-1-3 19:44:15 | 显示全部楼层
本帖最后由 netegg 于 2013-1-3 19:47 编辑

回复 35# annybaby
不对吧,_screencapure_*从(100,100)截屏保存到jpg中
下面pixelgetcolor(100,100)默认是屏幕坐标
上面说了,bmp和jpg对同一图像只有渲染方式的差别(插值压缩等等),颜色值是不会变的,如果颜色值可变的话,jpg和bmp如何互转,所有的图像格式转换都将是不可逆
发表于 2013-1-3 19:46:48 | 显示全部楼层
回复 36# netegg

是的,你这两个说法都是对的,哪里不对了??
发表于 2013-1-3 19:52:09 | 显示全部楼层
本帖最后由 annybaby 于 2013-1-3 19:55 编辑

回复 36# netegg

呵呵~~其实这问题真的不用怎么争论:用_ScreenCapture_Capture分别截张jpg和BMP格式的图像出来,用工具一查看就知道了

  另外,BMP是将图像原样保存,没有任何插值压缩~~
两种图像格式可以互转,但不表示它们不会有信息丢失~~
BMP转到JPG后,就再也回不去原来的BMP了

其实A大倒是看问题很清楚,就是楼主从来没有描述,它是如果确定_ScreenCapture_Capture截图出来的第一个像素的颜色值,我估计问题99%的可能性就在这里
发表于 2013-1-3 20:02:54 | 显示全部楼层
netegg 说:
回复 annybaby 先搞清楚一点_ScreenCapture_Capture("test.jpg"是截取jpg的像素,和屏幕没关系


真让人不敢相信`~~
你如此说,我只能表示遗憾~~
 楼主| 发表于 2013-1-4 19:45:44 | 显示全部楼层
回复 36# netegg


    大哥你是对的,pixelgetcolor只抓屏幕上的坐标位置,但是我用了图像句柄后也是抓屏幕上的位置啊。这函数好像只抓屏幕上的坐标,设置了PixelCoordMode参数也是一样。怎么样才能抓抠下来的图像上面的像素?
 楼主| 发表于 2013-1-4 20:10:42 | 显示全部楼层
本帖最后由 arjken 于 2013-1-4 20:26 编辑

回复 32# haijie1223


    指定句柄对PixelGetColor无效,$cl的颜色值跟test.jpg的第一个像素不是同一个像素,无法确定位置是难点。在模拟精灵中可以用IMG:GETPOS简单地实现,到AUTOIT不会用了。
发表于 2013-1-4 20:49:17 | 显示全部楼层
回复 41# arjken
_screencapture_capture的备注如果文件名不为空, 函数将捕捉屏幕并保存到文件. 反之, 函数将捕捉屏幕并返回一个指向位图图像的HBITMAP句柄. 这样的话, 当位图完成时必须调用_WinAPI_DeleteObject删除位图句柄.
发表于 2013-1-4 21:55:53 | 显示全部楼层
My god, This argument has been for several days. However, it does not hold water! see follow example!


#include <GDIPlus.au3>

_GDIPlus_Startup()

; Create a bitmap
$hBitmap = DllCall($ghGDIPDll,"uint","GdipCreateBitmapFromScan0","int",100,"int",100,"int",0,"int",$GDIP_PXF32ARGB,"ptr",0,"int*",0)
$hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap[6])
; Set pixels color 0xFCFF0000
_GDIPlus_GraphicsClear($hContext,0xFCFF0000)

; In this phase the color is 0xFCFE0000
ConsoleWrite(GetPixel($hBitmap[6],10,10) & @CRLF)

; Set Pixel(10,10) color: 0xFCFF0000
DllCall($ghGDIPDll,"int","GdipBitmapSetPixel","handle",$hBitmap[6],"int",10,"int",10,"dword",0xFCFF0000)

; In this phase the color is 0xFCFF0000
ConsoleWrite(GetPixel($hBitmap[6],10,10) & @CRLF)

; Clean up resources
_GDIPlus_GraphicsDispose($hContext)
_GDIPlus_BitmapDispose($hBitmap[6])

_GDIPlus_Shutdown()

Func GetPixel($hBitmap,$X,$Y)
    Local $tPixel = DllStructCreate("dword Pixel")
    DllCall($ghGDIPDll,"int","GdipBitmapGetPixel","handle",$hBitmap,"int",$X,"int",$Y,"ptr",DllStructGetPtr($tPixel))
    Return Hex(DllStructGetData($tPixel,"Pixel"),8)
EndFunc
 楼主| 发表于 2013-1-4 23:21:34 | 显示全部楼层
回复 43# happytc


    终于解决,学习了
发表于 2013-1-5 11:18:22 | 显示全部楼层
楼主好像没有描述清楚哟,看不大懂
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 06:45 , Processed in 0.067845 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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