Русское сообщество AutoIt

Общий раздел по AutoIt => Общие вопросы по AutoIt => Тема начата: dexforint от Май 16, 2018, 20:07:35

Название: обрезка изображения
Отправлено: dexforint от Май 16, 2018, 20:07:35
Есть изображение, нужно сделать из него новое изображение(прямоугольное), вырезав из первого прямоугольник, задав 4 числа:
x1,y1 - координаты верхнего левого угла прямоугольника
x2,y2 - координаты нижнего правого угла прямоугольника
Название: Re: обрезка изображения
Отправлено: Tempo от Май 16, 2018, 22:11:56
Код: AutoIt [Выделить]
#include <GUIConstants.au3>
#include <FileConstants.au3>
#include <GDIPlus.au3>

_CropImage()

Func _CropImage()
    Local $sFileOpen, $hImage, $aXYWH, $hCropImage, $sFileSave
    $sFileOpen = FileOpenDialog("Выберите изображение", "", "Изображения (*.jpg;*.jpeg;*.png;*.bmp;*.gif;*.tiff)", $FD_FILEMUSTEXIST + $FD_PATHMUSTEXIST)
    If @error Then Exit

    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile($sFileOpen)
    If @error Then Exit -1

    $aXYWH = _CropBox(0, 0, _GDIPlus_ImageGetWidth($hImage), _GDIPlus_ImageGetHeight($hImage))
    If @error Then Exit
    $aPixelFormat = _GDIPlus_ImageGetPixelFormat($hImage)
    If @error Then Exit -2
    $hCropImage = _GDIPlus_BitmapCloneArea($hImage, $aXYWH[0], $aXYWH[1], $aXYWH[2], $aXYWH[3], $aPixelFormat[0])
    _GDIPlus_ImageDispose($hImage)

    $sFileSave = FileSaveDialog("Сохранить как", "", "Изображения (*.jpg;*.jpeg;*.png;*.bmp;*.gif;*.tiff)", $FD_PATHMUSTEXIST + $FD_PROMPTOVERWRITE, $sFileOpen)
    If @error Then Exit
    _GDIPlus_ImageSaveToFile($hCropImage, $sFileSave)
    _GDIPlus_ImageDispose($hCropImage)
    _GDIPlus_Shutdown()
EndFunc   ;==>_CropImage

Func _CropBox($nX = 0, $nY = 0, $nW = 0, $nH = 0)
    Local $aXYWH[4], $nInpX, $nInpY, $nInpW, $nInpH, $nBtnOK
    GUICreate("Обрезка изображения", 190, 95)
    $nInpX = GUICtrlCreateInput(0, 10, 5, 80, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER))
    GUICtrlSendMsg(-1, $EM_SETCUEBANNER, True, "X")
    GUICtrlSetTip(-1, "X")
    $nInpY = GUICtrlCreateInput(0, 100, 5, 80, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER))
    GUICtrlSendMsg(-1, $EM_SETCUEBANNER, True, "Y")
    GUICtrlSetTip(-1, "Y")
    $nInpW = GUICtrlCreateInput($nW, 10, 30, 80, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER))
    GUICtrlSendMsg(-1, $EM_SETCUEBANNER, True, "Ширина")
    GUICtrlSetTip(-1, "Ширина")
    $nInpH = GUICtrlCreateInput($nH, 100, 30, 80, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER))
    GUICtrlSendMsg(-1, $EM_SETCUEBANNER, True, "Высота")
    GUICtrlSetTip(-1, "Высота")
    $nBtnOK = GUICtrlCreateButton("OK", 45, 60, 100, 25)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    GUISetState()
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                GUIDelete()
                Return SetError(1, 0, 0)
            Case $nBtnOK
                $aXYWH[0] = GUICtrlRead($nInpX)
                $aXYWH[1] = GUICtrlRead($nInpY)
                $aXYWH[2] = GUICtrlRead($nInpW)
                $aXYWH[3] = GUICtrlRead($nInpH)
                GUIDelete()
                Return $aXYWH
        EndSwitch
    WEnd
EndFunc   ;==>_CropBox