找回密码
 加入
搜索
查看: 8414|回复: 5

[图形处理] 改变图片尺寸一个奇特的问题,试过很多方法都不行,求高手协助探究原因(GDI相关)

  [复制链接]
发表于 2014-6-24 13:25:40 | 显示全部楼层 |阅读模式
改变图片尺寸一个奇特的问题,试过很多方法都不行,求高手协助探究原因(GDI相关)

小弟 参考  haijie1223 老大  在
http://www.autoitx.com/forum.php ... =%B7%D6%B1%E6%C2%CA

这篇文章中 提供的 UDF  想改变 一下图片的尺寸大小,却遇到问题

经果不断的测试  从 操作系统 XP、WIN7  图檔格式 JPG 或 BMP 外加 AUTOIT版本 3.3.6   3.3.8   3.3.10   3.3.12 四种版本 ,不断的实验测试

终于发现  在 XP 底下  ( WIN7正常)  我 所附上的那个图档 不管是 JPG 格式 或者是 转成 BMP 格式 ,程序都无法转文件出我要的档案

但是如果将图片 换成其他的 图片 就都不会有问题

可是 目前需要转文件的都是如同附件这样的 图片




求 高手 解惑!!  为何  我这样的图片 这个 UDF 会失效呢???

附上 我的程序代码  与 图片




====================================================

_PIC2JPG('123.jpg', '888.jpg', 375, 174,100)



;~ Func _PIC2JPG------------------任何图片转jpg
;~ $sFile------------------------原图片路径名字
;~ $sFile_new--------------------要生成的jpg文件路径名字
;~ $new_W------------------------分辨率宽度(要生成的jpg文件的新宽度)
;~ $new_H------------------------分辨率高度(要生成的jpg文件的新高度)
;~ $IQUALITY = 100---------------图片质量(要生成的jpg图片质量)
 
Func _PIC2JPG($sFile, $sFile_new, $new_W, $new_H, $IQUALITY = 100)
        _GDIPlus_Startup()
        Local $HIMAGE = _GDIPlus_ImageLoadFromFile($sFile)
        Local $GIQUALITY = $IQUALITY, $PPARAMS
        Local $TPARAMS = _GDIPlus_ParamInit(1)
        Local $TDATA = DllStructCreate("int Quality")
        Local $hGraphics = _GDIPlus_ImageGetGraphicsContext($HIMAGE)
        Local $hBmp = _GDIPlus_BitmapCreateFromGraphics($new_W, $new_H, $hGraphics)
        Local $hImage_New = _GDIPlus_ImageGetGraphicsContext($hBmp)
        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_GraphicsDrawImageRect($hImage_New, $HIMAGE, 0, 0, $new_W, $new_H)
        Local $SAVE = _GDIPlus_ImageSaveToFileEx($hBmp, $sFile_new, $CLSID, $PPARAMS)
        _GDIPlus_GraphicsDispose($hImage_New)
        _GDIPlus_BitmapDispose($hBmp)
        _GDIPlus_GraphicsDispose($hGraphics)
        _GDIPlus_BitmapDispose($HIMAGE)
        _GDIPlus_Shutdown()
        If $SAVE = False Then Return SetError(1, 0, False)
        Return True
EndFunc   ;==>_PIC2JPG

本帖子中包含更多资源

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

×
发表于 2014-6-24 13:57:09 | 显示全部楼层
换种方法,函数用法不变!

Func _PIC2JPG($sFile, $sFile_new, $new_W, $new_H, $IQUALITY = 100)
        _GDIPlus_Startup()
        
        Local $hBitmap = _GDIPlus_BitmapCreateFromScan0($new_W, $new_H)
        Local $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)
        
        Local $hImage = _GDIPlus_ImageLoadFromFile($sFile)
        _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, 0, 0, $new_W, $new_H)
        _GDIPlus_ImageDispose($hImage)
        
        Local $sCLSID = _GDIPlus_EncodersGetCLSID("JPG")
        Local $tParams = _GDIPlus_ParamInit(1)
        Local $tData = DllStructCreate("int Quality")
        Local $pData = DllStructGetPtr($tData)
        Local $pParams = DllStructGetPtr($tParams)
        DllStructSetData($tData, "Quality", $IQUALITY)
        _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
        _GDIPlus_ImageSaveToFileEx($hBitmap, $sFile_new, $sCLSID, $pParams)
        
        _GDIPlus_GraphicsDispose($hGraphics)
        _GDIPlus_BitmapDispose($hBitmap)

        _GDIPlus_Shutdown()
EndFunc
 楼主| 发表于 2014-6-24 14:56:15 | 显示全部楼层
回复 2# 马甲

可以了 感謝版主

版主 可以問一下 嗎??

我剛剛才發現 我的 JPG 是灰階的
換成全彩的就可以

原因是甚麼呢??
发表于 2014-6-24 15:18:35 | 显示全部楼层
回复 3# kk_lee69


    嗯,与图片格式有关,看来我发的那个函数应该被版主这个替换掉了。原来的函数不能处理单通道模式图片,似乎只对RGB图片管用。
GdipCreateBitmapFromScan0这个Api可识别以下格式:
$GDIP_PXF01INDEXED = 每像素1位, 索引的
$GDIP_PXF04INDEXED = 每像素4位, 索引的
$GDIP_PXF08INDEXED = 每像素8位, 索引的
$GDIP_PXF16GRAYSCALE = 每像素16位, 灰度
$GDIP_PXF16RGB555 = 每像素16位; 每RGB组分5位
$GDIP_PXF16RGB565 = 每像素16位; 红色5位, 绿色6位, 蓝色5位
$GDIP_PXF16ARGB1555 = 每像素16位; alpha通道1位和每RGB组分5位
$GDIP_PXF24RGB = 每像素24位; 每RGB组分8位
$GDIP_PXF32RGB = 每像素32位; 每RGB组分8位. 无alpha组分.
$GDIP_PXF32ARGB = 每像素32位; 每RGB和alpha组分8位
$GDIP_PXF32PARGB = 每像素32位; 每RGB和alpha组分8位, 预放大
发表于 2014-6-24 15:26:00 | 显示全部楼层
回复 3# kk_lee69


已经换成马甲版主的代码:  http://www.autoitx.com/thread-31612-1-1.html
发表于 2014-6-26 11:44:08 | 显示全部楼层
额,仰望各路大神。奋发努力中
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-1 07:56 , Processed in 0.078012 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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