掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB6でPictureBox.Pictureにビットマップを転送するには? (ID:89521)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
レスありがとうございます。内容を補足します。 現在やっている事は、 ... PictureBox.Picture = LoadPicture(...) 画像のサイズは4672x3504ピクセルです。 ... Dim bytBits() As Byte ReDim bytBits(1 To byteWidth * lngHeight * 3) Dim bmpInfo As BITMAPINFO With bmpInfo.bmiHeader '構造体初期化 .biSize = 40 .biWidth = byteWidth .biHeight = -lngHeight .biPlanes = 1 .biBitCount = 24 '24ビット .biCompression = 0 'BI_RGB .biSizeImage = 0 'BI_RGBの時は0 .biClrUsed = 0 End With Dim ret As Long Dim ppvBits As Long ppvBits = 0 'ダミー Dim hWorkDC As Long hWorkDC = CreateCompatibleDC(hSrcDC) 'メモリDC作成 If hWorkDC <> 0 Then Dim hDIB As Long hDIB = CreateDIBSection(hSrcDC, bmpInfo, DIB_RGB_COLORS, _ ppvBits, 0, 0) 'DIB作成 If hDIB <> 0 Then Dim hPrevBmp As Long hPrevBmp = SelectObject(hWorkDC, hDIB) ret = BitBlt(hWorkDC, 0, 0, lngWidth, lngHeight, _ hSrcDC, 0, 0, vbSrcCopy) 'DIBに画像を転送 hDIB = SelectObject(hWorkDC, hPrevBmp) ret = DeleteObject(hPrevBmp) ret = DeleteDC(hWorkDC) 'メモリDC解放 'DIBからRGB取得 ret = GetDIBits(hSrcDC, hDIB, _ 0, lngHeight, bytBits(1), bmpInfo, DIB_RGB_COLORS) ret = DeleteObject(hDIB) 'DIB解放 End If End If この後、配列で画像処理して Dim bmpInfo As BITMAPINFO With bmpInfo.bmiHeader '構造体初期化 .biBitCount = 24 .biClrUsed = 0 .biCompression = 0 .biHeight = -lngHeight .biWidth = byteWidth .biPlanes = 1 .biSize = 40 .biSizeImage = byteWidth * lngHeight * 3 End With Dim ret As Long ret = SetDIBitsToDevice(hDestDC, 0, 0, lngWidth, lngHeight, _ 0, 0, 0, lngHeight, bytSource(1), bmpInfo, DIB_RGB_COLORS) でPictureBoxに表示しています。 PictureBoxは .AutoRedraw = True にしているので、.Imageに書き込まれて PictureBox.Refresh とすると画面に表示されますが、この画像をバックグラウンドイメージにしたいので PictureBox.Picture = PictureBox.Image とすると デバッグモードで.Picture = 0になって、次に.hDCを使おうとしたときに "AutoRedrawイメージが作成できません。"のエラーがでます。 今日また試してみたら、 "0x....のメモリがReadになれませんでした。"とメッセージが出てVBが落ちました。 画像が大きくない場合はできているので、PictureBox.Pictureを使わずに、画像を開いた時にDIBを取っておいて、PictureBox.Clsを使う代わりにDIBを.Imageに転送するようにしようかと思っています。 他に良い対処方法はないでしょうか? よろしくお願いします。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.