Что нового

Как заставить скрипт подгонять размер фотографий по высоте

mv6677

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

Есть скрипт изменения размеров фотографии - с жестким ограничением по высоте.
Файл с новыми размерами скрипт сохраняет как Resize.jpg

Код:
#Include <GDIPlus.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
    $W1 = $Hnew / $W * $H
$hThumb = _GDIPlus_ImageGetThumbnail($hImage, $W1, $H1)
_GDIPlus_ImageSaveToFile($hThumb, 'Resized.jpg')
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ImageDispose($hThumb)
_GDIPlus_Shutdown()

Однако этот скрипт работает только с фотографиями - которые больше вытянуты вертикально. Если фотография вытянута горизонтально - то скрипт уже не может изменить ее размеры (подогнать размеры по высоте с сохранением пропорций).
Например я пытаюсь преобразовать JPG с размерами 780х519, а получившийся файл Resize.jpg - имеет размеры 705х469 (хотя вместо 469 - должно быть 1060, а вместо 705 - соответственно число большее 780)

Также скрипт сохраняет фотографии большого объема - с огромной потерей качества.

Подскажите - как заставить скрипт подгонять размер фотографии по высоте - не только вертикальных фотографий, а еще и горизонтальных фотографий ?
 

Вложения

  • test.jpg
    test.jpg
    36.1 КБ · Просмотры: 2
  • Resized.jpg
    Resized.jpg
    18.2 КБ · Просмотры: 3

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Или добавить проверку ширины и высоты :
Код:
#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)

If $W > $H Then
    $H1 = $Hnew / $H * $W
    $W1 = $Hnew
Else
    $W1 =$Hnew / $W * $H
    $H1 = $Hnew
EndIf

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

mv6677

Новичок
Сообщения
105
Репутация
0
ra4o, что-то не работает...
Если картинка вертикальная - то скрипт работает как и положено - подгоняет высоту с сохранением пропорций.

Но если картинка - горизонтальная - то скрипт подгоняет ее ширину вместо высоты (то есть делает ширину равной 1060).
А подгонять нужно именно высоту, а не ширину.
 

Вложения

  • test.jpg
    test.jpg
    71 КБ · Просмотры: 2
  • test-.jpg
    test-.jpg
    36.1 КБ · Просмотры: 1

ra4o

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

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

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile('test(1).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()
Проверял на разных вариантах - ширина всегда остаётся постоянной, высота пропорционально меняется...
 
Автор
M

mv6677

Новичок
Сообщения
105
Репутация
0
ra4o , а теперь все работает как надо.
Большое спасибо за скрипт.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
mv6677
Код:
; $w1, $h1 - размер квадрата в который картинка должна поместитьcя
; $w2, $h2 - реальный размер картинки
Func _Coor($w1, $h1, $w2, $h2)
	Local $aXY[2] = [0,0], $kX=$w1/$w2, $kY=$h1/$h2
	If $kX>$kY Then
		$aXY[0]=Round($w2*$kY)
		$aXY[1]=$h1
	Else
		$aXY[0]=$w1
		$aXY[1]=Round($h2*$kX)
	EndIf
	Return $aXY
EndFunc
 
Верх