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.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で取得したテーブルを探索しましょう
画像の透過させたい位置は分かっていますので、この方法を試してみたいのですが、具体的にどうすればよいのでしょうか?
最終的にマスクの方法をとるしかないのでしょうか?
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.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS 角丸画像の背景色を透明にしたいです 1 2023/06/23 23:15
- Perl 画像が表示でnull; this.src 1 2022/04/19 11:31
- その他(ソフトウェア) ペイントで切り抜いた画像の背景を透明に 2 2022/09/15 10:20
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- Photoshop(フォトショップ) フォトショップで切り抜いた画像を透明にするには 3 2022/09/15 11:50
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- Illustrator(イラストレーター) Illustratorで白い部分のみを透過させたいです。 2 2022/10/10 22:27
- HTML・CSS flex の各子要素を横幅 100% にしたい 1 2022/09/22 21:25
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
MFCでbitmapを背景にしてstaticテキストを透過させる方法
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
ビットマップ(bmp)形式で背景を透過にできる?
画像編集・動画編集・音楽編集
-
-
4
MFCでOnPaintのタイミング
C言語・C++・C#
-
5
VC++プログラムをつかったBMP画像の拡大縮小について
C言語・C++・C#
-
6
MFCダイアログボックスを最前面に表示
C言語・C++・C#
-
7
ビットマップに描画をしてピクチャーコントロールに貼り付けるためには?
C言語・C++・C#
-
8
CStaticコントロールの静的イメージ描画
C言語・C++・C#
-
9
MFC - ダイアログボックスのPictureControlへの画像表示
C言語・C++・C#
-
10
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
11
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
12
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
13
Windowsプログラミング:BitBltで半透明な透かしを作りたい
C言語・C++・C#
-
14
CImageクラスの使用について
C言語・C++・C#
-
15
起動時に何のダイアログも表示されない
C言語・C++・C#
-
16
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
17
ダイアログボックスで指定したサイズどおり表示されない
C言語・C++・C#
-
18
StretchBlt関数について
C言語・C++・C#
-
19
RGBのバイナリデータをCImageにコピー
C言語・C++・C#
-
20
ボタンの配置を変更したい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MFCで画像を表示させているので...
-
JavaScriptで変更した属性の元...
-
(javascript)HTMLで指定した...
-
onclickで画面が固まる・・・ら...
-
OpenCVでサンプルコードを使う...
-
error LNK2019 未解決のシンボ...
-
指定したフォルダの画像を一括...
-
画像が表示でnull; this.src
-
createElementによる空要素の生...
-
画像がうまく表示されないのですが
-
HPにスライドショーが反映され...
-
MAX関数を使ってからLEFT JOIN...
-
Gifアニメ、最後のコマに行った...
-
クリックで色変更後に既に変更...
-
createElementが一瞬で消えてし...
-
複数のバナーをリロードする度...
-
デフォルト非表示にしたい。【t...
-
javascriptテキストBOX色を元に...
-
iframe内のリンクが飛ばないの...
-
Slick.jsのオプションrtlについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JavaScriptで変更した属性の元...
-
MFCで画像を表示させているので...
-
画像が表示でnull; this.src
-
error LNK2019 未解決のシンボ...
-
(javascript)HTMLで指定した...
-
外部javascriptの重複を防ぐには
-
libjpegライブラリの使い方につ...
-
Vb.net2005での画像の合成方法
-
外部ファイルにしたら文字化け...
-
jQuery 複数のfind()
-
HTMLからimgのsrcのみを正規表...
-
html内にスライドショーを複数設置
-
条件分岐でキーが入力されてい...
-
複数画像のランダム複数表示(...
-
ダイアログから画像ファイルは...
-
【OpenCV】二値画像後、白の部...
-
"lightbox"の"CLOSE"ボタンクリ...
-
onclickで画面が固まる・・・ら...
-
pythonで、tkinterとpillowの組...
-
imgボタンにfocusの当て方
おすすめ情報