2011-01-07 42 views
4

我使用rmagick/imagemagick中的範圍將圖像放在特定大小的畫布上。爲什麼extent(imagemagick)的行爲在我的機器上不統一?

在我的一些機器上,它將它們作爲中心 - 在其他機器上則相反。如果我修復代碼在一臺機器上工作,那麼它就會完全相反。

有誰知道爲什麼會發生這種情況?

+0

您的圖片magick版本在機器之間有所不同嗎?鍵入`mogrify -version`來找出。 – Orbling 2011-01-07 00:49:48

+0

他們不同。我只是要求這個回答我自己的問題,以便其他人能夠找到它。 – 2011-01-07 00:52:55

回答

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構建的活動代碼的正常繼續。相反,人們現在必須編寫支持這個函數的兩個版本的代碼,或者強制升級。

下面的ruby代碼是如何處理這個問題的一個例子,因爲你沒有想法什麼版本的人會在他們的機器上運行。

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']) 
相關問題