ImageMagick v7 --
パーセントエスケープと FX 式の開発
すべての引数におけるパーセントエスケープの使用 (IMv7 で実装)
これは、非常に多くのソースから、さまざまな形で出てきた提案です。基本的には、メモリ上またはディスク上の画像から色、画像の幅、高さを取得する方法です。基本的に、ユーザーがすべてのオプション引数でエスケープ置換を使用できるようにします。問題は、「パーセント」記号は「geometry」式などで特別な「フラグ」としてもよく使用されるため、展開すべきではないということです。設定は、数値、色、引数、メソッド名、ファイル名、さらには操作シーケンス(複雑な関数など)を保持するために使用できます。警告: 一部のオプションでは、パーセントエスケープの展開が遅延されます。たとえば、「
-define
」、「-label
」、「-caption
」、「-comment
」、「-format
」などです。 これらは、すべてのパーセントエスケープを含む指定された文字列を変更せずに格納する必要があります。「-label
」は「-define label=...
」と同等であり、定義が実際に使用されるまでパーセントエスケープを実行しないことに注意してください(遅延エスケープ)。実装された提案....
提案:すべての引数でパーセントエスケープを許可しますが、パーセントエスケープが認識されるタイミングを正確に制限します。具体的には、% の前に数字がある場合は、数字のパーセンテージであるため、展開しないでください。100%x30 rgb(100%,100%,100%,.5)より具体的には:パーセントの前に数字がなく、 '[' が続くか、別の '%' でエスケープされていない場合に、パーセントエスケープを展開します。これにより、数字の後のパーセント規則をオーバーライドできます。つまり、これらは展開またはエスケープされます...しかし、これらはパーセントエスケープとして展開されます...
100%% %wx%h max=%[maximum] 100%[x]30つまり、二重パーセントは単一パーセント(エスケープ)に縮小されます。
他のものは前に数字がないか、 '[' が続きます。'
100%x30
' は 'x
' を展開しませんでしたが、'100%[x]30
' は '%[x]
' (X 解像度または密度) を展開します。大きな問題は、それが過度に複雑であり、スクリプトでパーセントエスケープも使用する DOS ユーザーにいくつかの問題を引き起こす可能性があることです。しかし、一般的に、ほとんどの場合、ユーザーが期待するように動作することを意味します。失敗するのは、パーセントプレフィックス文字の前に数字が指定されている場合のみです。実際の使用例...magick -size 100x100 xc: -print '45%x\n' null: 45%x magick -size 100x100 xc: -print '45%[h]\n' null: 45100 magick -size 100x100 xc: -print '45x%h\n' null: 45x100 magick -size 100x100 xc: -print '%wx%h\n' null: 100x100
パーセントエスケープの拡張...
パーセントエスケープに関する既存の小さな問題を軽減するための提案。- 「
%[w]
」を単に「%w
」と同等にすることを許可します。現在、これは機能していません。「%[width]
」は同じ意味ではないことに注意してください!つまり、現在の幅ではなく、画像の元の幅です。 - より多くの属性、特に操作設定へのアクセス。たとえば、「
%[fill]
」、「%[background]
」、「%[mattecolor]
」などです。 - この拡張の一環として、「
-set background
」は「-background
」コマンドと同等である必要があります。実際、ほとんどの設定はこの方法で処理できます。「-define label=...
」と「-set label ...
」の使用方法の違いにも注意してください。 - 色名または rgb() 値を返す「
%[pixel:...]
」以外にも、代替の色文字列エスケープを用意します。たとえば、カラー出力を 'rgb(...)
' 形式に強制する「%[rgb:...]
」と「%[rgba:...]
」。そして、カラースペースに依存しない '#......
' 形式の「%[hexcolor:...]
」。-- 実装されていません
ここから先は実装されていません
その他の既存の問題 (IMv7)...
- 画像間のプロパティのコピー... 現在、たとえば画像 3 のコメントにアクセスして画像 1 のコメントの設定に使用することはできません。
- 複数画像の文字列選択... 何らかの数値に基づいて文字列を選択することはできません。たとえば、次のような擬似コードを実装することはできません
if %w > 500 then "too wide code", otherwise "normal code"
おそらくブール文字列セレクター?
%[select: %[fx:w>500] : %[value1] : %[value2] ]
しかし、それは私には面倒に思えます。また、文字列比較による選択もできません!
if %m == 'JPG' then "Lossy", otherwise "non-Lossy"
一方、数値と色の選択は FX を使用して行うことができます。つまり、これは機能します...
%[pixel:w>h?red:blue]
または、広すぎる画像のみを縮小するには...
-resize '%[fx: w>500 ? 500 : w ]x'
理想的には、文字列処理 (パーセントエスケープ) と数値演算 (FX 式) の両方をより完全にマージする必要があります。文字列の良いマクロ処理が必要です。
パーセントエスケープのフォーマット...
現在、-precision 設定を使用して FX 式から得られる数値のフォーマットは最小限です。桁数、先行スペース、配置を指定することはできません。同様に、%X などの単純な数値パーセントエスケープを希望どおりにフォーマットする方法はありません。たとえば、常に先行する数値記号を含めるには。提案された解決策:'%[...][format]
' ここで '...' は通常のパーセントエスケープであり、'format' は単一の浮動小数点数または文字列の printf() 形式です。(整数の %x 形式は許可されますか - 色の場合?)たとえば:'%[w][%03g]
' は、先行ゼロを使用して少なくとも 3 桁を含む画像幅です。または、'%[fx:100*s.h/u.h][%06.2f]%%
' は、現在の画像リストの最初の画像に対する相対的な高さのパーセンテージを計算しますが、先行ゼロで埋められた 6 桁の長さの文字列と、小数点以下 2 桁、および最後のパーセント記号を出力します。たとえば、上記の式の結果は「098.30%
」のようになります。これは、文字列を X 文字にスペースを空けるためにも使用できます。たとえば.. %[background][%-20s] 注:このスキームでは、フォーマットが希望どおりでない場合は '[' をエスケープする必要があります。例: %[f]\[] 代替案... %[..] printf スタイルの文字列関数を使用します。
%[printf:format:argument]
たとえば
%[printf:%%03g:%w]
これにより、フォーマット文字列と引数もパーセントエスケープを展開できます! %[..] は %[..] のネストを処理できますか?また、文字列内の単一の ']' はどうですか?
これは、printf 形式に % を含めるには %%%% が必要になることを意味しますか?
FX 式の処理
Initial Recommendations... * FX access to image information, including user defined numerical 'properties' and 'artifacts', possibly even evaluate expressions. For example pre-calculate and save statistic information and constants into pre-image properties or global artifacts, then call FX which uses that pre-calculated numbers so as to avoid recalculating them all the time. EG: -define fx:angle=10 -fx 'r*log(angle)' * Saving FX constants into properties. This will allow you to do your own 'tally' of image information, and each FX expression is parsed. Note that some values may be different for different images!!! Problems... * Single letter variable names in FX do not match those in percent escapes? * What if you want to access the meta-data of a different image? You can access pixel data, why not metadata? Additional Recommendations * FX expression first parsed into an execution tree * FX variables are both numbers and strings (like awk) * Remove '%' to mean modulus, but 'setting lookup' instead. Or again only allow %[...] as being different to just % * Various string processing functions. * Allow FX to format strings and numbers for output. Discussion... https:///magick.imagemagick.org/viewtopic.php?f=1&t=19273 Specially involving the security concerns of allowing 'eval' or repeated execution of arguments. That is, what if FX expressions are found in a input string? ---- FX Access to Percent Escapes (simple numbers and colors) For example tint a image by the background color... -fx '( u + %[background] )/2' The %[background] will be replaced by the current background color value of the image in the expression before being executed across the whole image. However for FX this may mean that the modulus operator '%' may either always need doubling (%%), OR replacing that operator with a mod() function. Alternately only allow %[...] syntax in FX expressions. NOTE: I will also have the problem of percent escapes in percent escapes. For example -background '%[pixel: ( u.p{0,0} + %[fill] ) / 2 ]' So I need to make sure that percent escapes become savvy enough to allow embedded percent escapes