找回密码
 加入
搜索
查看: 5711|回复: 15

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

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

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


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

本帖子中包含更多资源

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

×
发表于 2017-12-4 10:25:48 | 显示全部楼层
_GDIPlus_GraphicsDrawImageRect
_GDIPlus_GraphicsDrawImageRectRect
 楼主| 发表于 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")
发表于 2017-12-4 13:01:23 | 显示全部楼层
回复 3# zghwelcome


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

评分

参与人数 1金钱 +40 收起 理由
zghwelcome + 40 谢谢A版指点!

查看全部评分

 楼主| 发表于 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")
不知道水版的方法该怎么实现。
发表于 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后,获取到的图片和原来,存在一点细微的差距

本帖子中包含更多资源

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

×
发表于 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

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

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

恳请大大,援助.

原始图片,可以用这张

本帖子中包含更多资源

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

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

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

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



    你这张是png格式,如上代码是可以一致输出的。
发表于 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()
发表于 2018-3-22 15:34:52 | 显示全部楼层
回复 13# afan


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


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

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

本版积分规则

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

GMT+8, 2024-11-16 18:45 , Processed in 0.081063 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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