2011-01-07 4 views
4

rmagick/imagemagickでエクステントを使用して、特定のサイズのキャンバス上にイメージを配置します。エクステント(imagemagick)の動作がマシン間で統一されていないのはなぜですか?

私のマシンの中には、それらを中心に置いているものもあれば、それを反対にするものもあります。あるマシンで動作するようにコードを修正すれば、他のマシンではまったく逆の動作になります。

これはなぜ起こっているのですか?

+0

マシン間でイメージmagickのバージョンが異なりますか?調べるには 'mogrify -version'と打ちます。 – Orbling

+0

彼らは異なっていた。私はちょうど自分の質問に答えるようにこれを頼んだので、他の人がそれを見つけることができるでしょう。 –

答えて

5

私は実際には、コードで苦労して5時間後に答えを知っていました。参照のためにこれを投稿するだけです。

は、いくつかの(と私は愚かだと思う)、未知の理由で、これはImageMagickの更新履歴に登場:

2010-09-13 6.6.4-2 Cristy <[email protected]> 
# Don't negate the geometry offset for the -extent option. 

何らかの理由で、ImageMagickのチームは、文字通りEXACT を行うための機能を変更しても大丈夫と判断しましたそれが歴史的に何があったのかについては、がリリースされました。

この関数はそのままで、新しい振る舞いを持つ特別な関数が導入されていて、元の関数がいくつかのリリースで廃止されました(警告付き)。

このような戦略は、このような変更を処理する標準的な方法であり、ImageMagickに対して構築されたアクティブなコードを持つ人たちが正常に続行できるようにするでしょう。代わりに、人々はこの関数の両方のバージョンをサポートするコードを書くか、アップグレードを強制する必要があります。

次のルビコードは、誰かが自分のマシン上でどのバージョンを実行しているかを知らないので、これを処理する方法の例です。

offset_coords= { 'x' => 100 , 'y' => 100 } 
expects_negated = true 
# ImageMagick 6.6.4-2 changed the behavior of extent 
# me: !(*@&#(#! . 
#mversion = "ImageMagick 6.6.4-1 2010-12-07 Q16 http://www.imagemagick.org" 
mversion = Magick::Magick_version 
(v_version , v_commit) = mversion.split(' ')[1].split('-') 
(v_version_1 , v_version_2 , v_version_3) = v_version.split('.') 
if Integer(v_version_1) >= 6 and Integer(v_version_2) >= 6 and Integer(v_version_3) >= 4 and Integer(v_commit) >= 2 
    expects_negated= false 
end 
if expects_negated 
    offset_coords['x'] = - offset_coords['x'] 
    offset_coords['y'] = - offset_coords['y'] 
end 

@new_image.background_color= "#000000" 
@new_image = @new_image.extent(target_dimensions['w'] , target_dimensions['h'] , offset_coords['x'] , offset_coords['y']) 
+0

痛みのビット、悲しいことに世界でユニークではありません。 – Orbling

+0

ImageMagickからもっと多くのことを正直に思います。私のルビーコードは、(PythonとPerlにネイティブな)多くの改善を使用する可能性がありますが、十分に機能します。 –

関連する問題