[已解决]求教怎么利用GDI从图片中截取指定位置指定大小的图?
本帖最后由 zghwelcome 于 2017-12-4 19:39 编辑求教怎么利用GDI从图片中截取指定位置指定大小的图?
如这个样图中,想从原图位置 x=60,y=300,截图一张 宽为80,高为60的新图并保存,请问用GDI该怎么实现?谢谢
看了GDI的例子,依葫芦画瓢都失败了 {:face (394):} _GDIPlus_GraphicsDrawImageRect
_GDIPlus_GraphicsDrawImageRectRect 回复 2# 水木子
GDI里面的图像对象,图形对象太令人困惑了,求水版看看我代码该怎么改#include <GDIPlus.au3>
#include <ScreenCapture.au3>
#include <WinAPI.au3>
_GDIPlus_Startup()
$hImage1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\1.jpg')
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage1, 0, 0, 500, 500)
Local $pIA = _GDIPlus_ImageAttributesCreate()
_GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBitmap1, 50, 50, 100, 100, 580, 580, 100, 100, $pIA)
_GDIPlus_ImageSaveToFile($hImage1, @ScriptDir & "\2.jpg")
_GDIPlus_ImageDispose($hImage1)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageAttributesDispose($pIA)
_GDIPlus_Shutdown()
ShellExecute(@ScriptDir & "\2.jpg") 回复 3# zghwelcome
我觉得 ImageLoadFromFile 后其实用 BitmapCloneArea 直接克隆区域会更简单 回复 4# afan
谢谢A版指点,这么做确实很简单!#include <GDIPlus.au3>
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\1.jpg')
$hClone = _GDIPlus_BitmapCloneArea($hImage, 100, 100, 200, 100, $GDIP_PXF24RGB)
_GDIPlus_ImageSaveToFile($hClone, @ScriptDir & "\2.jpg")
_GDIPlus_ImageDispose($hClone)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
ShellExecute(@ScriptDir & "\2.jpg")不知道水版的方法该怎么实现。{:face (84):} 回复 5# zghwelcome
刚刚试了下,确实也可以,不过可能我想复杂了。学习了!谢谢! 回复 4# afan
方法简单实用,受教了! 來學學{:face (356):} 回复 4# afan
左侧的眼睛是原图
右侧的眼睛是截图
版主请看下,用_GDIPlus_BitmapCloneArea后,获取到的图片和原来,存在一点细微的差距 回复afan
左侧的眼睛是原图
右侧的眼睛是截图
版主请看下,用_GDIPlus_BitmapCloneArea后,获取到 ...
peter13447 发表于 2018-3-21 23:22 http://www.autoit3.cn/images/common/back.gif
可能保存jpg这种压缩格式时的质量设置与原图并非一致。另外,这种格式属于有损格式,在对局部操作时与对全图操作时压缩结果也会不同。 本帖最后由 peter13447 于 2018-3-22 08:34 编辑
回复 10# afan
请问,版主大大
有无损方法,获取局部图片吗
这个问题,困扰了我好久好久了.
我自己已经测试了很多方法....一直无法解决.
恳请大大,援助.
原始图片,可以用这张
回复afan
请问,版主大大
有无损方法,获取局部图片吗
这个问题,困扰了我好久好久了.
我自己已经测 ...
peter13447 发表于 2018-3-22 08:32 http://www.autoit3.cn/images/common/back.gif
你这张是png格式,如上代码是可以一致输出的。 回复 11# peter13447
如果是jpg,需要设置质量
Local $pic_old = 'j.JPG', $pic_new = 'jj.JPG'
_GDIPlus_Startup()
Local $hImage = _GDIPlus_BitmapCreateFromFile($pic_old)
Local $hClone = _GDIPlus_BitmapCloneArea($hImage, 100, 100, 60, 100, $GDIP_PXF24RGB)
Local $giQuality = 100, $pParams
Local $tParams = _GDIPlus_ParamInit(1)
Local $tData = DllStructCreate('int Quality')
DllStructSetData($tData, 'Quality', $giQuality)
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, DllStructGetPtr($tData))
If IsDllStruct($tParams) Then $pParams = DllStructGetPtr($tParams)
Local $CLSID = _GDIPlus_EncodersGetCLSID('JPG')
_GDIPlus_ImageSaveToFileEx($hClone, $pic_new, $CLSID, $pParams)
_GDIPlus_ImageDispose($hClone)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown() 回复 13# afan
感谢,大大反馈,谢谢啦!!!{:1_240:}
我先测试下,稍后反馈... 回复 13# afan
感谢,版主的代码.
经测试,jpg图片,效果感觉还可以.没有发现像素的损失.
后续,将会对其它格式的图片,再进行测试.
最后,再次感谢版主的帮助.{:1_359:}
页:
[1]
2