改变图片尺寸一个奇特的问题,试过很多方法都不行,求高手协助探究原因(GDI相关)
改变图片尺寸一个奇特的问题,试过很多方法都不行,求高手协助探究原因(GDI相关)小弟 参考haijie1223 老大在
http://www.autoitx.com/forum.php?mod=viewthread&tid=31612&highlight=%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 换种方法,函数用法不变!
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 回复 2# 马甲
可以了 感謝版主
版主 可以問一下 嗎??
我剛剛才發現 我的 JPG 是灰階的
換成全彩的就可以
原因是甚麼呢?? 回复 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位, 预放大 回复 3# kk_lee69
已经换成马甲版主的代码:http://www.autoitx.com/thread-31612-1-1.html 额,仰望各路大神。奋发努力中
页:
[1]