如何将 Magick::Image 从 ImageMagick 7 转换为 QImage?

问题描述 投票:0回答:1

这在

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
触摸像素出现了问题。我说得对吗?

imagemagick
1个回答
0
投票

我不知道为什么上面的代码不起作用,但我找到了以下解决方案:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.