找回密码
 加入

AUTOIT CN

搜索
查看: 715|回复: 15

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

[复制链接]
发表于 2017-12-4 10:19:33 | 显示全部楼层 |阅读模式
本帖最后由 zghwelcome 于 2017-12-4 19:39 编辑

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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入

x
发表于 2017-12-4 10:25:48 | 显示全部楼层
  1. _GDIPlus_GraphicsDrawImageRect
  2. _GDIPlus_GraphicsDrawImageRectRect
复制代码
 楼主| 发表于 2017-12-4 11:49:34 | 显示全部楼层
回复 2# 水木子

GDI里面的图像对象,图形对象太令人困惑了,求水版看看我代码该怎么改
  1. #include <GDIPlus.au3>
  2. #include <ScreenCapture.au3>
  3. #include <WinAPI.au3>


  4. _GDIPlus_Startup()
  5. $hImage1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\1.jpg')
  6. $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
  7. _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage1, 0, 0, 500, 500)
  8. Local $pIA = _GDIPlus_ImageAttributesCreate()
  9. _GDIPlus_GraphicsDrawImageRectRect($hGraphic, $hBitmap1, 50, 50, 100, 100, 580, 580, 100, 100, $pIA)
  10. _GDIPlus_ImageSaveToFile($hImage1, @ScriptDir & "\2.jpg")
  11. _GDIPlus_ImageDispose($hImage1)
  12. _GDIPlus_GraphicsDispose($hGraphic)
  13. _GDIPlus_ImageAttributesDispose($pIA)
  14. _GDIPlus_Shutdown()

  15. ShellExecute(@ScriptDir & "\2.jpg")
复制代码
发表于 2017-12-4 13:01:23 | 显示全部楼层
回复 3# zghwelcome


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

评分

1

查看全部评分

 楼主| 发表于 2017-12-4 13:18:22 | 显示全部楼层
回复 4# afan


谢谢A版指点,这么做确实很简单!
  1. #include <GDIPlus.au3>
  2. _GDIPlus_Startup()
  3. $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\1.jpg')
  4. $hClone = _GDIPlus_BitmapCloneArea($hImage, 100, 100, 200, 100, $GDIP_PXF24RGB)
  5. _GDIPlus_ImageSaveToFile($hClone, @ScriptDir & "\2.jpg")
  6. _GDIPlus_ImageDispose($hClone)
  7. _GDIPlus_ImageDispose($hImage)
  8. _GDIPlus_Shutdown()
  9. ShellExecute(@ScriptDir & "\2.jpg")
复制代码
不知道水版的方法该怎么实现。
发表于 2017-12-4 15:30:09 | 显示全部楼层
回复 5# zghwelcome

刚刚试了下,确实也可以,不过可能我想复杂了。学习了!谢谢!
发表于 2017-12-4 16:21:39 | 显示全部楼层
回复 4# afan

方法简单实用,受教了!
发表于 2017-12-7 10:23:45 | 显示全部楼层
來學學
发表于 2018-3-21 23:22:39 | 显示全部楼层
回复 4# afan



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入

x
发表于 2018-3-22 01:05:00 | 显示全部楼层
回复  afan



左侧的眼睛是原图
右侧的眼睛是截图
版主请看下,用_GDIPlus_BitmapCloneArea后,获取到 ...
peter13447 发表于 2018-3-21 23:22



    可能保存jpg这种压缩格式时的质量设置与原图并非一致。另外,这种格式属于有损格式,在对局部操作时与对全图操作时压缩结果也会不同。
发表于 2018-3-22 08:32:29 | 显示全部楼层
本帖最后由 peter13447 于 2018-3-22 08:34 编辑

回复 10# afan

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

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

恳请大大,援助.

原始图片,可以用这张

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入

x
发表于 2018-3-22 10:27:55 | 显示全部楼层
回复  afan

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

这个问题,困扰了我好久好久了.
我自己已经测 ...
peter13447 发表于 2018-3-22 08:32



    你这张是png格式,如上代码是可以一致输出的。
发表于 2018-3-22 10:33:21 | 显示全部楼层
回复 11# peter13447


    如果是jpg,需要设置质量

  1. Local $pic_old = 'j.JPG', $pic_new = 'jj.JPG'
  2. _GDIPlus_Startup()
  3. Local $hImage = _GDIPlus_BitmapCreateFromFile($pic_old)
  4. Local $hClone = _GDIPlus_BitmapCloneArea($hImage, 100, 100, 60, 100, $GDIP_PXF24RGB)
  5. Local $giQuality = 100, $pParams
  6. Local $tParams = _GDIPlus_ParamInit(1)
  7. Local $tData = DllStructCreate('int Quality')
  8. DllStructSetData($tData, 'Quality', $giQuality)
  9. _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, DllStructGetPtr($tData))
  10. If IsDllStruct($tParams) Then $pParams = DllStructGetPtr($tParams)
  11. Local $CLSID = _GDIPlus_EncodersGetCLSID('JPG')
  12. _GDIPlus_ImageSaveToFileEx($hClone, $pic_new, $CLSID, $pParams)
  13. _GDIPlus_ImageDispose($hClone)
  14. _GDIPlus_ImageDispose($hImage)
  15. _GDIPlus_Shutdown()
复制代码
发表于 2018-3-22 15:34:52 | 显示全部楼层
回复 13# afan


感谢,大大反馈,谢谢啦!!!
我先测试下,稍后反馈...
发表于 2018-3-23 07:51:14 | 显示全部楼层
回复 13# afan


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

最后,再次感谢版主的帮助.
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2018-7-18 12:31 , Processed in 0.135839 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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