画像のレコード番号(バイト位置)を取得

解決


  2007-10-15 08:47:19  No: 137815

128×128の画像から、画像データを配列に格納する、という作業を行っています。
しかし、画像データを格納する(FileGet(fileNo, a, )を実行する)際に、

「配列のオフセットおよび長さが範囲を超えているか、カウンタがソース コレクションのインデックスから最後までの要素の数より大きい値です。」

というエラーが発生してしまい、このエラーの対処方法が分かりません。

以下がコードです。考えられる原因は何なのでしょうか?

Dim h(1077) As Integer    'ヘッダ読み込みバッファ
Dim a(16383) As Integer   'データ読み込みバッファ

Dim fileName As String = "C:\xxx\xxx\Image1.bmp"    'ファイルのパス
Dim fileNo As Integer = FreeFile()      'ファイル番号を取得
FileOpen(fileNo, fileName, OpenMode.Binary)
FileGet(fileNo, h, )  'ヘッダを読み飛ばす
FileGet(fileNo, a, )  '画像データを格納
FileClose(fileNo)


我龍院  2007-10-15 18:21:33  No: 137816

回答ではないのですが、.NETでコーディングしてるなら、
なぜBitmapクラスを使用しないのでしょうか?
せっかく快適なFrameworkのクラス ライブラリーが提供されているのに
使わないのは、エンジンの付いている船を手で漕いでいるようなもので...
まあ個人の自由ではあるが......


  2007-10-15 20:19:26  No: 137817

我龍院さん、ありがとうございます。
現在扱っているのはVB2005なのですが、
このような作業がBitmapクラスで可能なのでしょうか?


魔界の仮面弁士  2007-10-15 21:19:00  No: 137818

画像データのバイナリを、どのように扱いたいのか、にもよりますが、
  (1) Bitmap クラスの LockBits メソッドから、BitmapData を得る。
  (2) BitmapData の Scan0 プロパティから、IntPtr を取得。
  (3) Marshal の Copy メソッドで、その IntPtr をバイト配列にコピー。
  (4) Bitmap の UnlockBits メソッドを呼び出して終了。
という感じですかね。
# BitmapData.Stride プロパティも使うかな。


  2007-10-15 22:17:42  No: 137819

画像データのバイナリを、一度、配列に格納します。
そして、格納したデータを操作して二値化を行おうとしていました。

その後、
FilePut(fileNo, h, )
FilePut(fileNo, a, )
によって再びデータの書き出しを行う、といった内容です。


魔界の仮面弁士  2007-10-15 22:37:24  No: 137820

LockBits メソッドで ReadWrite モードを指定すれば、
編集結果を Bitmap に書き戻すことも可能ですよ。


  2007-10-15 23:06:17  No: 137821

魔界の仮面弁士さん、丁寧な御説明、誠に有難うございます。
Bitmapクラスの扱い方に慣れていないもので、少し勉強してみたいと思います。

有難うございました。


我龍院  2007-10-15 23:48:02  No: 137822

スピードが遅くても良ければ、HELPのサンプルを少し変えて
        Dim image1 As New Bitmap("c:\1.bmp")
        For x As Integer = 0 To image1.Width - 1
            For y As Integer = 0 To image1.Height - 1
                Dim pixelColor As Color = image1.GetPixel(x, y)
                Dim bcolor As Integer = CType((pixelColor.R * 2 + _
                                               pixelColor.G * 4 + _
                                               pixelColor.B) / 7, Integer)
                Dim newColor As Color = Color.FromArgb(bcolor, bcolor, bcolor)
                image1.SetPixel(x, y, newColor)
            Next
        Next
        image1.Save("c:\2.bmp")
こんな方法もあるが。


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

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






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