这在
ImageMagick 6
中是一项相当简单的任务,只需 getConstPixels()
、ColorRGB
就完成了。
但是我无法用
ImageMagick 7
完成同样的任务,我得到了一个丑陋的、大部分是粉红色的东西。
我做错了什么?
QImage
convert( const Magick::Image & img )
{
QImage qimg( static_cast< int > ( img.columns() ),
static_cast< int > ( img.rows() ), QImage::Format_RGB888 );
using Quantum = MagickCore::Quantum;
const Quantum * pixels;
for( int y = 0; y < qimg.height(); ++y)
{
pixels = img.getConstPixels( 0, y, static_cast< std::size_t > ( qimg.width() ), 1 );
for( int x = 0; x < qimg.width(); ++x )
{
int red = 0;
int green = 0;
int blue = 0;
if( MagickCore::GetPixelRedTraits( img.constImage() ) )
red = ( (double) GetPixelRed( img.constImage(), pixels ) /
(double) QuantumRange ) * 255;
if( MagickCore::GetPixelGreenTraits( img.constImage() ) )
green = ( (double) GetPixelGreen( img.constImage(), pixels ) /
(double) QuantumRange ) * 255;
if( MagickCore::GetPixelBlueTraits( img.constImage() ) )
blue = ( (double) GetPixelBlue( img.constImage(), pixels ) /
(double) QuantumRange ) * 255;
qimg.setPixel( x, y, QColor( red, green, blue ).rgb() );
pixels += MagickCore::GetPixelChannels( img.constImage() );
}
}
return qimg;
}
谢谢你。
正如我所猜测的,在
ImageMagick 7
中,通过 X, Y
触摸像素出现了问题。我说得对吗?
我不知道为什么上面的代码不起作用,但我找到了以下解决方案:
QImage
convert( const Magick::Image & img )
{
QImage qimg( static_cast< int > ( img.columns() ),
static_cast< int > ( img.rows() ), QImage::Format_ARGB32 );
for( int y = 0; y < qimg.height(); ++y )
{
for( int x = 0; x < qimg.width(); ++x )
{
Magick::PixelInfo p = img.pixelColor( x, y );
qimg.setPixel( x, y, QColor( MagickCore::ScaleQuantumToChar( p.red ),
MagickCore::ScaleQuantumToChar( p.green ),
MagickCore::ScaleQuantumToChar( p.blue ),
MagickCore::ScaleQuantumToChar( p.alpha ) ).rgba() );
}
}
return qimg;
}