回答編集履歴

3

tuiki

2018/02/19 08:16

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -105,3 +105,107 @@
105
105
 
106
106
 
107
107
  頑張ってみてください。
108
+
109
+
110
+
111
+ コメントを受けて説明追記
112
+
113
+ ---
114
+
115
+ 今回、純粋に画像にしたいデータの1行分の長さは、7列 x 2倍 x 3バイト = 42バイトです。
116
+
117
+
118
+
119
+ 式にすると
120
+
121
+ `画像の実データ長(①)` = `x * zoom * 3`
122
+
123
+ です。
124
+
125
+
126
+
127
+ これを画像ファイルにする際は1行を4の倍数に揃えたいので、4で割った余りの数を4から引いた数だけNULLを補完します。
128
+
129
+ 必要なNULLの数は、42バイト を 4バイト で割った余り、2バイトを 4バイトから引いた値、2バイトです。
130
+
131
+
132
+
133
+ 式にすると
134
+
135
+ `NULLデータ長(z)` = `4 - ((x * zoom * 3) mod 4)`
136
+
137
+ です。
138
+
139
+
140
+
141
+ ※ここ、わかりにくいですかね。
142
+
143
+ ※例えば倍率が1の場合、 7 * 1 * 3 = 21バイトで、4で割った余りは1です。4の倍数にするためには4-1=3バイトのNULLが必要ということです。
144
+
145
+
146
+
147
+
148
+
149
+ 画像データにする時の1行の長さは、`画像の実データ長(①)` + `NULLデータ長(z)`ですので、今回は 42バイト + 2バイト = 44バイトです。
150
+
151
+ 式にすると
152
+
153
+ `1行のデータ長(②)` = `(x * zoom * 3) + (4 - ((x * zoom * 3) mod 4))`
154
+
155
+ です。
156
+
157
+
158
+
159
+ ---
160
+
161
+ 画像データ部のサイズは、`1行のデータ長(②)` * `行数` ですので、今回は 44バイト x 7行 x 2倍 = 616バイトです。
162
+
163
+ 式にすると
164
+
165
+ `画像データサイズ(③)` = `((x * zoom * 3) + (4 - ((x * zoom * 3) mod 4))) * y * zoom`
166
+
167
+ です。
168
+
169
+
170
+
171
+ ---
172
+
173
+ 最後に全体のファイルサイズは、`ヘッダ部のサイズ(54バイト)` + `画像データサイズ(③)`ですので、今回は 54 + 616バイト = 670バイトです。
174
+
175
+ 式にすると
176
+
177
+ 全体のファイルサイズ(f) = `54 + (((x * zoom * 3) + (4 - ((x * zoom * 3) mod 4))) * y * zoom)`
178
+
179
+ となります。
180
+
181
+
182
+
183
+ ---
184
+
185
+ ご覧のとおり、Nullデータ長(z)は列数(x)と倍率(zoom)に依存するため固定値とはならず、最終的な計算式にも出現しません。
186
+
187
+
188
+
189
+ zの代わりに倍率zoomを要素とするなら、
190
+
191
+ `f(x, y, zoom) = 54 + (((x * zoom * 3) + (4 - ((x * zoom * 3) mod 4))) * y * zoom)`
192
+
193
+ という回答になります。
194
+
195
+
196
+
197
+ zoomを2倍と固定してf(x,y)で式にするなら
198
+
199
+ `f(x, y) = 54 + (((x * 6) + (4 - ((x * 6) mod 4))) * y * 2)`
200
+
201
+ です。
202
+
203
+
204
+
205
+ 合計の式というよりは過程で求めた1行のバイト数やNULLバイト数が正しく算出できるか、というところが重要ですね。
206
+
207
+ 上記も1行ですっきり書いてしまうよりは、過程の計算をそれぞれ変数に代入していった方が、結果がおかしいときに原因を探りやすくなると思います。
208
+
209
+
210
+
211
+ 参考になれば幸いです。

2

syuusei 2

2018/02/19 08:15

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -28,21 +28,29 @@
28
28
 
29
29
 
30
30
 
31
- これもリトルエンディアンで書かれていますので、正解は`0x029E`です。
31
+ これもリトルエンディアンで書かれていますので、正解の方は`0x029E`、10進数は670という数字になっています。
32
32
 
