• ベストアンサー

C++ bmp 透過処理

machongolaの回答

回答No.4

 こんにちは。御礼いただきました。  32bit,16bitでbmpファイルを作成する際、BITMAPINFOHEADER構造体の後ろに、DWORD x 3の配列を付加させないといけません。  本来は、  ::malloc(sizeof(BITMAPINFOHEADER) + sizeof(DWORD) * 3);  の様にして52バイト割り当てますが、メモリーリークの種を増やしたくなかったので、 #pragma pack(push, 1)//パディングが入ってサイズが崩れるとマズイいので念のため struct{ BITMAPINFOHEADER bih; DWORD f[3]; } info = {0}; #pragma pack(pop)  上記の様な52バイトの構造体を作成しました。  大体ビットマップのフォーマットは、以下の様になっています。  http://homepage2.nifty.com/tsugu/sotuken/ronbun/sec3-1.html  http://dencha.ojaru.jp/programs_07/pg_graphic_04.html#color_mask  24bit  BITMAPFILEHEADER  BITMAPINFOHEADER  イメージ  32, 16bit  BITMAPFILEHEADER  BITMAPINFOHEADER  DWORD[3]  イメージ  モノクロ、16色、256色  BITMAPFILEHEADER  BITMAPINFOHEADER  RGBQUAD[2 又は 16 又は 256]  イメージ ※(1)sizeof(DWORD) と sizeof(RGBQUAD)は等しい ※(2)その他、RLE4bit と RLE8bitが存在する ※(3)DWORD[3]の中身  32bitの場合  [0] = 0xff0000  [1] = 0xff00  [2] = 0xff  16bitの場合  [0] = 0xf800  [1] = 0x7e0  [2] = 0x1f  又は、  [0] = 0x7c00  [1] = 0x3e0  [2] = 0x1f  を選択。  因みに当方が書いたコードは32bitですが、windows APIでビットマップハンドルを使用して構わないならば、このコードは回りくど過ぎるかもしれません。

ShimantoGa
質問者

お礼

補足ありがとうございます。 #pragma pack(push, 1)以下の処理に関してある程度は理解できました。 確認させていただきたいのですが、 http://ja.wikipedia.org/wiki/Windows_bitmap このプログラムでは32bit、16bitのみ対応で、24bitなどDWORD[3]が含まれない形式の場合は正常に動作しない、ということでよろしいでしょうか。(全ビット数に対応する場合は「1ピクセルあたりのビット数」を参照してIMAGE構造体の内容を変える?) また、BITMAPINFOHEADER構造体以外にも BITMAPINFOHEADER2:64byteだから新しい形式? BITMAPV5HEADER:今はこれが主流? などの構造体も存在するらしいですが、これらにも対応はしていないということですよね。 >因みに当方が書いたコードは32bitですが、windows APIでビットマップハンドルを使用して構わないならば、このコードは回りくど過ぎるかもしれません。 WindowsAPIの使用に関しては一向に構いません。(寧ろ BITMAPINFOHEADER bin; はAPIの構造体だと思っておりました) //画像表示 HDC hDC = GetDC( hWnd ); HDC hCompatDC = CreateCompatibleDC( hDC ); HBITMAP hPrevBitmap = (HBITMAP)SelectObject( hCompatDC, hBitmap ); BitBlt( hDC, 0, 0, 640, 480, hCompatDC, 0, 0, SRCCOPY ); 当初このような処理から透過処理を実現できないものかと考えておりました。 最も提供していただいたソースの方が他のフォーマットに対応する時(jpeg等)色々とやりやすそうですが。

