プロが教える店舗&オフィスのセキュリティ対策術

VC2005のMFCで画像を表示させているのですが、透過表示する方法がわかりません。

OnDraw(CDC* pDC)

で、#include <atlimage.h>として、

CImage img;
img.Load( "test.gif" );
CDC* pDCImg = CDC::FromHandle( img.GetDC() );
pDC->BitBlt( 60, 10, img.GetWidth(), img.GetHeight(), pDCImg, 0, 0, SRCCOPY );
img.ReleaseDC();


すればGIF画像が表示されましたが、このGIG画像は透過GIFですが
そのまま表示されているので、背景が黒の場合透、明部分の白が見えて
四角い枠の画像となります。

GIF透過ファイルの場合、そのまま透過になる方法や、何か手段を用いて透過をさせたいです。

A 回答 (3件)

ごめんなさい GetColorTableなどは使えないようです


当方で実験したところ gifを読み込んだ時点の CImageクラス内部での表現が現在のWindowsシステムの設定に依存するようです
256色パレットモードではなく 32ビットのBMPとして取り込まれていました

したがって CDCのTrabsparentBltで行ったほうが良いでしょう
int w = img.GetWidth();
int h = img.GetHeight();
COLORREF col = img.GetPixel( 0, 0 );
pDC->TransparentBlt( 0, 0, w, h, pDCImg, 0, 0, w, h, col );

またパレットが取得できる場合の検索方法ですが
COLORREF col = img.GetPixel( 0, 0 );
RGBQUAD pal[256];
img.GetColorTable( 0, 256, pal );
int nIndex = -1;
for n = 0; n < 256; n++ ) {
  if ( ( pal[n].rgbRed == ( col & 0xFF ) ) &&
     ( pal[n].rgbGreen == ( ( col & 0xFF00 ) >> 8 ) ) &&
     ( pal[n].rgbBlue == ( ( col & 0xFF0000 ) >> 16 ) ) ) {
    nIndex = n;
    break;
  }
}
img.SetTransparentColor( nIndex );
といった具合でしょう ...
# 思いつきで投稿するとこういったポカをやります m(__)m
    • good
    • 0

GIF画像ならパレットは256色です



RGBQUAD pal[256], col;
int n = 0, nIndex = 0;
img.GetColorTable( 0, 256, pal );
col = img.GetPixel( 0, 0 );
nIndex = -1;
for( n = 0; n < 256; n++ ) {
  if ( col == pal[n] ) {
    nIndex = n;
    break;
  }
}
if ( nIndex > -1 ) {
  img.SetTransParent( nIndex );
}
といった具合で検索できないかなぁ
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

コードを試したところ、
col = img.GetPixel( 0, 0 );
if ( col == pal[n] ) {
の場所で
error C2679: 二項演算子 '=' : 型 'COLORREF' の右オペランドを扱う演算子が見つかりません (または変換できません)。
となりました。
colはint型の数値ならうまくいきますが、比較の際にRGB+予約が異なるのでうまくいきません。

今は、マスクで透明にする方法で何とか目的達成しておりますが、
このパレットの考えた方も取り入れたいです。

お礼日時:2009/05/11 23:37

カラーパレットの何番の色が透過色に設定されているのかわかっていないと無理ですが



たとえば パレット番号0だとするなら

CImage img;
img.Load( "test.gif" );
// これを追加
Img.SetTansparentColor( 0 );
CDC* pDCImg = CDC::FromHandle( img.GetDC() );
pDC->BitBlt( 60, 10, img.GetWidth(), img.GetHeight(), pDCImg, 0, 0, SRCCOPY );
img.ReleaseDC();

といった具合かと ...

どこかの指定位置のピクセルデータから透過色を判別できるなら
GetColorTableでパレット情報を取得して GetPixelで指定位置の色情報を取得して GetColorTableで取得したテーブルを探索しましょう

この回答への補足

回答ありがとうございます。
カラーパレット番号がわからず0からいけるところまで試してみましたが
透過になりませんでした。
画像は IrfanView(フリーソフト)のメニュー画像のパレット - パレット編集で見ましたが、白は6番目でしたのでSetTansparentColor( );
の引数に数値の6や5を設定しましたが、ダメでした。


>どこかの指定位置のピクセルデータから透過色を判別できるなら
>GetColorTableでパレット情報を取得して GetPixelで指定位置の色情報を取得して GetColorTableで取得したテーブルを探索しましょう

画像の透過させたい位置は分かっていますので、この方法を試してみたいのですが、具体的にどうすればよいのでしょうか?


最終的にマスクの方法をとるしかないのでしょうか?

補足日時:2009/05/10 08:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A