tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^6: GetDIbitsの使用方法について
投稿日: 2014/03/17(Mon) 23:21
投稿者魔界の仮面弁士
> 週末からの3連休
存在自体、本気で忘れてました(汗


> こちらではpixel()は2次元配列を使用したいので、
取得したデータの内容を正しく確認するためにも、
検証段階では、Byte の一次元配列でも確認した方が良いですよ。


> またDIB.RGB_COLORSを改めて宣言していないので
> GetDIBits hMemDC, hBmp, 0, Abs(bmpinfo.bmiHeader.biHeight), pixel(0, 0), bmpinfo, 0
> としてやってみました。

・確保した pixel 配列のサイズが、biSizeImage と合致しているか確認しておいてください。
・pixel を As Long とする場合は、biBitCount が 32 であることを確認しておいてください。


このほか、圧縮形式 biCompression が 0 (無圧縮)であることも確認しておいてください。

 BI_RGB       (0) … 無圧縮。今回はこれを使う。
 BI_RLE8      (1) … 8 bit/pixel ランレングス圧縮。biBitCount=8
 BI_RLE4      (2) … 4 bit/pixel ランレングス圧縮。biBitCount=4
 BI_BITFIELDS (3) … 無圧縮。ビットフィールド。RGBQUAD に 青,緑,赤のカラーマスクが並ぶ。
 BI_JPEG      (4) … プリンタ用。画像ビットが JPEG であることを示す。
 BI_PNG       (5) … プリンタ用。画像ビットが PNG であることを示す。


> 上下逆になって表示される。
それが普通です。ビットマップという画像形式は、
左下から右上に向かって記録されるフォーマットなので。

Excel セルに表示するのなら、それを考慮して座標を指定してみてください


> bmpinfo.biHeight = -bmpinfo.biHeight
正数ならばボトムアップ(左下から右上)、
負数ならばトップダウン(左上から右下)の順となります。
bmpinfo.biHeight は最終的に、負数・正数いずれになったか確認しておいてください。

ちなみに圧縮されたビットマップの場合は、トップダウン形式が使えなかったりします。
(トップダウンは、biCompression が BI_RGB あるいは BI_BITFIELDS の場合のみ有効)


> GetDIBits hMemDC, hBmp, 0, bmpinfo.biHeight, pixel(0, 0), bmpinfo, 0
画像全体をスキャンするのですよね。
第4引数に渡す biHeight が正数になっていることを確認しておいてください(そのための Abs 関数です)。

もしも負数を渡していた場合、
     -1 → 4,294,967,295
    -64 → 4,294,967,232
  -1024 → 4,294,966,272
のように、巨大な行数を指定したものとして解釈されてしまう可能性があります。


> A色がおかしい。
Excel のバージョンは何ですか? 2007 以上ではフルカラーが使えますが、
2003 以下の場合、ワークシート上で使用できる色は最大56色に制限されます。

http://officetanaka.net/excel/vba/cell/04-16.png
http://officetanaka.net/excel/vba/cell/04-17.png


> (青系統と茶系統が逆に表示される)
それは、RGB と BGR を逆に処理しているからですね。


32bit ビットマップでは、画素情報が Blue,Green,Red,Reserved(Alpha) の順に並びます。

バイナリ(Byte 配列)で取得した場合、BB,GG,RR,AA の順になっていることを確認できるかと思います。

そして Windows において、連続した 4 Byte が BB,GG,RR,AA の順で並んでいる場合、
それを 4 バイト整数型(Long 値)で受け取ると、&HAARRGGBB になるということを意味します。


「純赤」の画素:00,00,FF,00 → &HFF0000 (16711680)
「純青」の画素:FF,00,00,00 → &HFF (255)


一方、Excel の .Interior.Color はそうではありません。

青すなわち「vbBlue」は RGB(0, 0, &HFF) で &HFF0000 (16711680) ですし、
赤すなわち「vbRed」 は RGB(&HFF, 0, 0) で &HFF (255) という値です。逆ですよね。

Excel に表示させるなら、それを踏まえて変換してやる必要があります。


また、Excel に表示する場合は、アルファ値(AA) を 0 にしておいてください。

本来、アルファ値(透明度)とは 0 で完全透過、255 なら完全不透明ですが、
Excel のセルは透明度を指定できないため、Alpha 値は切り捨てて
&H00000000〜&H00FFFFFF の範囲で指定するようにします。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。