用透明度叠加qimage

时间:2017-03-27 19:44:28

标签: qt qimage

我试图叠加3个QImage,但我有一些警告,例如:

QImage::pixelColor: coordinate (31,30) out of range

混合的结果是黑色图像。

这是我的代码:

QBrush MainWindow::blendLayer(int x, int y){
    QImage blend(m_layer1_data[x][y]->background().textureImage());
    QImage l2(m_layer2_data[x][y]->background().textureImage());
    QImage l3(m_layer3_data[x][y]->background().textureImage());

    for(int a = 0; a < blend.width(); a++){
        for(int b = 0; b < blend.height(); b++ ){
            blend.setPixelColor(a,b,blendColor(blend.pixelColor(a,b),l2.pixelColor(a,b),l3.pixelColor(a,b)));
        }
    }
    QBrush brush(blend);
    return brush;
}

QColor MainWindow::blendColor(QColor c2, QColor c1){
    QColor c3;
    c3.setRed(((c1.red()+c2.red())/2)%256);
    c3.setGreen(((c1.green()+c2.green())/2)%256);
    c3.setBlue(((c1.blue()+c2.blue())/2)%256);
    c3.setAlpha(((c1.alpha()+c2.alpha())/2)%256);
    return c3;
}

QColor MainWindow::blendColor(QColor c1, QColor c2, QColor c3){
    return blendColor(c3,blendColor(c1,c2));
}

有没有一种简单的方法来叠加一些QImage? 谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

与评论中提到的 Kuba Ober 一样,最好的方法是以这样的方式使用QPainter

//[...]
QPainter p(&myWidgetOrSurface);
p.setCompositionMode(QPainter::CompositionMode_Source);
p.drawRect(myWidgetOrSurface.size());
p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
p.drawImage(image1);
p.end();
p.begin(image2);
p.drawImage(surface);
p.end();
//[...]

以下是the different blend modes supported by Qt and QPainter的文档。

答案 1 :(得分:0)

非常感谢我找到了QPainter的解决方案

SKAction