2013-01-14 60 views
0

以下尺寸爲1x9的圖像將被修剪爲1x6,因爲推測頂部的像素與底部的像素顏色相同並且在修剪功能中,即使在執行修剪功能之前報告backgroundColor爲#FFFFFF,也會將這些像素識別爲背景顏色。Magick ++修剪不屬於backgroundColor的像素(圖像頂部和底部的像素顏色相同)

http://s1.postimage.org/a7r69yxsr/m_medium_bc.png

我做的是執行修剪的圖像的唯一的事。顯式設置backgroundColor和/或transparent()沒有區別。

  1. 爲什麼會發生這種情況,這是預期的行爲?
  2. 可以通過配置/屬性設置修改/不更改Graphicsk庫代碼嗎?
  3. 如果不是,該錯誤何時能解決?你預計在接下來的幾天內會修復這種性質的錯誤嗎?

下面是代碼:

Magick::Image tempImage; 
tempImage.read(name); 
std::cout<<"size:"<<tempImage.columns()<<","<<tempImage.rows()<<std::endl; 
temp=tempImage.backgroundColor(); 
std::cout<<"bg:"<<(std::string)temp<<std::endl; 
tempImage.trim(); 
std::cout<<"size:"<<tempImage.columns()<<","<<tempImage.rows()<<std::endl; 
+0

你能發佈你正在使用的確切命令嗎? – PinnyM

+0

這發生在GraphicsMagick的GetBoundingBox(我頭頂的名字?)函數中,並且可以相對容易地修復。這個功能的結果在它的意圖/有用性方面是獨特的。它將圖像角落處的顏色作爲背景顏色處理。 – MetaChrome

回答

0

我同意,這種行爲很奇怪,我不是ImageMagick的/ Magick的開發者/維護者++所以不能進一步評論,這是否是一個錯誤或'功能'。但是我有同樣的問題,並創造了這個功能作爲一種變通方法(注意,這是比手動迭代像素快得多,即使在發生像素高速緩存):

Magick::Geometry CalculateImageMagickBoundingBox(const Magick::Image & image, const Magick::Color & borderColor) 
{ 
    // Clone input image. 
    Magick::Image clone(image); 

    // Remember original image size. 
    const Magick::Geometry originalSize(image.columns(), image.rows()); 

    // Extend geometry by two in width and height (one pixel border). 
    Magick::Geometry extendedSize(originalSize.width() + 2, originalSize.height() + 2); 

    // Extend cloned canvas (center gravity so 1 pixel border of user specified colour). 
    clone.extent(extendedSize, borderColor, Magick::CenterGravity); 

    // Calculate bounding box (will use border colour, which we have set above). 
    Magick::Geometry boundingBox = clone.boundingBox(); 

    // We added 1 pixel border, so subtract this now. 
    boundingBox.xOff(boundingBox.xOff() - 1); 
    boundingBox.yOff(boundingBox.yOff() - 1); 

    // Clamp (required for cases where entire image is border colour, and therefore the right/top borders 
    // that we added are taken into account). 
    boundingBox.width(std::min(boundingBox.width(), originalSize.width())); 
    boundingBox.height(std::min(boundingBox.height(), originalSize.height())); 

    // Return bounding box. 
    return boundingBox; 
} 

你的具體情況,您可以使用此函數,然後根據返回的幾何設置畫布大小。