Наложение изображений с помощью CImg

Кажется, это было бы очень просто, но у меня много проблем с использованием функции draw_image () в CImg. Вот фрагмент кода:

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», как нарисовать изображение поверх изображения, или сказать мне, что я делаю не так, я был бы очень признателен. Спасибо!


person user2446036    schedule 02.06.2013    source источник


Ответы (3)


Я создал два таких изображения с помощью 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");
}

И получил вот это:

введите здесь описание изображения

person Mark Setchell    schedule 28.05.2016

После рисования вам также необходимо обновить окно отображения:

landingScreen.diplay(main_disp);

Вы выбираете, когда обновляется окно дисплея. Некоторые запущенные потоки не делают этого автоматически.

person bvalabas    schedule 03.06.2013
comment
Я добавил это, но он по-прежнему не работает. У меня draw_circle () работает нормально, но draw_image () по-прежнему ничего не делает. - person user2446036; 04.06.2013

Функция CImg.draw_image не накладывает изображения. Заменяет пиксели. Существует несколько способов наложения изображений и альфа-компоновки, и их необходимо реализовать вручную (например, умножение, наложение и т. Д.).

Для нормального альфа-смешивания каждый пиксель рассчитывается следующим образом:

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

person Francois Zard    schedule 11.04.2016