Что нового

Поворот изображения с изменением размера

ason

Новичок
Сообщения
25
Репутация
0
День добрый всем! Скрипт отрабатывает, но не всегда изображения переворачивает. В чем ошибка, не пойму. Примеры в справке видел., похожие темы на форуме проштудировал. Прошу помочь, подсказать или показать пример, приветствуется любая помощь.

P.S. Скрипт, изменяет масштаб картинки согласно настройкам в файле Setting.txt и сохраняет копию в Screen. Если высота splash-картинки меньше ширины, то нужно повернуть ее на 90 градусов (наклонить влево)

Код:
#Include <GDIPlus.au3>
#Include <WinAPI.au3>

Global $Height, $Width

    Local $hPathImage = FileOpenDialog('Выберите файл', @ScriptDir & '\', 'Файл изображения (*.png)')

    Local $hPathSettingsFile = FileOpenDialog('Выберите файл', @ScriptDir & '\', 'Файл настроек (*.txt)')
    Local $hPathSettings = FileOpen($hPathSettingsFile, 0)
    ;If Not @error then MsgBox(0,'',$hPathSettingsFile)

While 1

        $sStringImageName = FileReadLine($hPathSettings) ;возращаем очередную строку

              $str = StringRegExp($sStringImageName, '([0-9.,]+)x([0-9.,]+)',3) ;находим в строке значения высоты и ширины
                if IsArray ($str) then
                $Height = $str[0]
                $Width = $str[1]
                EndIf


If $Height > $Width Then
    _GreatImageRotate()
    Else
    _GreatImage()

    EndIf

WEnd

FileClose($hPathSettingsFile)

Func _GreatImage()

    _GDIPlus_Startup() ;Перед созданием любого объекта GDI+ необходимо вызвать _GDIPlus_Startup
    $hNewImage = _GDIPlus_ImageLoadFromFile($hPathImage) ;Создаёт объект изображения на основе файла
    $hFinalImage = _GDIPlus_ImageResize($hNewImage, $Height, $Width) ; уменьшение с искажением пропорций

    _GDIPlus_ImageSaveToFile($hFinalImage, @ScriptDir & '\Screen\' & $sStringImageName) ;Сохраняет изображение в файл
    _GDIPlus_ImageDispose($hNewImage) ;Освобождает объект изображения
    _GDIPlus_Shutdown() ;Очищает ресурсы используемые Microsoft Windows GDI+. Нужно избавиться от всех созданных объектов GDI+, прежде чем вызвать _GDIPlus_Shutdown

EndFunc


Func _GreatImageRotate()
        _GDIPlus_Startup()

    $hNewImage = _GDIPlus_ImageLoadFromFile($hPathImage) ;Создаёт объект изображения на основе файла
    _GDIPlus_ImageRotateFlip($hNewImage, 1) ;поворот изображения на 90 градусов без переворачивания
    $hFinalImage = _GDIPlus_ImageResize($hNewImage, $Height, $Width) ; уменьшение с искажением пропорций

    _GDIPlus_ImageSaveToFile($hFinalImage, @ScriptDir & '\Screen\' & $sStringImageName) ;Сохраняет изображение в файл
    _GDIPlus_ImageDispose($hNewImage) ;Освобождает объект изображения
    _GDIPlus_Shutdown() ;Очищает ресурсы используемые Microsoft Windows GDI+. Нужно избавиться от всех созданных объектов GDI+, прежде чем вызвать _GDIPlus_Shutdown

EndFunc   ;==>Example
 

Вложения

  • Settings.txt
    1.2 КБ · Просмотры: 2
  • простой_учет.png
    185.5 КБ · Просмотры: 3
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
1. Цикл нужно прервать при завершении файла. Например, так
Код:
$sStringImageName = FileReadLine($hPathSettings) ;возращаем очередную строку
If @error = -1 Then ExitLoop

2. Значение $Width содержит точку. С какой целью шаблон регулярки добавляет к цифрам точку и запятую?
3. Для $hFinalImage тоже желательно вызывать _GDIPlus_ImageDispose в конце функций.
4. Какой конкретно файл не поворачивается? У меня все нужные повернулись. Пробовал несколько раз.
Сообщение автоматически объединено:

5. У вас размеры сравниваются, как строки. Сделайте так
Код:
$Height = Int($str[0])
$Width  = Int($str[1])
 
Последнее редактирование:
  • Like
Реакции: ason
Автор
A

ason

Новичок
Сообщения
25
Репутация
0
1. Цикл нужно прервать при завершении файла. Например, так
Код:
$sStringImageName = FileReadLine($hPathSettings) ;возращаем очередную строку
If @error = -1 Then ExitLoop

2. Значение $Width содержит точку. С какой целью шаблон регулярки добавляет к цифрам точку и запятую?
3. Для $hFinalImage тоже желательно вызывать _GDIPlus_ImageDispose в конце функций.
4. Какой конкретно файл не поворачивается? У меня все нужные повернулись. Пробовал несколько раз.
Сообщение автоматически объединено:

5. У вас размеры сравниваются, как строки. Сделайте так
Код:
$Height = Int($str[0])
$Width  = Int($str[1])
Спасибо огромное за подсказки! Проблема скорее всего была в пятом пункте. Поправил по всем вашим замечаниям, включая регулярки). Сейчас все работает!
Сообщение автоматически объединено:

На всякий случай, выложил рабочий скрипт.
Код:
#Include <GDIPlus.au3>
#Include <WinAPI.au3>

Global $Height, $Width

    Local $hPathImage = FileOpenDialog('Выберите файл', @ScriptDir & '\', 'Файл изображения (*.png)')
    Local $hPathSettingsFile = FileOpenDialog('Выберите файл', @ScriptDir & '\', 'Файл настроек (*.txt)')
    Local $hPathSettings = FileOpen($hPathSettingsFile, 0)
    ;If Not @error then MsgBox(0,'',$hPathSettingsFile)

While 1

        $sStringImageName = FileReadLine($hPathSettings) ;возращаем очередную строку
        If @error = -1 Then ExitLoop ;прерываем цикл при завершении файла

              $str = StringRegExp($sStringImageName, '([0-9]+)x([0-9]+)',3) ;находим в строке значения высоты и ширины
                if IsArray ($str) then
                $Width = Int($str[0])
                $Height  = Int($str[1])
                EndIf

    If $Width > $Height Then ;если ширина картинки больше высоты, то нужно повернуть ее на 90 градусов (наклонить влево)
        _GreatImageRotateAndResize()
    Else
        _GreatImageResize()
    EndIf

WEnd

FileClose($hPathSettingsFile)

Func _GreatImageResize()

    _GDIPlus_Startup() ;перед созданием любого объекта GDI+ необходимо вызвать _GDIPlus_Startup
    $hNewImage = _GDIPlus_ImageLoadFromFile($hPathImage) ;создаёт объект изображения на основе файла
    $hFinalImage = _GDIPlus_ImageResize($hNewImage, $Width, $Height) ;уменьшение с искажением пропорций
    _GDIPlus_ImageSaveToFile($hFinalImage, @ScriptDir & '\Screen\' & $sStringImageName) ;сохраняет изображение в файл
    _GDIPlus_ImageDispose($hFinalImage) ;освобождает измененный объект изображения
    _GDIPlus_ImageDispose($hNewImage) ;освобождает объект изображения
    _GDIPlus_Shutdown() ;очищает ресурсы используемые Microsoft Windows GDI+. Нужно избавиться от всех созданных объектов GDI+, прежде чем вызвать _GDIPlus_Shutdown

EndFunc

Func _GreatImageRotateAndResize()

     _GDIPlus_Startup() ;перед созданием любого объекта GDI+ необходимо вызвать _GDIPlus_Startup
    $hNewImage = _GDIPlus_ImageLoadFromFile($hPathImage) ;создаёт объект изображения на основе файла
    _GDIPlus_ImageRotateFlip($hNewImage, 3) ;поворот изображения на 90 градусов влево
    $hFinalImage = _GDIPlus_ImageResize($hNewImage, $Width, $Height) ; уменьшение с искажением пропорций
    _GDIPlus_ImageSaveToFile($hFinalImage, @ScriptDir & '\Screen\' & $sStringImageName) ;сохраняет изображение в файл
    _GDIPlus_ImageDispose($hFinalImage) ;освобождает измененный объект изображения
    _GDIPlus_ImageDispose($hNewImage) ;освобождает объект изображения
    _GDIPlus_Shutdown() ;очищает ресурсы используемые Microsoft Windows GDI+. Нужно избавиться от всех созданных объектов GDI+, прежде чем вызвать _GDIPlus_Shutdown

EndFunc
 
Последнее редактирование:
Верх