- PR -

ビットマップファイルの画像データ部分のみをバイナリデータに読み取る方法

1
投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2007-02-16 20:36
開発環境
VS2005
VB.NET



現状、以下のようにビットマップファイルをバイナリデータとして読み出しています。
Dim strBmpPath As String ="C:\・・・・\XXX.bmp"
Dim fs As New System.IO.FileStream(strBmpPath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Dim reader As New System.IO.BinaryReader(fs)
Dim bmpBytes(CInt(fs.Length - 1)) As Byte
bmpBytes = reader.ReadBytes(CInt(fs.Length))

しかしこれではビットマップのファイルヘッダ(14byte)と情報ヘッダ(Windowsの場合40byte?)が入ってしまいます。
ファイルヘッダと情報ヘッダを除く画像データ部分のみを取得する方法をご教授ください。
よろしくお願いいたします。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-02-16 21:23
BinaryReaderで読み込まずにBitmapクラスを使ってはどうでしょうか。
LockBitsメソッドを使うことでたぶん期待されていることができると思います。

KEN's .NET
「[メモ] VB.NETに関するメモ書き」の 23:[ 画像処理 ]が参考になると思います。
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2007-02-16 22:53
よねKEN様
返答ありがとうございます。
リンクを元に作ってみました。

画像はモノクロなのですが、このままではカラーのようです。
後出しの情報で申し訳ありません。
ご教授お願いいたします。

Dim bmp As New System.Drawing.Bitmap(strBmpPath)

Dim bmpWidth As Integer = bmp.Width
Dim bmpHeight As Integer = bmp.Height

Dim rect As New Rectangle(0, 0, bmpWidth, bmpHeight)
Dim bmpData As BitmapData = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)

Dim stride As Integer = bmpData.Stride
Dim Scan0 As System.IntPtr = bmpData.Scan0

Dim bmpBytes(stride * bmpHeight - 1) As Byte
System.Runtime.InteropServices.Marshal.Copy(Scan0, bmpBytes, 0, stride * bmpHeight)

bmp.Dispose
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-02-16 23:15
引用:

画像はモノクロなのですが、このままではカラーのようです。



Bitmap.LockBits() に PixelFormat.Format24bppRgb を渡してるようですから、それが正常な動作です。

どっちにしろ Bitmap クラスはモノクロ画像を「そのまま」扱うのには向いていないので、RGB 値から階調を計算で求めるのでは駄目なのですか?
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2007-02-17 00:20
渋木宏明(ひどり)様
返答ありがとうございます。

モノクロ画像の画像データのみをバイナリデータとして読み出したいのですが、
RGB 値から階調を計算で求める方法しかないでしょうか?

またその場合、まったく方法がわかりません。
具体的な方法を教えていただけないでしょうか?

よろしくお願いいたします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-02-17 01:04
引用:
しかしこれではビットマップのファイルヘッダ(14byte)と情報ヘッダ(Windowsの場合40byte?)が入ってしまいます。

大きさがわかっているならその分を除外すればいいのでは?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-02-17 14:16
引用:

モノクロ画像の画像データのみをバイナリデータとして読み出したいのですが、
RGB 値から階調を計算で求める方法しかないでしょうか?



.bmp ファイルの保存形式にはいくつかの系統があることは把握しているでしょうか?

扱おうとしている .bmp ファイルが「Windows Bitmap 形式, 256色, パレット」であることが事前に分かっているなら、既にコメントが付いている通り、ビットマップファイルヘッダとビットマップファイルヘッダの分読み飛ばせばパレットデータとビットマップデータを読み取ることが出来ます。

一方、「256色階調の画像」が上記以外の形式(=例えば Windows Bitmap 形式, 24bit カラー等)で保存されてる場合、結局は RGB 値から階調を算出することになります。

引用:

またその場合、まったく方法がわかりません。
具体的な方法を教えていただけないでしょうか?



一般的には、色空間を RGB から YUV に変換した時、Y成分(=輝度)を階調とします。
RGB から YUV への変換式は検索すればすぐみつかるはずです。

1

スキルアップ/キャリアアップ(JOB@IT)