Класс для работы с изображениями. http://www.kulikoff.net/parser3/img/
^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]] это же лишнее? :)почему вы так решили? она зыкрывает ^hParams.add и в итоге получается ошибка:if $.name outside of $name[...] а закрывать должен следующий ] а. я не заметил вторую скобку... Да... У меня тоже возникло это и еще другие проблемы. Но вообщем класс хароший. Сегодня к вечеру обновлю архив Re: самый главный баг в классе - идеологический Все методы должны быть свободно перемешиваемы. Чтобы можно было делать одновременный кроп, ресайз и вотермарк в любых комбинациях. Перекомпрессия после каждой операции - зло. А кто мешает сохранять картинку без компрессии во время промежуточных операций? Re: зачем? если все можно реализовать за один проход. Когда класс только начинал создаваться, то подобная мысль была, но по каким-то причинам не стал ее реализовывать. Сейчас, если честно, то и не помню уже по каким. Основное удобство класса в том, что он позволяет работать с изображениями на уровне, который недоступен стандартными средствами. Ну и то, что можно безболезненно переходить с одного скрипта на другой. Мне лично не раз приходилось. Вы хотели бы чтоб класс со вызавами методов н.п. resize, rotate, crop (и ещё другие) собирал данные? Потом через метод н.п. render все делал всё в одном проходе nconvert или image magick? Я делаю temp файлы в формате PNG и в последним шаге выпускаю jpg. Не нужно мне делать всего в одном проходе. Но кагда я бы захотел - не использовалбы класса img.p - но всё делал непосредственно через exec и вызвал бы convert только раз. Мне нравиться класс - но несколько менил про себя. imageMagick.p ###########################################################################
###########################################################################
@CLASS
ImageMagick
@USE
Img.p
pf/types/pfString.p
@BASE
Img
###########################################################################
@auto[]
$sDefaultPath []
$sDefaultScript [ convert]
###########################################################################
@create[ hParam]
^BASE:create [ $hParam ]
###########################################################################
@_parseInfo[ fInfo][ sDummy;tSize]
$result [
$.hRaw [ ^hash::create []]
]
^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 )]}
}
}]
}
###########################################################################
@_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 ]
}
}
@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}
^case [ DEFAULT]{ ^throw [ $sClassName ;$sAction ;Unknown resample type '$sType ']}
}]
###########################################################################
@_getResizeType[ sAction;sResizeType]
$result [ ^switch [ $sResizeType ]{
^case [ incr;decr]{ $sResizeType}
^case [ DEFAULT]{ ^throw [ $sClassName ;$sAction ;Unknown resize type '$sResizeType ']}
}]
img.p тот что я бы изменил: строка 37@create[ hParams][ sScriptPath;sScriptName] на@create[ hParams][ sScriptName] потому что в imageMagick.p должно узнать значение sScriptPath глобально строка 215$.sWMFile [ $sDocRoot /$sWMFile ] на$.sWMFile [ $sDocRoot /$sWMFile ] слишком много скобок