大きな画像からRGB値を抽出するには?

解決


ジムニー  2008-11-25 06:42:09  No: 140879

VB初心者ですがよろしくお願いします。
VB6.0を使用

対象とする画像(BMP)から全てのピクセルのRGB値を抽出したいと思っています。
画像が640×480程度サイズなら画像をPictureBoxに表示させ、.point(x,y)でRGB値を抽出できたのできるのですが、画面に表示できないほどの大きさになると読み取ることができなくなってしまいました。

このような場合どのようにすれば各ピクセルのRGB値を抽出することができるでしょうか。


やじゅ  2008-11-25 08:49:04  No: 140880

BMPファイルならファイルフォーマットを解析すれば
色が分かるよ

BMP ファイルフォーマット
http://www.kk.iij4u.or.jp/~kondo/bmp/


やじゅ  2008-11-25 09:21:51  No: 140881

画面上の色を取得するのではなく、メモリ上の画像を
取得するWin32API GetPixel関数を使うといいかも

またはBMPファイルフォーマットを解析して指定の色を取得する


ジムニー  2008-11-25 09:48:49  No: 140882

やじゅさん回答ありがとうございます。
早速ファイルフォーマット解析とWin32API GetPixel関数の両方で試してみたいと思います。


ジムニー  2008-11-25 20:07:20  No: 140883

Win32API GetPixel関数の方でまずは試してみました。

Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Private Sub mopen_Click()
    Set File1 = CreateObject("mscomdlg.commondialog")
    File1.Filter = "画像(*.bmp)|*.bmp"
    File1.ShowOpen
    Picture1.Picture = LoadPicture(File1.FileName)
    test = Picture1.hdc
End Sub

Private Sub Command1_Click()
A = GetPixel(test, 1000, 1000)
Text1.SelText = A
End Sub

としましたが動作しませんでした。
A = GetPixel(test, 100, 100)
とすると動作してくれるのですが・・・。

何か定義が間違っているのでしょうか?


WHG  2008-11-25 21:44:31  No: 140884

一点のピクセルだけを求めるならVB の pointメソッドや API の GetPixel でも充分ですが、全体のピクセルを求めるにはそれらでは異常に遅いので、高速に処理したいときは GDI を使う方法があります。

ここにサンプルがあります。
画像処理の高速化
http://www5a.biglobe.ne.jp/~suuta/vb/kousokuka.html


花ちゃん  2008-11-25 21:57:40  No: 140885

>A = GetPixel(test, 1000, 1000)
Picture1のサイズは?  1000ピクセル × 1000ピクセル より小さいのでは。
(ScaleMode に注意、通常は、Twip API関数では、ピクセルになります)
エラーメッセージは表示していませんか?


WHG  2008-11-25 22:04:55  No: 140886

> 画面に表示できないほどの大きさになると読み取ることができなくなってしまいました。

ちなみに、前もって
Picture1.AutoRedraw = True
としておけば、.point(x,y)でも、画面からはみ出した範囲の色を読み込めます。


ジムニー  2008-11-26 03:39:15  No: 140887

対象としている画像のサイズが 6400×4800  だったので、
Picture1.AutoRedraw = Trueとする事で画面からはみ出したピクセルのRGB値を抽出できました。
次は処理の高速化のためGDIを使ってみようと思います。

みなさまありがとうございました。


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

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






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