【问题标题】:Superposing qimage with transparency用透明度叠加 qimage
【发布时间】:2017-03-28 04:44:35
【问题描述】:

我尝试叠加 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 ? 感谢您的帮助

【问题讨论】:

  • l2l3 的大小是多少?
  • 你为什么不使用 QGraphicsPixmapItem 为你的图像?使用 setZValue 你可以假设它们。
  • m_layer1_data[x][y]m_layer2_data[x][y]m_layer3_data[x][y] 的类型是什么?
  • QPainter 可以完成您想要的所有混合,而且速度很快。您的代码也不会如图所示编译。您必须更改源图像的 alpha,然后简单地将它们绘制在彼此之上。 Painter 也可以更改 alpha,因此所有操作都将使用 SIMD 快速和加速。使用 Painter 时,源图像的大小无关紧要,只要它们对您的应用程序有意义即可。
  • @eyllanesc 看起来他们是QBrush

标签: qt qimage


【解决方案1】:

就像 cmets 中提到的 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 的文档。

【讨论】:

    【解决方案2】:

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

    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());
    
        QImage im(QSize(32,32),QImage::Format_ARGB32);
        QPainter painter(&im);
    
        painter.drawImage(im.rect(),blend);
        painter.drawImage(im.rect(),l2);
        painter.drawImage(im.rect(),l3);
    
        QBrush brush(im);
        return brush;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 2014-02-20
      • 2014-05-21
      • 2017-02-08
      相关资源
      最近更新 更多