RAW画像にGDIを使って文字等を描画するには?

解決


楠瀬  2006-06-10 06:55:35  No: 95705

1画素あたり16ビットを使い、そのうち12ビットで画素の輝度
(モノクロ)を表す画像データがありバイナリファイルとして保存
されています。
この画像上に文字や線を書き込んで保存しなおしたいのですが
GDIを使ってできないでしょうか?

現状、データを読み込み、それと同じ大きさの背景が黒のビットマップを
別に作成して、そこに線とか文字を白色で書き込んで、そのデータを
12ビットスケールに変換し元のデータとORをとるような感じで行っていますが
GDIが使えたらもっとスマートにできそうに思います。

そのようなことが可能でしょうか?
可能であればどのような手順でやればよいでしょうか?

よろしくお願いします。

環境
Windows XP
VB6.0


K.J.K.  2006-06-12 19:39:11  No: 95706

標準のGDIには、そういう画素フォーマットのものは存在しないので、
ただそのままでは無理でしょう。

そういうことのできるDCを提供するドライバというのは一般的では
ないでしょうから、GDI以外の方法を模索すべきでしょう。


楠瀬  2006-06-13 03:26:24  No: 95707

1画素16ビットのデバイスコンテキストですが

デスクトップの画面の色数を16ビットにすれば、色の解釈だけこちらでしてやれば
DCが使えるのかとも思ったのですが(検証はしていません)普通に使用するときは
24ビットフルカラーで使うのでその度にいちいち切り替えるのは非現実的かなと
思い止めました。

やはり、現在の方法で処理を効率よくするように見直してみるしかなさそうですね。

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


楠瀬  2006-06-14 01:28:32  No: 95708

1画素16ビットのデバイスコンテキストを使用して直接データRAW画像に書き込むことができないので
スクリーンデバイスコンテキストを使用して書き込む方法にしました。

1)CreateCompatibleDCでスクリーンと同じメモリDCを作成
1)RAWデータをInteger型の配列に取得
2)BITMAPINFOHEADERに適切な値を入れてSetDIBitsでメモリDCに描画
    以下がBITMAPINFOHEADERの設定値(stBmInfはBITMAPINFO型の変数)

  With stBmInf.bmiHeader
    .biSize = LenB(stBmInf.bmiHeader)
    .biWidth = 512
    .biHeight = -512          'RAW画像はトップダウンなので値を負にする
    .biPlanes = 1
    .biBitCount = 16          '使用ビットは16ビット  
    .biXPelsPerMeter = 3780
    .biYPelsPerMeter = 3780
    .biClrUsed = 0
    .biClrImportant = 0
    .biCompression = 0         'BI_RGB
    .biSizeImage = 0
  End With

3)白を&HFFFF18(これが16ビットビットマップでは&HFFF(12ビット白)となる)として文字や線をメモリDC上に描画
4)2)のBITMAPINFOHEADERを用いてGetDIBitsでInteger型の配列としてビットマップデータを取得
5)取得した配列を保存
6)オブジェクトやDCの後始末をして完了

こんな感じで出来ました。
一応解決としておきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加