4
我使用rmagick/imagemagick中的範圍將圖像放在特定大小的畫布上。爲什麼extent(imagemagick)的行爲在我的機器上不統一?
在我的一些機器上,它將它們作爲中心 - 在其他機器上則相反。如果我修復代碼在一臺機器上工作,那麼它就會完全相反。
有誰知道爲什麼會發生這種情況?
我使用rmagick/imagemagick中的範圍將圖像放在特定大小的畫布上。爲什麼extent(imagemagick)的行爲在我的機器上不統一?
在我的一些機器上,它將它們作爲中心 - 在其他機器上則相反。如果我修復代碼在一臺機器上工作,那麼它就會完全相反。
有誰知道爲什麼會發生這種情況?
我實際上已經知道答案 - 經過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'])
您的圖片magick版本在機器之間有所不同嗎?鍵入`mogrify -version`來找出。 – Orbling 2011-01-07 00:49:48
他們不同。我只是要求這個回答我自己的問題,以便其他人能夠找到它。 – 2011-01-07 00:52:55