【问题标题】:Overlaying images with CImg用 CImg 覆盖图像
【发布时间】:2013-06-02 22:25:00
【问题描述】:

看起来这很容易,但是我在使用 CImg 中的 draw_image() 函数时遇到了很多问题。这是一段sn-p代码:

CImg<unsigned char> landingScreen("desertSunset.bmp"), newGameBTN("newgame.pgm");
CImgDisplay main_disp(landingScreen,"Main Window");
landingScreen.draw_image(400,400,newGameBTN);

我已经尝试了大约 8 个 draw_image() 的重载函数,但都无济于事。当我运行程序时,主窗口会弹出我的desertSunset 图像,仅此而已。我正在尝试将 newgame.pgm 放在landingScreen 上,但图像没有显示。这是深度问题,还是我构建文件的方式?我查看了一堆不同的 CImg 示例文件,但它们并不是很有帮助,而且关于这些函数的文档充其量是最少的。如果有人可以给出一个“Hello World”示例来说明如何在图像上绘制图像,或者告诉我我做错了什么,我将不胜感激。谢谢!

【问题讨论】:

    标签: image cimg


    【解决方案1】:

    我用 ImageMagick 创建了两个这样的图像:

    convert -size 400x300 gradient:red-black PNG24:gradient.png
    

    convert -size 100x100 xc:yellow overlay.png
    

    然后运行这个CImg 代码:

    #define cimg_use_png
    #define cimg_display 0
    #include "CImg.h"
    using namespace cimg_library;
    int main() {
       CImg<unsigned char> gradient("gradient.png");
       CImg<unsigned char> overlay("overlay.png");
       gradient.draw_image(80,150,overlay);
       gradient.save_png("result.png");
    }
    

    得到了这个:

    【讨论】:

      【解决方案2】:

      CImg.draw_image 函数不会覆盖图像。它取代了像素。 有多种方法可以进行图像叠加和 alpha 合成,它们需要手动实现(例如乘法、叠加……)。

      对于正常的 alpha 混合,这是计算每个像素的方式:

      A = srcA + dstA ( 1 - srcA)
      R = (srcR * srcA + dstR * dstA * ( 1 - srcA)) / A
      G = (srcG * srcA + dstG * dstA * ( 1 - srcA)) / A
      B = (srcB * srcA + dstB * dstA * ( 1 - srcA)) / A

      【讨论】:

        【解决方案3】:

        绘制后,您还需要刷新显示窗口:

        landingScreen.diplay(main_disp);
        

        您可以选择刷新显示窗口的时间。它不是由一些正在运行的线程自动完成的。

        【讨论】:

        • 我加进去了,但还是不行。我让 draw_circle() 工作得很好,但 draw_image() 仍然没有做任何事情。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-06
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多