33
- 10進数では670という数字になります。
33
+ この値の根拠を考えてみます。
34
34
 
35
35
 
36
36
 
37
- この根拠を考えてみます。
38
-
39
- ヘッダ部は54バイト)なので、データ部は616バイトということになります。
37
+ ヘッダ部は54バイトなので、データ部は616バイトということになります。
40
38
 
41
39
 
42
40
 
43
- 14行x14列をカラーコード3バイトで表すので、単純計算では14行 * 14列 * 3バイト = 588バイトです。
41
+ 14行x14列をカラーコード3バイトで表すので、単純計算では
44
42
 
43
+ 14行 * 14列 * 3バイト = 588バイト
44
+
45
+ です。
46
+
47
+
48
+
49
+ しかし1行ごとに4の倍数のバイト数となるようにNULL(00)を補う必要があるので、
50
+
45
- しかし1行ごとに4の倍数のバイト数となるように00が補われますので、14行 * ((14列 * 3バイト) `+ 2バイト`) = 616バイトとなるわけです。
51
+ 14行 * ((14列 * 3バイト) `+ 2バイト`) = 616バイト
52
+
53
+ となるわけです。
46
54
 
47
55
 
48
56
 
@@ -64,9 +72,9 @@
64
72
 
65
73
 
66
74
 
67
- 今回は7x7のデータを14x14として出力するため、各セルを行・列それぞれで2回ずつ出力しているようです。
75
+ 今回は7x7のデータを14x14として出力するため、各セルを行・列それぞれで2回ずつ出力していす。
68
76
 
69
- ここまでは問題なさそうですが、1行が4の倍数となるように補う部分問題ありそうです。
77
+ ここまでは問題なさそうですが、1行が4の倍数となるように補う部分問題ありそうです。
70
78
 
71
79
 
72
80
 
@@ -74,15 +82,15 @@
74
82
 
75
83
  `Palette = Palette & WorksheetFunction.Rept(" 00 00", 4 - ((3 * arg.Columns.Count * zoom) Mod 4))`
76
84
 
85
+ となっています。
86
+
77
- の部分ですが、上記で`4 - ((3 * arg.Columns.Count * zoom) Mod 4)`は`4 - ((3 * 7 * 2) Mod 4)`で`2`となり、" 00 00"を2回繰り返して"00 00 00 00"を付加しています。
87
+ 上記で`4 - ((3 * arg.Columns.Count * zoom) Mod 4)`は`4 - ((3 * 7 * 2) Mod 4)`で結果は`2`となります。
88
+
89
+ この結果、"00 00"を2回繰り返して"00 00 00 00"を付加しています。
78
90
 
79
91
 
80
92
 
81
- 今回補いたいのは(14列x3バイト)=42を4で割った余り2バイト分の"00 00"で、4バイト出力してしまっています。
93
+ 今回補いたいのは(14列x3バイト)=42バイトを4で割った余り2バイト分の"00 00"なの、ここも修正必要な個所かと思います。
82
-
83
-
84
-
85
- ここも修正が必要な個所かと思います。
86
94
 
87
95
 
88
96
 
@@ -92,7 +100,7 @@
92
100
 
93
101
  これらを修正すれば、正しい画像が出力されると思います。
94
102
 
95
- ※私の環境でデータ部のロジックを修正し、ヘッダ部の計算はバイナリファイル正しい値を直書きたところ、正常な画像となりました。
103
+ ※私の環境でデータ部のロジックを修正し、出力された画像ファイルをバイナリエディタで正しいファイルサイズ・データサイズに書き換えてみたところ、正常な画像となりました。
96
104
 
97
105
 
98
106
 

1

修正

2018/02/19 05:38

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  14行x14列をカラーコード3バイトで表すので、単純計算では14行 * 14列 * 3バイト = 588バイトです。
44
44
 
45
- しかし1行ごとに4の倍数のバイト数となるように00が補われますので、((14 * 3バイト) + 2バイト) * 14列 = 616バイトとなるわけです。
45
+ しかし1行ごとに4の倍数のバイト数となるように00が補われますので、14行 * ((14 * 3バイト) `+ 2バイト`) = 616バイトとなるわけです。
46
46
 
47
47
 
48
48