Что нового

обрезка изображения

dexforint

Новичок
Сообщения
5
Репутация
0
Есть изображение, нужно сделать из него новое изображение(прямоугольное), вырезав из первого прямоугольник, задав 4 числа:
x1,y1 - координаты верхнего левого угла прямоугольника
x2,y2 - координаты нижнего правого угла прямоугольника
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
#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
 
Верх