C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: BitmapDataの負のStrideについて


(過去ログ 97 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■58135 / inTopicNo.1)  BitmapDataの負のStrideについて
  
□投稿者/ レーモン (9回)-(2011/03/26(Sat) 19:47:06)

分類:[VB.NET/VB2005 以降] 

VB2008 Expressを使用しています。
先日、ビットマップの余白範囲をスキャンするための方法について質問させて頂きました。

http://bbs.wankuma.com/index.cgi?mode=al2&namber=58070

その際、BitmapDataのStrideには負の値を持つものがあるという話題がでましたので、色々と調べたのですが
分かりやすい解説を見つけることができませんでした。
例えば、Strideが負であると、上記質問の中で記載したコードでは、

' ---------------------------------------------------------------------
Dim bmp As Bitmap
Dim bmData As Imaging.BitmapData
Dim rect As Rectangle
Dim intStride As Integer
Dim Scan0 As System.IntPtr
Dim bytBits As Byte()
Dim intSize As Integer

'bmpのフォーマットはImaging.PixelFormat.Format32bppArgbである。

rect = New Rectangle(0, 0, bmp.Width, bmp.Height)
bmData = bmp.LockBits(rect, _
Imaging.ImageLockMode.ReadOnly, _
Imaging.PixelFormat.Format24bppRgb)

intStride = bmData.Stride
intSize =  intStride * bmp.Height
Scan0 = bmData.Scan0
bytBits = New Byte(intSize - 1) {}

Marshal.Copy(Scan0, bytBits, 0, intSize)
bmp.UnlockBits(bmData)

' ---------------------------------------------------------------------

の、以下メソッドの第四引数intSize = intStride * bmp.Heightが負になってしまいます。

> Marshal.Copy(Scan0, bytBits, 0, intSize)

そこで、質問は以下の通りです。

1.上記Marshal.Copyメソッドでバイト配列bytBitsを取得するには、ストライドintStrideに絶対値を
  用いればよいのでしょうか?
2.上記でよい場合、バイト配列の先頭には、最後のピクセル(ビットマップ右下端のピクセル)の
  (RGBの)Bの値が入っているのでしょうか?
3.これらビットマップの検証を色々と行っているのですが、まだStrideが負の画像にお目にかかったことがありません。
  これを検証するために、Strideが負のビットマップがあるといいのですが、これをVBで作成することは可能でしょうか?

どうぞよろしくお願いします。

引用返信 編集キー/
■58136 / inTopicNo.2)  Re[1]: BitmapDataの負のStrideについて
□投稿者/ shu (557回)-(2011/03/26(Sat) 21:20:14)
No58135 (レーモン さん) に返信

> そこで、質問は以下の通りです。
>
> 1.上記Marshal.Copyメソッドでバイト配列bytBitsを取得するには、ストライドintStrideに絶対値を
>   用いればよいのでしょうか?
それでいいかと思います。

> 2.上記でよい場合、バイト配列の先頭には、最後のピクセル(ビットマップ右下端のピクセル)の
>   (RGBの)Bの値が入っているのでしょうか?
> 3.これらビットマップの検証を色々と行っているのですが、まだStrideが負の画像にお目にかかったことがありません。
>   これを検証するために、Strideが負のビットマップがあるといいのですが、これをVBで作成することは可能でしょうか?

参考URL
http://msdn.microsoft.com/ja-jp/library/cc370952.aspx

引用返信 編集キー/
■58137 / inTopicNo.3)  Re[2]: BitmapDataの負のStrideについて
□投稿者/ レーモン (10回)-(2011/03/26(Sat) 21:55:02)
No58136 (shu さん) に返信
shu様、いつもありがとうございます。

> 参考URL
> http://msdn.microsoft.com/ja-jp/library/cc370952.aspx

これを見ると、ボトムアップの場合のバイト配列の先頭は、ビットマップ右下端ではなく、左下端の
ピクセルの(RGBの)Bの値のようですね。
参照したサイトではBitmapDataのStrideプロパティの正負については伺うことができませんが、
ボトムアップの場合に、BitmapDataのStrideは負の値になるということでしょうか?
また、これらの検証のため、ボトムアップのビットマップをVBで作成することは可能でしょうか?

