Что нового

Скрипт изменения размеров jpg без сильной потери качества ?

mv6677

Новичок
Сообщения
105
Репутация
0
Добрый день.
Подскажите что не так со скриптом.

Есть скрипт autoit, который позволяет сжимать изображения (изменять размеры ширины и высоты фотофайла) - так чтобы не менялось слишком сильно его качество.
Но этот скрипт почему-то не работает.
Код:
#include "File.au3"
#include "GDIPlus.au3"

_GDIPlus_Startup()
$CurImage = _GDIPlus_ImageLoadFromFile("test.jpg")
$sCLSID = _GDIPlus_EncodersGetCLSID("jpg")
$NewSizeW = Round((_GDIPlus_ImageGetWidth($CurImage) * 600) / _GDIPlus_ImageGetHeight($CurImage))

; Create thumbnail
$NewImage = _GDIPlus_BitmapCreateFromScan0($NewSizeW, 600, 0, _GDIPlus_ImageGetPixelFormatEx($CurImage))
$hGraphics = _GDIPlus_ImageGetGraphicsContext($NewImage)
_GDIPlus_GraphicsSetInterpolationMode($hGraphics, 7)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $CurImage, 0, 0, _GDIPlus_ImageGetWidth($CurImage), _GDIPlus_ImageGetHeight($CurImage), 0, 0, $NewSizeW, 600)
_GDIPlus_GraphicsDispose($hGraphics)

If FileExists("result.jpg") Then FileRecycle("result.jpg")
$tParams = _GDIPlus_ParamInit(1)
$tData = DllStructCreate("int Quality")
DllStructSetData($tData, "Quality", 100)
$pData = DllStructGetPtr($tData)
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
$pParams = DllStructGetPtr($tParams)
_GDIPlus_ImageSaveToFileEx($NewImage, "result.jpg", $sCLSID, DllStructGetPtr($tParams))
_GDIPlus_ImageDispose($CurImage)
;_GDIPlus_ImageDispose($NewImage)
_GDIPlus_Shutdown()

Func _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", $iStride, "int", $iPixelFormat, "ptr", $pScan0, "ptr*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    Return $aResult[6]
EndFunc   ;==>_GDIPlus_BitmapCreateFromScan0

Func _GDIPlus_GraphicsSetInterpolationMode($hGraphics, $iInterpolationMode)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "hwnd", $hGraphics, "int", $iInterpolationMode)
    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0]
EndFunc   ;==>_GDIPlus_GraphicsSetInterpolationMode

Func _GDIPlus_ImageGetPixelFormatEx($hImage)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipGetImagePixelFormat", "ptr", $hImage, "int*", 0)
	Local $aFormat[2] = [0, ""]
    If @error Then Return SetError(@error, @extended, $aFormat)
    Return $aResult[2]
EndFunc   ;==>_GDIPlus_ImageGetPixelFormatEx

Выдает ошибку: "Error: Duplicate function name"

Что не так записано в скрипте и как заставить этот скрипт работать ?
 

Вложения

  • test.jpg
    test.jpg
    45.2 КБ · Просмотры: 4

hedji

Продвинутый
Сообщения
409
Репутация
94
Функции _GDIPlus_BitmapCreateFromScan0 и _GDIPlus_GraphicsSetInterpolationMode уже есть в файле GDIPlus.au3.
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
hedji, я не очень большой специалист по autoit

Что мне нужно изменить в коде, чтобы скрипт начал работать?
Нужно удалить упоминания функций, которые вы назвали ?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
mv6677
Код:
#include "GDIPlus.au3"

_GDIPlus_Startup()
$CurImage = _GDIPlus_ImageLoadFromFile("test.jpg")
$sCLSID = _GDIPlus_EncodersGetCLSID("jpg")
$NewSizeW = Round((_GDIPlus_ImageGetWidth($CurImage) * 600) / _GDIPlus_ImageGetHeight($CurImage))

; Create thumbnail
$NewImage = _GDIPlus_BitmapCreateFromScan0($NewSizeW, 600, _GDIPlus_ImageGetPixelFormat($CurImage)[0])
$hGraphics = _GDIPlus_ImageGetGraphicsContext($NewImage)
_GDIPlus_GraphicsSetInterpolationMode($hGraphics, 7)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $CurImage, 0, 0, _GDIPlus_ImageGetWidth($CurImage), _GDIPlus_ImageGetHeight($CurImage), 0, 0, $NewSizeW, 600)
_GDIPlus_GraphicsDispose($hGraphics)

If FileExists("result.jpg") Then FileRecycle("result.jpg")
$tParams = _GDIPlus_ParamInit(1)
$tData = DllStructCreate("int Quality")
DllStructSetData($tData, "Quality", 100)
$pData = DllStructGetPtr($tData)
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
$pParams = DllStructGetPtr($tParams)
_GDIPlus_ImageSaveToFileEx($NewImage, "result.jpg", $sCLSID, DllStructGetPtr($tParams))
_GDIPlus_ImageDispose($CurImage)
_GDIPlus_ImageDispose($NewImage)
_GDIPlus_Shutdown()
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Что именно изменить Вам написал InnI.
На будущее для лучшего понимания как оно работает:
В начале кода есть строка #include "GDIPlus.au3" это означает, что Вы можете вызывать все те функции, которые есть в файле GDIPlus.au3 как если бы они были написаны Вами в самом коде. Если названия функций в файле GDIPlus.au3 и в коде совпадут - получите ошибку как в этом случае.
 
Верх