zghwelcome 发表于 2017-12-4 10:19:33

[已解决]求教怎么利用GDI从图片中截取指定位置指定大小的图?

本帖最后由 zghwelcome 于 2017-12-4 19:39 编辑

求教怎么利用GDI从图片中截取指定位置指定大小的图?


如这个样图中,想从原图位置 x=60,y=300,截图一张 宽为80,高为60的新图并保存,请问用GDI该怎么实现?谢谢
看了GDI的例子,依葫芦画瓢都失败了 {:face (394):}

水木子 发表于 2017-12-4 10:25:48

_GDIPlus_GraphicsDrawImageRect
_GDIPlus_GraphicsDrawImageRectRect

zghwelcome 发表于 2017-12-4 11:49:34

回复 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")

afan 发表于 2017-12-4 13:01:23

回复 3# zghwelcome


   我觉得 ImageLoadFromFile 后其实用 BitmapCloneArea 直接克隆区域会更简单

zghwelcome 发表于 2017-12-4 13:18:22

回复 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):}

水木子 发表于 2017-12-4 15:30:09

回复 5# zghwelcome

刚刚试了下,确实也可以,不过可能我想复杂了。学习了!谢谢!

fuldho 发表于 2017-12-4 16:21:39

回复 4# afan

方法简单实用,受教了!

kc098829 发表于 2017-12-7 10:23:45

來學學{:face (356):}

peter13447 发表于 2018-3-21 23:22:39

回复 4# afan



左侧的眼睛是原图
右侧的眼睛是截图
版主请看下,用_GDIPlus_BitmapCloneArea后,获取到的图片和原来,存在一点细微的差距

afan 发表于 2018-3-22 01:05:00

回复afan



左侧的眼睛是原图
右侧的眼睛是截图
版主请看下,用_GDIPlus_BitmapCloneArea后,获取到 ...
peter13447 发表于 2018-3-21 23:22 http://www.autoit3.cn/images/common/back.gif


    可能保存jpg这种压缩格式时的质量设置与原图并非一致。另外,这种格式属于有损格式,在对局部操作时与对全图操作时压缩结果也会不同。

peter13447 发表于 2018-3-22 08:32:29

本帖最后由 peter13447 于 2018-3-22 08:34 编辑

回复 10# afan

请问,版主大大
有无损方法,获取局部图片吗

这个问题,困扰了我好久好久了.
我自己已经测试了很多方法....一直无法解决.

恳请大大,援助.

原始图片,可以用这张

afan 发表于 2018-3-22 10:27:55

回复afan

请问,版主大大
有无损方法,获取局部图片吗

这个问题,困扰了我好久好久了.
我自己已经测 ...
peter13447 发表于 2018-3-22 08:32 http://www.autoit3.cn/images/common/back.gif


    你这张是png格式,如上代码是可以一致输出的。

afan 发表于 2018-3-22 10:33:21

回复 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()

peter13447 发表于 2018-3-22 15:34:52

回复 13# afan


感谢,大大反馈,谢谢啦!!!{:1_240:}
我先测试下,稍后反馈...

peter13447 发表于 2018-3-23 07:51:14

回复 13# afan


感谢,版主的代码.
经测试,jpg图片,效果感觉还可以.没有发现像素的损失.
后续,将会对其它格式的图片,再进行测试.

最后,再次感谢版主的帮助.{:1_359:}
页: [1] 2
查看完整版本: [已解决]求教怎么利用GDI从图片中截取指定位置指定大小的图?