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

draw_image() のオーバーロードされた関数を約 8 つ試しましたが、すべて役に立ちませんでした。プログラムを実行すると、メイン ウィンドウに私の DesertSunset 画像が表示されますが、それだけです。landingScreen の上に newgame.pgm を配置しようとしていますが、画像が表示されません。これは深さの問題ですか、それともファイルを構造化する方法ですか? CImg のさまざまなサンプル ファイルを調べましたが、あまり役に立たず、これらの関数に関するドキュメントはせいぜい最小限です。誰かが画像の上に画像を描画する方法の「Hello World」の例を挙げたり、私が間違っていることを教えてくれたりしたら、とても感謝しています。ありがとう!

4

3 に答える 3

1

ImageMagick で次のような 2 つの画像を作成しました。

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 関数は画像をオーバーレイしません。ピクセルを置き換えます。イメージ オーバーレイとアルファ合成を行うには複数の方法があり、手動で実装する必要があります (乗算、オーバーレイなど)。

通常のアルファ ブレンディングでは、各ピクセルを次のように計算します。

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 に答える