Что нового

Подгонка фотографии по высоте

mv6677

Новичок
Сообщения
105
Репутация
0
Доброе утро, форумчане.
Помогите решить вопрос.

Есть скрипт изменения размеров фотографии - с жестким ограничением по высоте.
Файл с новыми размерами скрипт сохраняет как Resize.jpg
Но он - почему-то не работает.
Код:
#Include <GDIPlus.au3>
#Include <WinAPI.au3>

$Hnew = 1060  ;~ Заданная высота

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile('test.jpg')
$H = _GDIPlus_ImageGetHeight($hImage)
$W = _GDIPlus_ImageGetWidth($hImage)
ConsoleWrite('$H='&$H&@CR)
ConsoleWrite('$W='&$W&@CR)

    $H1 =$Hnew / $W * $H
    $W1 = $Hnew


$hThumb = _GDIPlus_ImageGetThumbnail($hImage, $W1, $H1)
_GDIPlus_ImageSaveToFile($hThumb, 'Resized.jpg')
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ImageDispose($hThumb)
_GDIPlus_Shutdown()

Этот скрипт почему-то подгоняет ширину фотографий, вместо их высоты.
Подскажите - как заставить скрипт подгонять размер фотографии по высоте, а не по ширине ?

Есть еще другой скрипт который изменяет размеры фото без сильной потери качества.
Однако он почему-то не может изменить размер фотографии, если значение высоты закрепить равным 1060

Код:
#include "GDIPlus.au3"

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

; Create thumbnail
$NewImage = _GDIPlus_BitmapCreateFromScan0($NewSizeW, 1060, _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("Resized.jpg") Then FileRecycle("Resized.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, "Resized.jpg", $sCLSID, DllStructGetPtr($tParams))
_GDIPlus_ImageDispose($CurImage)
_GDIPlus_ImageDispose($NewImage)
_GDIPlus_Shutdown()
Если установить значение высоты равным 1060, то этот второй скрипт - успешно подгоняет размер по высоте, но при этом как-то искажает изображение(не снижая при этом его качество).
Я прикрепил файл на котором показано это искажение. Описать можно так - изначальное изображение - сжимается по вертикали, а снизу добавляется какая-то область черного цвета. В результате - пропорции вроде бы соблюдены, но в файл добавлен новый нежелательный элемент.

Как заставить второй скрипт - изменять размеры изображения без потери качества, не искажая изображение ?
 

Вложения

  • Resized.jpg
    Resized.jpg
    32.4 КБ · Просмотры: 3
  • test.jpg
    test.jpg
    36.1 КБ · Просмотры: 3
  • Resized (файл изображения искаженного вторым скриптом).rar
    79.6 КБ · Просмотры: 1

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Этот скрипт почему-то подгоняет ширину фотографий, вместо их высоты.
Потому-что задача этого скрипта была подгонять именно по ширине, вот он-же , только с подгонкой по высоте:
Код:
#Include <GDIPlus.au3>
#Include <WinAPI.au3>

$Wnew = 500  ;~ Заданная высота

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile('test.jpg')
$H = _GDIPlus_ImageGetHeight($hImage)
$W = _GDIPlus_ImageGetWidth($hImage)
ConsoleWrite('$H='&$H&@CR)
ConsoleWrite('$W='&$W&@CR)

    $H1 =$Wnew
    $W1 =$Wnew / $H * $W


$hThumb = _GDIPlus_ImageGetThumbnail($hImage, $W1, $H1)
_GDIPlus_ImageSaveToFile($hThumb, 'Resized.jpg')
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ImageDispose($hThumb)
_GDIPlus_Shutdown()
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
ra4o , ясно.
Теперь все работает.
 
Верх