[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/01/19(Wed) 12:17
投稿者名:エリックでおま
Eメール:
URL :
タイトル:
構造体のビットマップを貼り付ける
ソースコード内の構造体のビットマップデータを
PictureBoxに貼り付けるにはどのようにしたら
良いのでしょうか?

何方か御指導下さいますよう、
宜しくお願いいたします。

投稿時間:2005/01/19(Wed) 12:42
投稿者名:Say
Eメール:
URL :
タイトル:
Re: 構造体のビットマップを貼り付ける
> ソースコード内の構造体のビットマップデータ
ってなんでしょう?
あるソースコード内の構造体定義をEditor(VBE)で画面表示して、
[Alt + PrintScreen]かなにかで画面キャプチャーした画像データ?

投稿時間:2005/01/19(Wed) 12:52
投稿者名:エリックでおま
Eメール:
URL :
タイトル:
Re^2: 構造体のビットマップを貼り付ける
早速のご返答有難う御座います。

自社製のアプリケーションのデータファイルの中に
ビットマップデータが埋め込まれているのですね。
その情報だけを抜き出して表示させたいのです。
抜き出したビットマップ構造体データを一旦.bmp
ファイルに書き出してからロードすれば簡単なのですが
レスポンスの問題も有り直接表示したいのです。

> > ソースコード内の構造体のビットマップデータ
> ってなんでしょう?
> あるソースコード内の構造体定義をEditor(VBE)で画面表示して、
> [Alt + PrintScreen]かなにかで画面キャプチャーした画像データ?

投稿時間:2005/01/19(Wed) 12:58
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 構造体のビットマップを貼り付ける
> ソースコード内の構造体のビットマップデータを
> PictureBoxに貼り付けるにはどのようにしたら
> 良いのでしょうか?

バイト配列からの取得なら、OleLoadPicture APIを使えますよ。
hhttp://yaplog.jp/orator/archive/19

投稿時間:2005/01/21(Fri) 19:11
投稿者名:エリックでおま
Eメール:
URL :
タイトル:
Re^2: 構造体のビットマップを貼り付ける
魔界の仮面弁士 様
情報有難う御座います。

.bmpファイルからバイト配列に読み込んでOleLoadPictureで表示させる
事は出来たのですが。

ソースコード中のBITMAPFILEHEADER構造体とBITMAPINFOHEADER構造体と
その後に続くバイト列を。一つのバイト配列にしてOleLoadPictureで
表示しようとしているのですが。上手くいきません。
何方か二つの構造体とバイト列から一つのバイト配列を作り出す方法を
御教示して頂けませんでしょうか?何卒宜しくお願いいたします。

こんな事とか
ReDim PreviewWork(14 + 40 + (4 * BIH.biClrUsed + BitSize) + 1)
Call RtlMoveMemory(BFH, PreviewWork(0), 14)
Call RtlMoveMemory(BIH, PreviewWork(14), 40)
Call RtlMoveMemory(WorkByte(0), PreviewWork(54), (4 * BIH.biClrUsed + BitSize))
こんな事を
Call CopyMemory(PreviewWork(0), BFH, 14)
Call CopyMemory(PreviewWork(14), BIH, 40)
Call CopyMemory(PreviewWork(54), WorkByte(0), 4 * BIH.biClrUsed + BitSize)
してみましたが、上手くいきません。

> > ソースコード内の構造体のビットマップデータを
> > PictureBoxに貼り付けるにはどのようにしたら
> > 良いのでしょうか?
>
> バイト配列からの取得なら、OleLoadPicture APIを使えますよ。
> hhttp://yaplog.jp/orator/archive/19

投稿時間:2005/01/22(Sat) 00:11
投稿者名:FUSEN
Eメール:
URL :
タイトル:
Re^3: 構造体のビットマップを貼り付ける
> ソースコード中のBITMAPFILEHEADER構造体とBITMAPINFOHEADER構造体と
> その後に続くバイト列を。一つのバイト配列にしてOleLoadPictureで
> 表示しようとしているのですが。上手くいきません。
> 何方か二つの構造体とバイト列から一つのバイト配列を作り出す方法を
> 御教示して頂けませんでしょうか?

その「ソースコード」に、BITMAPFILEHEADER構造体データが存在する
のであれば、その構造体のbfSizeメンバ(ファイルサイズ)を使えば
一気にビットマップファイルのバイト配列を作れると思うが・・・

投稿時間:2005/01/24(Mon) 12:41
投稿者名:エリックでおま
Eメール:
URL :
タイトル:
Re^4: 構造体のビットマップを貼り付ける
FUSEN様御意見有難う御座います。
> その「ソースコード」に、BITMAPFILEHEADER構造体データが存在する
> のであれば、その構造体のbfSizeメンバ(ファイルサイズ)を使えば
> 一気にビットマップファイルのバイト配列を作れると思うが・・・
二つの構造体とバイト列をファイルに書き出した物と、バイト配列にしてから
ファイルに書き出した物とでは、サイズは同じなのですがダンプエディタで
比較してみると同じになっていないのです。部分的に前後していると言うか…
簡単に順序正しくバイト配列にコピーする方法って有りませんでしょうか?
何方か御指導下さいますよう宜しくお願いいたします。

投稿時間:2005/01/24(Mon) 14:45
投稿者名:FUSEN
Eメール:
URL :
タイトル:
Re^5: 構造体のビットマップを貼り付ける
> 二つの構造体とバイト列をファイルに書き出した物と、バイト配列にしてから
> ファイルに書き出した物とでは、サイズは同じなのですがダンプエディタで
> 比較してみると同じになっていないのです。部分的に前後していると言うか…
> 簡単に順序正しくバイト配列にコピーする方法って有りませんでしょうか?

と言われても、見ている人には確認の方法がありませんよ。

二つの構造体とバイト配列をファイルに書き出した場合は、成功。
バイト配列にしてからファイルに書き出した場合は、失敗。
と言うのであれば、
ダンプエディタで同じにならないのは、何バイト目からで、
それが構造体のどのメンバに相当するか位は解かると思うが・・・

それでも解からないのであれば、
各々のソースを載せてみたら如何ですか?

投稿時間:2005/01/24(Mon) 21:12
投稿者名:エリックでおま
Eメール:
URL :
タイトル:
Re^6: 構造体のビットマップを貼り付ける
 BITMAPFILEHEADER構造体(BFI)の中のLong型が前2バイトと後2バイトが
入れ替わっている様なのですね。しかしBITMAPINFOHEADER構造体(BHI)の
中のLong型はそのままのようです。何故このような事が起こっているのか
解りません。
それで以下のようにBITMAPFILEHEADER構造体部分だけメンバ毎にバラして
コピーしたら。ちゃんと表示出来るようになったのですが。何故なのでしょう?
明確な理由の解ります方、いらっしゃいますでしょうか?

  ReDim PreviewWork(14 + 40 + (4 * BIH.biClrUsed + BitSize))
  Call CopyMemory(PreviewWork(0), BFH.bfType, 2)
  Call CopyMemory(PreviewWork(2), BFH.bfSize, 4)
  Call CopyMemory(PreviewWork(6), BFH.bfReserved1, 2)
  Call CopyMemory(PreviewWork(8), BFH.bfReserved2, 2)
  Call CopyMemory(PreviewWork(10), BFH.bfOffBits, 4)

  Call CopyMemory(PreviewWork(14), BIH, 40)
  Call CopyMemory(PreviewWork(54), WorkByte(0), 4 * BIH.biClrUsed + BitSize)

投稿時間:2005/01/24(Mon) 22:28
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^7: 構造体のビットマップを貼り付ける
ユーザー定義型の定義、CopyMemory APIの定義等も併記して、
こちらで現象を再現できるコードを提示してもらえると、ありがたかったです。

>  BITMAPFILEHEADER構造体(BFI)の中のLong型が前2バイトと後2バイトが
> 入れ替わっている様なのですね。しかしBITMAPINFOHEADER構造体(BHI)の
> 中のLong型はそのままのようです。

それぞれの構造体は……こういう並びになっているのですね。

[BITMAPINFOHEADER 構造体]
hhttp://msdn.microsoft.com/library/en-us/gdi/bitmaps_1rw2.asp

[BITMAPFILEHEADER 構造体]
hhttp://msdn.microsoft.com/library/en-us/gdi/bitmaps_62uq.asp


現象を再現できるコードが無いので、そちらの状況を確認することはできませんが、
おそらくそれは、アライメントの問題から、「たまたま入れ替わっている様に見える」
だけでは無いでしょうか。

VB6 では、ユーザー定義型のメンバが 32bit境界上にまたがる事が無い様に
メモリ上に配置されます。たとえば、下記を試してみてください。

================================
Option Explicit

Private Declare Sub RtlMoveMemory Lib "kernel32" (ByRef dest As Any, ByRef src As Any, ByVal L As Long)

Private Type Test1
    A As Integer
    B As Long
    C As Integer
End Type

Private Type Test2
    A As Integer
    B As Integer
    C As Long
End Type

Private Sub Form_Load()
    Dim X As Test1, Y As Test2
    Dim B() As Byte

    X.A = &H1122
    X.B = &H33445566
    X.C = &H7788

    Y.A = &H1122
    Y.B = &H3344
    Y.C = &H55667788

    ReDim B(LenB(X) - 1)   'Len関数ではなく、LenBである事に注意!
    RtlMoveMemory B(0), X, LenB(X)
    Dump B    '→ 22 11 00 00 66 55 44 33 88 77 00 00 ← "00" が含まれる!

    ReDim B(LenB(Y) - 1)
    RtlMoveMemory B(0), Y, LenB(Y)
    Dump B    '→ 22 11 44 33 88 77 66 55 ← こちらは "00" が含まれない
End Sub

Private Sub Dump(ByRef Data() As Byte)
    Dim V As Variant
    For Each V In Data
        Debug.Print Right("0" & Hex(V), 2); " ";
    Next
    Debug.Print
End Sub
================================

Test1型とTest2型は、共に Integer×2 と Long をメンバに持つユーザー定義型ですが、
両者はメンバの配置順が異なっています。
(Test1型の配置は、BITMAPFILEHEADER 構造体の先頭部分と同じ定義にしてあります)

各メンバは「32bit単位で再配置される」ため、Test1型の方は、A As Integer の後に、
16bitの空白が埋め込まれる結果となります。この再配置による増加分により、
データのずれが発生するというわけです。


> メンバ毎にバラしてコピーしたら。ちゃんと表示出来るようになったのですが。
余白部を避けてコピーする事になるからです。