回答編集履歴

2

コメントを受けて追記、補足。

2018/03/19 02:52

投稿

dodox86
dodox86

スコア9183

test CHANGED
@@ -41,3 +41,33 @@
41
41
  また、他の回答者様も書かれていますが、例えばWindowsのビットマップでも各種の形式があります。
42
42
 
43
43
  carnage0216さんの読まれている書籍でどのようなビットマップを想定しているのかで取り扱いが変わってきますので注意してください。
44
+
45
+
46
+
47
+ ---
48
+
49
+ 2018/03/19 追記
50
+
51
+ 解決済みの質問ですが、コメントをいただきましたので追記して補足します。
52
+
53
+
54
+
55
+ コメントより
56
+
57
+ > width%4の「何」値と4-(width*3)%4のwidthの「何」の値が1,2,3…と一致しているのかわからないのです。
58
+
59
+
60
+
61
+ `width = 15`のケースですが、24ビットRGBデータが15画素(ピクセル)分メモリ上に展開すると、以下の図のようになります。
62
+
63
+ ![イメージ説明](e23c76f4a6ad4ab79d36f32a33b35476.png)
64
+
65
+ 尚、Windowsのビットマップ形式ではRGBはB,G,Rと並ぶので、図でもそのように表記しています。
66
+
67
+
68
+
69
+ 図を見ていくと分かっていただけると思うのですが、画面に描画する幅、つまり画素数であるwidthの数と、それを表す為のRGBデータのバイト列でのバイト数を分けて考える必要があります。
70
+
71
+
72
+
73
+ 4バイト境界と3バイトのRGB(B,G,R)データが何度もまたがります。で、この例では1から始めて45バイト目でRGBデータが終わってしまい、45は4で割り切れず、もうひとつ上の4の倍数48を満たせるよう、ダミーで3バイト詰める、と言う訳です。(図の'D'のデータ)

1

改行位置修正

2018/03/19 02:52

投稿

dodox86
dodox86

スコア9183

test CHANGED
@@ -10,11 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- この場合、RGBデータは (width * 3) で15 * 3 = 45。RGBデータとして全45バイトになるのはいいですよね。
14
-
15
- 次に、4 - (45 % 4) でまず、(45 % 4)の答え、45 / 4 の余り=1。この余りと言うのは4バイト境界からはみ出る分です。はみ出た1バイト分を4バイト境界に収める為にはその差を求めるわけですから、
16
-
17
- 4 - 1 で3。お尻に3バイトを詰める(パディング)します。
13
+ この場合、RGBデータは (width * 3) で15 * 3 = 45。RGBデータとして全45バイトになるのはいいですよね。次に、4 - (45 % 4) でまず、(45 % 4)の答え、45 / 4 の余り=1。この余りと言うのは4バイト境界からはみ出る分です。はみ出た1バイト分を4バイト境界に収める為にはその差を求めるわけですから、4 - 1 で3。お尻に3バイトを詰める(パディング)します。
18
14
 
19
15
 
20
16
 
@@ -34,9 +30,7 @@
34
30
 
35
31
  言葉の使い方なのか、記述が足りないのか、誤解があるのか判断しかねているのですが、恐らく違います。
36
32
 
37
- **widthの余りのとなった1~3バイト数のRGBはダミーデータとして扱われる。**のではなく、
38
-
39
- width * 3で得られた数分のバイト列はビットマップデータとして全て使うはずで、お尻が4バイト境界に収まらない場合、1~3バイトの使われないダミーデータで詰めます。この手の処理はビットマップに限らず、良く行われます。
33
+ **「widthの余りのとなった1~3バイト数のRGBはダミーデータとして扱われる」**のではなく、width * 3で得られた数分のバイト列はビットマップデータとして全て使うはずで、お尻が4バイト境界に収まらない場合、1~3バイトの使われないダミーデータで詰めます。この手の処理はビットマップに限らず、良く行われます。
40
34
 
41
35
 
42
36