【问题标题】:Blending two different images in Qt在 Qt 中混合两个不同的图像
【发布时间】:2012-06-22 17:45:54
【问题描述】:

我的程序生成 3 张不同的图像,我想使用一些不透明度设置将它们组合起来。

首先我有原始图像,我已经将其转换为 QPixmap 以将其显示在 QGraphicsView 中。

.

然后我对这张图片进行一些计算并生成一个 QImage,因为我需要基本的像素访问,我还添加了一个图例。

.

我想做的是能够混合两个图像,同时能够修改不透明度。 我没有展示示例的工具,它应该如下所示:

但是第一张图像和数据图像混合了不透明度。我也希望这个传说保持 100% 可见。如果需要,我可以为图例创建不同的 QImage。

我也确切地知道哪个像素应该被视为透明而不是白色。

将来我想只用一个滑块来调整不透明度,所以我认为如果有一个解决方案不涉及每次都计算一个全新的图像会更好......

任何线索将不胜感激......

【问题讨论】:

    标签: c++ qt opacity qimage qpixmap


    【解决方案1】:

    有一个支持 alpha 通道的 QImage 类型 QImage::Format_ARGB32_Premultiplied 将显示两个图像,其不透明度由 alpha 控制 - 只需将两个 QImage 绘制在彼此的顶部

    但它是预乘的,所以如果你改变A,你需要调整所有的像素

    【讨论】:

    • 每次更改 A 时都必须调整所有像素加上必须将第一个 QPixmap 转换为 QImage 真的很困扰我,我想找到一些更有效的东西,但我会挖掘如果我没有找到其他任何东西,你的想法。
    • 不需要转换成像素图,反正QImage显示是用HW完成的。
    • 我不知道HW是什么,所以我可能不完全理解你的句子,但你说的是哪个像素图?
    • @leo - 抱歉,QPixmap 仅在您绘制大量相同的小图像时才有用。否则,您可以完全在 QImage 中工作并将 QImages 直接绘制给画家。绘制 QImage 并在硬件 (HW) 中完成混合,即由显卡完成,因此如果使用 ARGB32 格式则速度很快
    • 我认为您的建议应该可行,但 Pete 的解决方案似乎更容易用我的代码实现。
    【解决方案2】:

    您可以使用 QGraphicsPixmapItem::setOpacity 将覆盖图像的 alpha 混合值设置在 0.0...1.0 范围内,并为背景和前景设置单独的图形项。

    如果您确实需要使用混合图像生成像素图,您可以在绘制像素图之前在 QPainter 上使用 setOpacity。

    【讨论】:

    • 我按照你的建议做了,但是我有最后一个问题,我的 QImage 的白色像素也被混合了,你知道如何避免这种情况吗?我希望白色像素表现得像透明一样。我现在拥有的照片:Picture
    • 为什么不把原始图像放在带有图例的图像顶部,并修改原始图像的不透明度呢?或者原始图像中是否有需要设置为透明的项目?在这种情况下,您需要修改原始图像以将这些像素的 alpha 值设置为 0。
    • 这就是我所做的,但我仍然遇到同样的问题:like this。我更改了原始图像的不透明度并将图例和数据可视化放在下面,但最后一个的白色仍然与原始图像混合。
    • @Leo 您应该拆分图例和“叠加图像”(蓝色/白色)。对于叠加图像,在将其分配给图形项之前,将白色像素替换为透明像素。然后将叠加层放在原始图像上方并应用不透明度。反过来,正如 Pete 所建议的那样,原始图像在覆盖层(然后将在原始图像下方)应该透明的部分也具有不透明度的问题。或者将原始图像放在覆盖层下方(完全不透明)和上方(部分不透明)。但无论如何你需要透明度而不是白色像素
    • QImage::Format_RGB888 没有 Alpha 通道。您需要QImage::Format_ARGB32..._Premultiplied。 (qt-project.org/doc/qt-4.8/qimage.html#Format-enum) 注意: “某些操作(例如使用 alpha 混合的图像合成)使用预乘 ARGB32 比使用普通 ARGB32 更快。” ——所以这正是你所需要的。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    相关资源
    最近更新 更多