parserALT
Страницы форума: ← Назад | 1 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 600 | Дальше →

Класс для работы с изображениями.

#1Александр
25.11.09 01:38 / 01:39
www.parser.ru → | ответить → | в избранное →

Класс для работы с изображениями.

http://www.kulikoff.net/parser3/img/


#Img.p метод @watermark[]
#213 строка
^hParams.add[
^self._getFiles[watermark;$sFileSrc;$sFileDest;$hParams.sFormat;$hParams]
	$.sWMFile[$sDocRoot/$sWMFile]]
	^if(def $hParams.sPosition){
		$.sPosition[^self._getPosition[watermark;$hParams.sPosition]]
	}
]


215 строка, $.sWMFile[$sDocRoot/$sWMFile]]

это же лишнее? :)
#2Misha v.3
→ Александр [#1] | 25.11.09 04:06
www.parser.ru → | ответить → | в избранное →

почему вы так решили?

#3Александр
→ Misha v.3 [#2] | 25.11.09 04:26 / 04:26
www.parser.ru → | ответить → | в избранное →

она зыкрывает ^hParams.add

и в итоге получается ошибка:

if
$.name outside of $name[...]


а закрывать должен следующий ]
#4Misha v.3
→ Александр [#3] | 25.11.09 06:58
www.parser.ru → | ответить → | в избранное →

а. я не заметил вторую скобку...

#5Janek
→ Александр [#3] | 25.11.09 11:24
www.parser.ru → | ответить → | в избранное →
Да... У меня тоже возникло это и еще другие проблемы. Но вообщем класс хароший.
#6Den Kulikoff
→ Janek [#5] | 25.11.09 15:03
www.parser.ru → | ответить → | в избранное →

Сегодня к вечеру обновлю архив

#7Eugene Spearance
→ Den Kulikoff [#6] | 26.11.09 12:44
www.parser.ru → | ответить → | в избранное →

Re: самый главный баг в классе - идеологический

Все методы должны быть свободно перемешиваемы. Чтобы можно было делать одновременный кроп, ресайз и вотермарк в любых комбинациях.

Перекомпрессия после каждой операции - зло.
#8Den Kulikoff
→ Eugene Spearance [#7] | 26.11.09 13:11
www.parser.ru → | ответить → | в избранное →
А кто мешает сохранять картинку без компрессии во время промежуточных операций?
#9Eugene Spearance
→ Den Kulikoff [#8] | 26.11.09 16:33
www.parser.ru → | ответить → | в избранное →

Re: зачем?

если все можно реализовать за один проход.
#10Den Kulikoff
→ Eugene Spearance [#9] | 26.11.09 16:55
www.parser.ru → | ответить → | в избранное →
Когда класс только начинал создаваться, то подобная мысль была, но по каким-то причинам не стал ее реализовывать. Сейчас, если честно, то и не помню уже по каким.

Основное удобство класса в том, что он позволяет работать с изображениями на уровне, который недоступен стандартными средствами. Ну и то, что можно безболезненно переходить с одного скрипта на другой. Мне лично не раз приходилось.
#11Janek
→ Eugene Spearance [#9] | 26.11.09 17:35
www.parser.ru → | ответить → | в избранное →
Вы хотели бы чтоб класс со вызавами методов н.п. resize, rotate, crop (и ещё другие) собирал данные? Потом через метод н.п. render все делал всё в одном проходе nconvert или image magick?
Я делаю temp файлы в формате PNG и в последним шаге выпускаю jpg. Не нужно мне делать всего в одном проходе. Но кагда я бы захотел - не использовалбы класса img.p - но всё делал непосредственно через exec и вызвал бы convert только раз.

Мне нравиться класс - но несколько менил про себя.
#12Janek
→ Den Kulikoff [#6] | 16.04.10 12:38 / 13:53
www.parser.ru → | ответить → | в избранное →

imageMagick.p

###########################################################################
# $Id: ImageMagick.p,v 1.2 2007/05/14 10:45:36 misha Exp $
# Author: Michael V. Petrushin
# Implementation for working with images using ImageMagic: http://www.imagemagick.org/
#	Janek 2010/04/16 10:37:00:
# 	Some fixes + new actions implementation (text + watermark)
###########################################################################


@CLASS
ImageMagick

@USE
Img.p
pf/types/pfString.p

@BASE
Img



###########################################################################
@auto[]
$sDefaultPath[]
$sDefaultScript[convert]
#end @auto[]



###########################################################################
@create[hParam]
^BASE:create[$hParam]
#end @create[]



###########################################################################
@_parseInfo[fInfo][sDummy;tSize]
$result[
	$.hRaw[^hash::create[]]
]
#^throw[;$fInfo.status=$fInfo.text]
^if(!$fInfo.status && def $fInfo.text){
	$sDummy[^fInfo.text.match[^^\s*(\S.+\S):\s+(.+)\s*^$][gm]{
		^result.hRaw.add[$.[$match.1][$match.2]]
		^switch[$match.1]{
			^case[Format]{
				^result.add[$.sFormat[^match.2.match[^^(\S+)\s.*][]{^match.1.lower[]}]]
			}
			^case[Geometry]{
				$tSize[^match.2.split[x][lh]]
				^result.add[
					$.iWidth($tSize.0)
					$.iHeight(^pfString:left[$tSize.1;+])
				]
			}
			^case[Compression;Orientation;Quality]{^result.add[$.[s$match.1][$match.2]]}
			^case[Colormap]{^result.add[$.iColors($match.2)]}
		}
	}]
}
#end @_parseInfo[]



###########################################################################
@_exec[sAction;hParam][position2gravity;correctPath]
^if($hParam.sFormat ne "gif"){
	^hParam.delete[iColors]
}
^if($sAction eq "watermark"){
	^if(!def $hParam.sPosition){
		^throw[;For now - only implemented positioning by ^$.sPosition]
	}
	$position2gravity[^table::create{from	to}]
	^position2gravity.append{top-left	NorthWest}
	^position2gravity.append{top-center	North}
	^position2gravity.append{top-right	NorthEast}
	^position2gravity.append{center-left	West}
	^position2gravity.append{center	Center}
	^position2gravity.append{center-right	East}
	^position2gravity.append{bottom-left	SouthWest}
	^position2gravity.append{bottom-center	South}
	^position2gravity.append{bottom-right	SouthEast}

	^if(!def $hParam.sPosition){
		$hParam.sPosition[center]
	}{
		$hParam.sPosition[^hParam.sPosition.lower[]]
		$hParam.sPosition[^hParam.sPosition.replace[$position2gravity]]
	}
	
	^if($hParam.iAlpha == 100){
		^hParam.delete[iAlpha]
	}
}
^if((def $hParam.sOutput) && !-d ^file:dirname[$hParam.sOutput]){
	^hParam.sOutput.save[^file:dirname[^hParam.sOutput.match[^^$env:DOCUMENT_ROOT][g][]]/null]
}


$result[^switch[$sAction]{
	^case[info]{^file::exec[${sScriptPath}/identify;;-verbose;$hParam.sInput]}
	^case[convert]{^file::exec[$sScript;;$hParam.sInput;^if($hParam.sFormat eq "jpeg"){-flatten};^if($hParam.bRemoveMeta){-strip}{-quiet};-format;$hParam.sFormat;-quality;$hParam.iQuality;^if($hParam.iColors){-colors}{-quiet};^if($hParam.iColors){$hParam.iColors}{-quiet};$hParam.sOutput]}
	^case[rotate]{^file::exec[$sScript;;$hParam.sInput;-background;rgb($hParam.iR,$hParam.iG,$hParam.iB);^if($hParam.sFormat eq "jpeg"){-flatten};-rotate;$hParam.iAngle;^if($hParam.bRemoveMeta){-strip}{-quiet};-quality;$hParam.iQuality;^if($hParam.iColors){-colors}{-quiet};^if($hParam.iColors){$hParam.iColors}{-quiet};$hParam.sOutput]}
	^case[crop]{^file::exec[$sScript;;$hParam.sInput;^if($hParam.sFormat eq "jpeg"){-flatten};^if($hParam.iColors){-colors}{-quiet};^if($hParam.iColors){$hParam.iColors}{-quiet};-quality;$hParam.iQuality;-crop;${hParam.iCropWidth}x${hParam.iCropHeight}+${hParam.iX}+${hParam.iY};^if($hParam.bRemoveMeta){-strip}{-quiet};-format;$hParam.sFormat;$hParam.sOutput]}
	^case[resize]{^file::exec[$sScript;;$hParam.sInput;^if($hParam.sFormat eq "jpeg"){-flatten};-filter;$hParam.sRType;-quality;$hParam.iQuality;^if($hParam.iColors){-colors}{-quiet};^if($hParam.iColors){$hParam.iColors}{-quiet};-resize;${hParam.sWidth}x${hParam.sHeight}^if(!$hParam.bKeepRatio){!}^switch[$hParam.sFlag]{^case[incr]{<}^case[decr]{>}};^if($hParam.bRemoveMeta){-strip}{-quiet};-format;$hParam.sFormat;$hParam.sOutput]}
	^case[watermark]{^file::exec[${sScriptPath}/composite;;-gravity;$hParam.sPosition;^if(def $hParam.iAlpha){-dissolve}{-quiet};^if(def $hParam.iAlpha){$hParam.iAlpha}{-quiet};^if($hParam.bRemoveMeta){-strip}{-quiet};-format;$hParam.sFormat;-quality;$hParam.iQuality;$hParam.sWMFile;$hParam.sInput;$hParam.sOutput]}
	^case[text]{^file::exec[$sScript;;-background;$hParam.background;-fill;$hParam.color;-font;$hParam.font;-pointsize;${hParam.size};label:$hParam.text;$hParam.sOutput]}]
	^case[DEFAULT]{^throw[$sClassName;;Action '$sAction' not implemented yet]}
}]


^if(-f "^file:dirname[$hParam.sOutput]/null" && def $hParam.sOutput){
	^file:delete[^file:dirname[^hParam.sOutput.match[^^$env:DOCUMENT_ROOT][g][]]/null]
}

^if($sAction ne "info" && $hParam.sInput ne $hParam.sOutput){
	^if(!(-f ^hParam.sOutput.match[^^$env:DOCUMENT_ROOT][g][])){
		^throw[;$result.stderr $result.text status: $result.status]
	}
}

#end @_exec[]


@text[sFileDest;sFormat;hParams][fResult]
^if(-f $sFileDest){^file:delete[$sFileDest]}

$hParams[^self._prepareParams[$hParams]]
^if(!def $sFileDest){^throw[$sClassName;text;Destination file MUST be specified]}

^if(!def $hParams.text){^throw[$sClassName;text;Text MUST be specified]}

$hParams.text[^hParams.text.match[((\\n){1,})][g]{\\n}]
$hParams.text[^hParams.text.match[((\n){1,})][g]{\n}]
$hParams.text[^hParams.text.match[(["]{1,})][g]{}]

^if(!def $hParams.background){$hParams.background[transparent]}
^if(!def $hParams.color){$hParams.color['#000']}
^if(!def $hParams.size){$hParams.size(50)}
^if(!def $hParams.font){$hParams.font[Helvetica]}

$hParams.sOutput[$sDocRoot/$sFileDest]
$hParams.sFormat[^self._getDestFormat[$sAction;$sFileSrc;$sFileDest;$sFormat]]

$fResult[^self._exec[text;$hParams]]
$result($fResult.status)

@_getResampleType[sAction;sType]
$result[^switch[$sType]{
	^case[lz;lanczos;]{lanczos}
	^case[g;gaussian]{gaussian}
	^case[m;mitchell]{mitchell}
#	ImageMagic specific
	^case[DEFAULT]{^throw[$sClassName;$sAction;Unknown resample type '$sType']}
}]
#end @_getResampleType[]



###########################################################################
@_getResizeType[sAction;sResizeType]
$result[^switch[$sResizeType]{
	^case[incr;decr]{$sResizeType}
	^case[DEFAULT]{^throw[$sClassName;$sAction;Unknown resize type '$sResizeType']}
}]
#end @_getResizeType[]
#13Janek
→ Den Kulikoff [#6] | 16.04.10 12:44 / 12:44
www.parser.ru → | ответить → | в избранное →

img.p

тот что я бы изменил:

строка 37
@create[hParams][sScriptPath;sScriptName]

на
@create[hParams][sScriptName]


потому что в imageMagick.p должно узнать значение sScriptPath глобально

строка 215
$.sWMFile[$sDocRoot/$sWMFile]

на
$.sWMFile[$sDocRoot/$sWMFile]


слишком много скобок
Страницы форума: ← Назад | 1 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 600 | Дальше →