0

次のサイズ1x9の画像は1x6にトリミングされています。これは、おそらく上部のピクセルが下部のピクセルと同じ色であり、トリム機能では、backgroundColorが報告されていても、これらのピクセルが背景色として識別されているためです。トリム関数の実行前は#FFFFFFです。

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;
4

1 に答える 1

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;
}

特定のケースでは、この関数を使用して、返されたジオメトリに基づいてキャンバス サイズを設定できます。

于 2014-07-02T11:31:44.400 に答える