Имеется уже загруженное и смасштабированное изображение. Теперь нужно его обрезать слева и справа на какое-то (определяемое юзером) количество пикселей. Сломал голову, перерыл весь форум - все примеры именно на перемасштабирование картинок, а на кадрирование только с использованием внешних dll (FreeImage и пр.). А мне хотелось бы обойтись без них.
Вот тут лаконичный совет использовать _GDIPlus_GraphicsDrawImageRect. Но как? Я же не могу в качестве предпоследнего параметра задать отрицательное число...
Подскажите, плиз, на конкретном примере: есть изображение, скажем, 400х700 пикселей. Его надо обрезать до 300х700 пикселей (то есть полоски по 50 пикселей слева и справа). Как это сделать? Без внешних длл, без промежуточного сохранения в файл.
Тут код функции (найденной на английском форуме и переработанной), используемой мной для масштабирования изображения:
Эта функция "вписывает" изображение в окно заданных размеров. А мне нужно предусмотреть вариант, что юзер фиксирует высоту изображения и тогда пропорционально уменьшенное изображение может быть шире имеющегося окна. И это изображение надо обрезать с краев, чтобы оно влезло в окно. Как предусмотреть - вопросов нет, вопрос только в самом механизме обрезки изображения.
Заранее спасибо за любую помощь.
Вот тут лаконичный совет использовать _GDIPlus_GraphicsDrawImageRect. Но как? Я же не могу в качестве предпоследнего параметра задать отрицательное число...
Подскажите, плиз, на конкретном примере: есть изображение, скажем, 400х700 пикселей. Его надо обрезать до 300х700 пикселей (то есть полоски по 50 пикселей слева и справа). Как это сделать? Без внешних длл, без промежуточного сохранения в файл.
Тут код функции (найденной на английском форуме и переработанной), используемой мной для масштабирования изображения:
Код:
$PicPreview = GUICtrlCreatePic("", $CoverWindow_H, $CoverWindow_V, $PreviewSizeW, $PreviewSizeH)
...
$hBMP = _GetImage($CurDir & $CurCover, $PreviewSizeW, $PreviewSizeH, $Color0)
_hBmpToPicControl($PicPreview, $hBMP, 1)
...
Func _GetImage($sFile, $iWH, $iHH, $iBkClr = 0xFFFFFF)
Local $hBmp1, $hBitmap, $hGraphic, $hImage, $iW, $iH, $aGS, $hBmp2
_GDIPlus_Startup()
$hBmp1 = _WinAPI_CreateBitmap($iWH, $iHH, 1, 32)
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp1)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_WinAPI_DeleteObject($hBmp1)
_GDIPlus_GraphicsClear($hGraphic, BitOR(0xFF000000, $iBkClr))
$hImage = _GDIPlus_ImageLoadFromFile($sFile)
$iW = _GDIPlus_ImageGetWidth($hImage)
$iH = _GDIPlus_ImageGetHeight($hImage)
$aGS = _GetScaleNew($iW, $iH, $iWH, $iHH)
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, $aGS[0], $aGS[1], $aGS[2], $aGS[3])
_GDIPlus_ImageDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphic)
$hBmp2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
Return $hBmp2
EndFunc
Func _GetScaleNew($iW, $iH, $iWH, $iHH)
Local $aRet[4]
If $iW = $iWH And $iH = $iHH Then
$aRet[2] = $iWH
$aRet[3] = $iHH
$aRet[0] = 0
$aRet[1] = 0
ElseIf $iW < $iWH And $iH < $iHH Then
$aRet[2] = $iW
$aRet[3] = $iH
$aRet[0] = ($iWH - $iW)/2
$aRet[1] = 0
ElseIf $iW > $iWH Then
$aRet[2] = $iWH
$aRet[3] = ($iH/$iW)*$iWH
$aRet[0] = 0
$aRet[1] = 0
If $aRet[3] > $iHH Then
$aRet[2] = ($iW/$iH)*$iHH
$aRet[3] = $iHH
$aRet[0] = 0
$aRet[1] = 0
EndIf
ElseIf $iH > $iHH Then
$aRet[2] = ($iW/$iH)*$iHH
$aRet[3] = $iHH
$aRet[0] = 0
$aRet[1] = 0
EndIf
Return $aRet
EndFunc
Func _hBmpToPicControl($iCID, ByRef $hBmp, $iFlag = 0)
Local Const $STM_SETIMAGE = 0x0172
Local Const $IMAGE_BITMAP = 0
Local $hOldBmp
$hOldBmp = GUICtrlSendMsg($iCID, $STM_SETIMAGE, $IMAGE_BITMAP, $hBmp)
If $hOldBmp Then _WinAPI_DeleteObject($hOldBmp)
If $iFlag Then _WinAPI_DeleteObject($hBmp)
EndFunc
Эта функция "вписывает" изображение в окно заданных размеров. А мне нужно предусмотреть вариант, что юзер фиксирует высоту изображения и тогда пропорционально уменьшенное изображение может быть шире имеющегося окна. И это изображение надо обрезать с краев, чтобы оно влезло в окно. Как предусмотреть - вопросов нет, вопрос только в самом механизме обрезки изображения.
Заранее спасибо за любую помощь.