
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透過ファイルの場合、そのまま透過になる方法や、何か手段を用いて透過をさせたいです。
No.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
No.2
- 回答日時:
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 );
}
といった具合で検索できないかなぁ
回答ありがとうございます。
コードを試したところ、
col = img.GetPixel( 0, 0 );
if ( col == pal[n] ) {
の場所で
error C2679: 二項演算子 '=' : 型 'COLORREF' の右オペランドを扱う演算子が見つかりません (または変換できません)。
となりました。
colはint型の数値ならうまくいきますが、比較の際にRGB+予約が異なるのでうまくいきません。
今は、マスクで透明にする方法で何とか目的達成しておりますが、
このパレットの考えた方も取り入れたいです。
No.1
- 回答日時:
カラーパレットの何番の色が透過色に設定されているのかわかっていないと無理ですが
たとえば パレット番号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で取得したテーブルを探索しましょう
画像の透過させたい位置は分かっていますので、この方法を試してみたいのですが、具体的にどうすればよいのでしょうか?
最終的にマスクの方法をとるしかないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
CImageクラスの使用について
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
-
4
CString型の文字列連結について
C言語・C++・C#
-
5
【VC++6.0 MFC】画像表示について
C言語・C++・C#
-
6
MFCでOnPaintのタイミング
C言語・C++・C#
-
7
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
8
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
9
CStaticコントロールの静的イメージ描画
C言語・C++・C#
-
10
VC++プログラムをつかったBMP画像の拡大縮小について
C言語・C++・C#
-
11
MFC - ダイアログボックスのPictureControlへの画像表示
C言語・C++・C#
-
12
デバッグ中のエラーのことで教えてください。
C言語・C++・C#
-
13
MFCでbitmapを背景にしてstaticテキストを透過させる方法
C言語・C++・C#
-
14
CButtonのBMP・アイコンの表示を切替えたい
C言語・C++・C#
-
15
ボタン上にビットマップ、アイコンを貼り付ける方法
C言語・C++・C#
-
16
OnPaintとOnDraw関数の違いについて
C言語・C++・C#
-
17
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
18
CImage GetBitsメソッドについて
C言語・C++・C#
-
19
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
20
SetWindowText関数について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画像処理 C言語 元画像の幅...
-
createElementが一瞬で消えてし...
-
文字をクリックしたら別の文字...
-
JSPでの画像ファイル表示
-
オブジェクトがありませんのエラー
-
jQueryの配列の渡し方について
-
ドラックアンドドロップ?
-
「jQuery」アコーディオンメニ...
-
折りたたみ式JavaScriptをcheck...
-
classの中の<a>タグにidを追加
-
2つのDIVを中央と右に横並びに...
-
javascrip 切り替えのやり方
-
lightbox2をiframeから外に表示...
-
チェックボックスの背景色って...
-
1枚の画像をクリックすると複数...
-
取得した要素がインライン要素...
-
Javascript初心者|jQueryの.va...
-
VBAでIEを動かす場合、下記の①...
-
jQueryで同じクラス名のものを...
-
imgのsrcに値を設定するには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JavaScriptで変更した属性の元...
-
ダイアログから画像ファイルは...
-
MFCで画像を表示させているので...
-
imageクラスからiconクラスに変...
-
メニューボタン画像のロールオ...
-
xmlとロールオーバー(jQuery1....
-
外部javascriptの重複を防ぐには
-
libjpegライブラリの使い方につ...
-
複数の画像をフェードイン・ア...
-
返信記事付きログファイルの表示
-
jsでサムネイルを拡大表示 複...
-
画像が表示でnull; this.src
-
HTMLからimgのsrcのみを正規表...
-
条件分岐でキーが入力されてい...
-
OpenCVの実行エラー
-
$(this)を変数に入れないと動作...
-
テキストリンクにオンマウスで...
-
WEBに音を付けたい
-
複数画像のランダム複数表示(...
-
こんにちは、javascriptにてボ...
おすすめ情報