関連するQ&A

  • イラストレータで透過処理すれば解決?

    はじめまして、野沢と言います。 イラストレータでアイコンを作成して(A)、 一旦、JPEGなどの形式で保存して、後日、 さらにそれを別の画像(B)と合わせる際に Aの画像が正方形の形で、いらない白い部分が 表示されてしまうことがあります。 画像の部分だけを表示させるには保存する際か、 または、透過処理で特別な処理をすればいいのでしょうか?

  • 透過動画と動画の合成処理

    静止画像で画像Aと透過GIF画像Bを重ねるように, 動画Aと動画Bの2種の花火動画(それぞれ10秒程度;解像度,コーデック等は同じ)をオーバーレイにして2種の花火を1回で打ち上げたように合成したいと考えています.  最初にクロマキー処理を考えました.しかし,背景色は単一ではありません.他の方法として,動画Bの必要な領域を静止画として書き出し,1フレームずつ単一色で塗りつぶして行くことも考えましたが,作業量の多さを思うと尻込みをしています. 今後も特にその他の動画処理をしていこうという事はないので,高価なソフトの購入は今のところ考えておりません(これがあればできるというのがあればご紹介ください.). そこで質問なのですが, 1)動画A,Bを同じ解像度で,必要な動き以外の背景を単一化してオーバーレイ等が比較的簡単にできるソフトがあるかどうか. 2)動画処理で,必要な領域以外の色を比較的簡単に単一にできるソフトがあるかどうか. 3)静止画(BMP)処理で,ドットの色を抽出し,選択した色以外を希望の色に変換してくれるようなソフトがあるかどうか. 4)その他で比較的簡単な方法があるのかどうか. ご教示お願いします.  

  • C言語でBMP(16bit)を扱う方法

    組み込みソフトの作成を行なっており、液晶に画像を表示するソフトを 作りたいと思っております。 16bitのビットマップ画像をC言語のソースにするにはどうすればよいでしょうか? interface2011年5月号の付録(Renesas RX62N)を使用して、3.5インチQVGAのTFT液晶に 画像を表示したいと思っているのですが、自分で用意した16ビットのビットマップ画像を どうすればC言語ソースに落とせるのかがわかりません。 付録のサンプルプログラムでは、pct_data[]={65535,65535,・・・・}; と各ドットを16bitで表現した配列になっているのですが、ビットマップデータからこのような 配列の作成方法を教えて頂けると助かります。 よろしくお願いいたします。

  • bmpファイルが開きません。

    ウェブサイトからの画像などは(ビットマップ)Adobeで 開くのですが、友人からHotmailへ送ってもらった ビットマップ イメージ画像が開きません。 ‐‐‐ ファイル形式用プラグインはファイルを 解析することができません。 従って、「◯◯◯◯.bmp」を 開く事ができませんでした。 ‐‐‐‐ このように表示されます。 宜しくお願いします。(;^_^A

  • プログラミング(c#)で画像処理に関して

    質問させてください。 c#で画像処理に関してです。 picturBox上の画像や図形を、ビットマップ変換し、 ・ラベリング ・エッジ検出 等を行いたいのですが、そういった方法(コードについて)が説明されている サイトは無いでしょうか? よろしくお願いします。

  • C++ 画像処理

    C++で画像処理を行おうと思っています。 当初jpegの入出力を試す予定でしたが、検索しても出てくるのがbmpばかりで標準関数はjpegに対応していないのかなと思いました。 C++の画像処理全般に関して詳しく紹介しているサイトや本などはありませんでしょうか。

  • テキストファイルやcsvファイルで読み込んだデータを使ってjavascriptで処理する方法

    javascript初心者です。 いろいろと調べたのですが、イマイチよく分からないので質問させてください。 テキストファイルやcsvファイルを読み込んで、 javascriptで判定処理をしたいと思います。 例えば、 A地区,1 B地区,0 C地区,4 ・・・ といったデータを読み込んで、 javascriptで「0なら○地区には画像Aを表示、 それ以外なら○地区には画像Bを表示する」 という形で処理したいです。 でも、 ・どうやってファイルを読み込むのか ・読み込んだデータをどのようにして配列へ入れるのか がよく分からないです。 これらのページ 「http://q.hatena.ne.jp/1195740627」 「http://www.openspc2.org/JavaScript/Ajax/Ajax_study/chapter03/002/index.html」 のような方法を参考にすれば実現可能なのでしょうか。

  • ビットマップ画像 54 + 1024byteヘッダ

    ある課題で、以下の画像をWindows 上で処理しなければならないのですが、 512×424+(54 + 1024)= 218166byte の大きさで、256 色ビットマップのようです。 表題にある通り、ヘッダが54byte + 1024byte あるようで、 この画像と同じフォーマットで、リサイズしたいのですがどのような規則でヘッダを作ればよいかわからず途方に暮れています。 そもそも、ビットマップヘッダは54byte 以外のものもあるのでしょうか。 ご助言いただけますでしょうか。 なお、mspaint では正しく開けます。 <画像> https://dotup.org/uploda/dotup.org1817556.bmp

  • 画像処理の仕方

    C++を使ってモノクロのビットマップの画像の各ピクセルの輝度を数値化してテキスト形式で出力る物を作りたいと思っているんですが、ビットマップに対してどう処理してやればいいか分りません。誰か教えてください。

  • C#での印刷機能に関して

    C#での印刷機能に関して C#を用いて開発を行っていますが、その中で印刷ボタンを設け、印刷処理 を行いたいと考えています。 印刷自体の処理はある程度調べて実現しましたが、フォーマットを指定して 出力したいと考えています。 例えば、、、この位置にこの変数の値を出力したい等。。。 アクティブレポートのようなツールを購入すれば可能かと思われますが、標準 のVisualStudio2008の機能で実現できないかと考えて います。 何か良い方法はありますでしょうか。。。 初歩的な質問で申し訳ありませんが、教えて下さい。 よろしくお願いします。