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)
回答ではないのですが、.NETでコーディングしてるなら、
なぜBitmapクラスを使用しないのでしょうか?
せっかく快適なFrameworkのクラス ライブラリーが提供されているのに
使わないのは、エンジンの付いている船を手で漕いでいるようなもので...
まあ個人の自由ではあるが......
我龍院さん、ありがとうございます。
現在扱っているのはVB2005なのですが、
このような作業がBitmapクラスで可能なのでしょうか?
画像データのバイナリを、どのように扱いたいのか、にもよりますが、
(1) Bitmap クラスの LockBits メソッドから、BitmapData を得る。
(2) BitmapData の Scan0 プロパティから、IntPtr を取得。
(3) Marshal の Copy メソッドで、その IntPtr をバイト配列にコピー。
(4) Bitmap の UnlockBits メソッドを呼び出して終了。
という感じですかね。
# BitmapData.Stride プロパティも使うかな。
画像データのバイナリを、一度、配列に格納します。
そして、格納したデータを操作して二値化を行おうとしていました。
その後、
FilePut(fileNo, h, )
FilePut(fileNo, a, )
によって再びデータの書き出しを行う、といった内容です。
LockBits メソッドで ReadWrite モードを指定すれば、
編集結果を Bitmap に書き戻すことも可能ですよ。
魔界の仮面弁士さん、丁寧な御説明、誠に有難うございます。
Bitmapクラスの扱い方に慣れていないもので、少し勉強してみたいと思います。
有難うございました。
スピードが遅くても良ければ、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")
こんな方法もあるが。
ツイート | ![]() |