parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Некорректный умный resize && crop

Никита 14.10.2016 16:29

Добрый день. Делаю preview картинок с помощью ImageMagick. В библиотеке (http://www.parser.ru/lib/img/) есть пример ImageResize, упрощающий изменение размеров изображений. На форуме Миша его кидал.

Вопрос: Как-то некорректно режет картинки метод ^resize[] класса ImageResize. Если исходная картинка имеет ширину меньше чем высоту, то метод почему-то меняет местами переданные параметры sWidth и sHeight. И за место желаемой превьюхи в 345x130, мы получаем 130x345. Для картинок имеющих ширину большую чем высоты, метод отрабатывает отлично. Parser/3.4.4 (compiled on x86_64-unknown-linux-gnu)

Привожу код вызова метода (код немного упростил):
#==Попробуем создать превью
# $srcOriginal[/content/pic/image.jpg]
# $srcFinish[/preview/logopost/pic/image.jpg]
# $width(345)
# $height(130)
^resize[$srcOriginal;$srcFinish;$width;$height;$.type[smart]]


# Метод ресайза превью с учетом пропорциональности
@resize[sFileSrc;sFileDest;sWidth;sHeight;hParams]

$fMeasure[^image::measure[$sFileSrc]]

$hDestSize[
	$.iWidth(^sWidth.int(0))
	$.iHeight(^sHeight.int(0))
]

$hParams[^hash::create[$hParams]]
^switch[$hParams.type]{
	^case[as-is]{
		$bKeepRatio(false)
		$w[$hDestSize.iWidth]
		$h[$hDestSize.iHeight]
	}
	^case[smart]{
#		Что то ну так в этой ветке		
		$bKeepRatio(false)
		^if($fMeasure.width>$fMeasure.height){
			$iSourceBig($fMeasure.width)
			$iSourceSmall($fMeasure.height)
			$hTargetSize[
				$.iWidth($hDestSize.iWidth)
				$.iHeight($hDestSize.iHeight)
			]
		}{
			$iSourceBig($fMeasure.height)
			$iSourceSmall($fMeasure.width)
			$hTargetSize[
				$.iWidth($hDestSize.iHeight)
				$.iHeight($hDestSize.iWidth)
			]
		}
		^if($hDestSize.iWidth>$hDestSize.iHeight){
			$iTargetBig($hDestSize.iWidth)
			$iTargetSmall($hDestSize.iHeight)
		}{
			$iTargetBig($hDestSize.iHeight)
			$iTargetSmall($hDestSize.iWidth)
		}

		$hRatio[
			$.dBig($iSourceBig/$iTargetBig)
			$.dSmall($iSourceSmall/$iTargetSmall)
		]
		^if($hRatio.dBig > $hRatio.dSmall){
			$w[^math:floor($fMeasure.width/$hRatio.dSmall+0.5)]
			$h[^math:floor($fMeasure.height/$hRatio.dSmall+0.5)]
		}{
			$w[^math:floor($fMeasure.width/$hRatio.dBig+0.5)]
			$h[^math:floor($fMeasure.height/$hRatio.dBig+0.5)]
		}
		$iX(0)
		$iY(0)
		^if($w > $hTargetSize.iWidth){
			$iX(($w-$hTargetSize.iWidth)/2)
		}
		^if($h > $hTargetSize.iHeight){
			$iY(($h-$hTargetSize.iHeight)/2)
		}
	}
	^case[DEFAULT;ratio]{
		$bKeepRatio(true)
		$w[$hDestSize.iWidth]
		$h[$hDestSize.iHeight]
	}
}

^try{
	^if(^imMag.resize[$sFileSrc;$sFileDest;$w;$h;^hash::create[$hParams] $.sResizeType[decr] $.bKeepRatio($bKeepRatio)]){
		^throw[$sClassName;resize;Resizing the image is failed.]
	}
	^if(($iX || $iY) && ^imMag.crop[$sFileDest;;$iX;$iY;$hTargetSize.iWidth;$hTargetSize.iHeight;$hParams]){
		^throw[$sClassName;resize;Cropping the image is failed.]
	}
}{
#	bad
}

$response:body[^file::load[binary;$srcFinish]]