なお、今回扱うビットマップは、Bitmapのコンストラクタの引数にサイズのみを指定してインスタンスを作成し
(従って、ビットマップのフォーマットはデフォルトのPixelFormat.Format32bppArgbである)、
これにGraphicsを使って描画を追加するものばかりなのですが、そのようにして作成したビットマップは、
どれもBitmapDataのStrideが正の値でした。
そのため、このように作成したビットマップのBitmapDataのStrideが必ず正の数であるのであれば、
Strideは必ず正であると見なし、この検証自体が不要となるのですが、この点についても確証はありませんので、
この点についても教えて頂けると非常にありがたいです。
引用返信 編集キー/
■58138 / inTopicNo.4)  Re[3]: BitmapDataの負のStrideについて
□投稿者/ shu (558回)-(2011/03/26(Sat) 22:21:12)
No58137 (レーモン さん) に返信

http://www.umekkii.jp/data/computer/file_format/bitmap.cgi
にファイルフォーマットがあります。

先頭を0として22byteから4byteのところに高さ情報が書かれているので
このlong値をマイナスにして書き換えれば出来上がると思います。
引用返信 編集キー/
■58141 / inTopicNo.5)  Re[4]: BitmapDataの負のStrideについて
□投稿者/ Azulean (717回)-(2011/03/26(Sat) 23:27:02)
2011/03/26(Sat) 23:27:31 編集(投稿者)

No58138 (shu さん) に返信
> 先頭を0として22byteから4byteのところに高さ情報が書かれているので
> このlong値をマイナスにして書き換えれば出来上がると思います。

よく読んでください。
ビットマップのヘッダーの高さがマイナスの時は、トップダウンを意味し、プラスの値はボトムアップを意味します。
大抵のビットマップファイルの中身はボトムアップです。


Stride がマイナスになるケースは少ないと思われますが、どういったときになるかまでは明確に説明できかねます。。。
(ファイルからというよりは、明示的にバッファと Stride を渡すコンストラクタでマイナスの Stride を渡したとき?ただ、それに限定されるの?)
引用返信 編集キー/
■58142 / inTopicNo.6)  Re[5]: BitmapDataの負のStrideについて
□投稿者/ shu (560回)-(2011/03/26(Sat) 23:53:29)
No58141 (Azulean さん) に返信
> 2011/03/26(Sat) 23:27:31 編集(投稿者)
>
> ■No58138 (shu さん) に返信
>>先頭を0として22byteから4byteのところに高さ情報が書かれているので
>>このlong値をマイナスにして書き換えれば出来上がると思います。
>
> よく読んでください。
> ビットマップのヘッダーの高さがマイナスの時は、トップダウンを意味し、プラスの値はボトムアップを意味します。
> 大抵のビットマップファイルの中身はボトムアップです。
その記述自体は読みましたがVB側で変換しているのかなと思って逆にすれば反対になるかと思いました。試してみたところどっちでも
読み込み後はトップダウンになってしまうようでした。(絵は見事に反転したのでデータ修正に問題はないと思います)


>
> Stride がマイナスになるケースは少ないと思われますが、どういったときになるかまでは明確に説明できかねます。。。
> (ファイルからというよりは、明示的にバッファと Stride を渡すコンストラクタでマイナスの Stride を渡したとき?ただ、それに限定されるの?)
こうなるとファイルで作るのは無理っぽい気がしてきました。Azulean さんの言うコンストラクタでしか変わらないのなら
考える必要なさそうなきがしますね。

引用返信 編集キー/
■58144 / inTopicNo.7)  Re[6]: BitmapDataの負のStrideについて
□投稿者/ レーモン (11回)-(2011/03/27(Sun) 10:26:25)
Azulean様、shu様、いつもありがとうございます。
まとめますと、以下のように解釈しました。

1.以下のサイトはDIB(Device Independent Bitmaps)フォーマットについての説明である。

  http://msdn.microsoft.com/ja-jp/library/cc370952.aspx

2.以下のサイトはBitmapDataオブジェクトのStrideの説明であり、これによるとStrideが負である場合には
  BitmapDataオブジェクトの指すメモリのビットマップ配列がボトムアップになっている。

  http://msdn.microsoft.com/ja-jp/library/system.drawing.imaging.bitmapdata.stride.aspx

3.このため、上記1.と2.で出てくるトップダウン・ボトムアップは別のものである。

結局、今回の質問で確認したことは、2.のケースのボトムアップですが、少なくともVB側でStrideを意識せずに
ビットマップのインスタンスを作成しているので、このケースは考慮しないことにします。

とりあえず解決済みとはしますが、上記認識に誤りがあれば指摘ください。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -