3

Visual Studio 2010 で libpng と組み合わせて CImg を使用して、png 画像を表示しています。CImg を使用して画像を表示すると、透明度が正しく表示されないように見えます。これが CImg の概念を完全に理解していない、私が犯している間違い、またはその両方の組み合わせである場合、私は訴えません!

説明されている問題を示す画像

左の画像は、Windows フォト ビューアーで開いた画像を示しています。背景は予想どおり透明です。右の画像は、実際には純白の背景を表示している CImg ディスプレイを示しており、キャラクターの周りに奇妙な茶色の領域がいくつかあります。

CImg は 4 番目のアルファ チャネルで png をロードしています (右の画像ウィンドウのタイトルに示されているように)。CImg ディスプレイの領域にマウスを合わせると、小さなポップアップ (右の画像の左下) に正しい透明度の値が表示されます。透明度の値に関係なく、CImg はすべてを描画しているように見えますか?

私の質問は、どうすれば Cimg に透明なセクションを含む pgn を正しく表示させることができるでしょうか?

この例の私のコードは次のとおりです。

#define cimg_use_png
#include <CImg.h>
using namespace cimg_library;

int main()
{
    CImg<unsigned char> image("image.png");
    image.display();
    return 0;
}
4

1 に答える 1

4

CImg のデフォルトの表示ビューアーは、画像の最初の 3 つのチャンネルのみを表示します。4 番目のチャネルが実際には透明度チャネルであることも無視します。それは別のものである可能性があります (たとえば、CMYK でコード化された画像の K チャネル)。CImg はこの種の情報を保存しません。これにより、ユーザーは最終的に何を操作したかを知ることができます。透過性のための 4 番目のチャネルがあり、それを CImg に表示する場合は、次のような小さなレンダリング手順を自分で作成する必要があります。

CImg<unsigned char> render(img.width(),img.height(),1,3,255);
render.draw_image(0,0,0,0,img,img.get_channel(3),1,255);

(「img」が 4 チャンネルの画像であると仮定します)。'render' は、最初の (透明な) イメージを白い背景の上にレンダリングした RGB カラー イメージです。

于 2013-01-03T14:45:09.673 に答える