Обрезка пикселей Magick ++, которые не имеют backgroundColor (пиксели одинакового цвета вверху и внизу изображения)

Следующее изображение размером 1×9 обрезается до 1×6, поскольку предположительно, что пиксель вверху имеет тот же цвет, что и пиксель внизу, и в функции обрезки эти пиксели идентифицируются как цвет фона, даже если сообщается 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;

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

В вашем конкретном случае вы можете использовать эту функцию, а затем установить размер холста на основе возвращенной геометрии.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]