0

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

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”示例来说明如何在图像上绘制图像,或者告诉我我做错了什么,我将不胜感激。谢谢!

4

3 回答 3

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");
}

得到了这个:

在此处输入图像描述

于 2016-05-28T21:35:36.677 回答
0

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

于 2016-04-11T11:56:08.457 回答
-1

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

landingScreen.diplay(main_disp);

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

于 2013-06-03T20:35:39.323 回答