質問編集履歴

1

問題点を詳しくさせていただきました。

2020/12/08 02:10

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- 拡大・縮小の範囲とることはできるようになったのですが、きれいに行うことができません。24bit、32bitだとどのようにコードを書けばいいのか教てください
1
+ 拡大・縮小を行うことはできるようになったのですが、8bitのBMPファイルで3.33倍,0.33倍を行うことができません。サポートされていないと出ます。BMPファイル24bit、32bitだと問題なく行ます
2
2
 
3
3
  ```c言語
4
4
 
@@ -28,7 +28,7 @@
28
28
 
29
29
  unsigned short bfReserved2; //予約領域
30
30
 
31
- unsigned long bfOffBits; //予約領域
31
+ unsigned long bfOffBits; //ファイル先頭から画像データまでのオフセット (byte)
32
32
 
33
33
  } BITMAPFILEHEADER;
34
34
 
@@ -90,17 +90,17 @@
90
90
 
91
91
  BITMAPINFOHEADER BitMapInfoHeader; //BMPの情報ヘッダー
92
92
 
93
- RGBQUAD BitMapColor; //カラーパレット
93
+ RGBQUAD BitMapColor[1000]; //カラーパレット
94
94
 
95
95
  BYTE *pImg, *pChangeImg;
96
96
 
97
- int i, j, k,l, m, iSize, sp1=0, sp2=0;
97
+ int i, j, k,l, m, iSize, sp1=0, sp2=0, iColor;
98
-
98
+
99
- long lWidth, lHeight;
99
+ int lWidth, lHeight;
100
100
 
101
101
  double dMult;
102
102
 
103
- double dWidthSp, dHeightSp;
103
+ double dWidthSp, dHeightSp,dk;
104
104
 
105
105
  int iWidthSp, iHeightSp;
106
106
 
@@ -166,11 +166,11 @@
166
166
 
167
167
  case 8:
168
168
 
169
+ iColor = (BitMapFileHeader.bfOffBits-54)/4;
170
+
169
- fread(&BitMapColor,sizeof(RGBQUAD),1,fp);
171
+ fread(&BitMapColor,sizeof(RGBQUAD),iColor ,fp);
170
-
172
+
171
- iSize = BitMapFileHeader.bfSize - ( 14 + 40 + 4 );
173
+ iSize = BitMapInfoHeader.biWidth * BitMapInfoHeader.biHeight;
172
-
173
- printf("%d\n",BitMapInfoHeader.biBitCount);
174
174
 
175
175
  break;
176
176
 
@@ -178,16 +178,12 @@
178
178
 
179
179
  iSize = BitMapFileHeader.bfSize - ( 14 + 40 );
180
180
 
181
- printf("%d\n",BitMapInfoHeader.biBitCount);
182
-
183
181
  break;
184
182
 
185
183
  case 32:
186
184
 
187
185
  iSize = BitMapFileHeader.bfSize - ( 14 + 40 );
188
186
 
189
- printf("%d\n",BitMapInfoHeader.biBitCount);
190
-
191
187
  break;
192
188
 
193
189
  default:
@@ -236,13 +232,25 @@
236
232
 
237
233
 
238
234
 
235
+ printf("%d\n",iSize);
236
+
237
+ printf("%d\n",BitMapFileHeader.bfSize);
238
+
239
+ printf("%d\n",BitMapInfoHeader.biWidth);
240
+
241
+ printf("%d\n",BitMapInfoHeader.biHeight);
242
+
243
+ printf("%d\n\n\n",BitMapInfoHeader.biSizeImage);
244
+
245
+
246
+
239
247
  lWidth = BitMapInfoHeader.biWidth;
240
248
 
241
249
  lHeight = BitMapInfoHeader.biHeight;
242
250
 
243
251
 
244
252
 
245
- BitMapFileHeader.bfSize = BitMapFileHeader.bfSize + (iSize*(pow(dMult,2)-1));
253
+ BitMapFileHeader.bfSize = iSize + BitMapFileHeader.bfOffBits;
246
254
 
247
255
  BitMapInfoHeader.biWidth = BitMapInfoHeader.biWidth * dMult;
248
256
 
@@ -252,37 +260,13 @@
252
260
 
253
261
 
254
262
 
255
- lWidth = BitMapInfoHeader.biWidth;
256
-
257
- lHeight = BitMapInfoHeader.biHeight;
258
-
259
-
260
-
261
- //拡大、縮小 の倍率
262
-
263
-
264
-
265
- printf("倍率 %lf\n",dMult);
266
-
267
- printf("width %d\n",lWidth);
268
-
269
- printf("height %d\n",lHeight);
270
-
271
- printf("Size %d\n",iSize);
263
+ printf("%d\n",BitMapFileHeader.bfSize);
272
-
273
-
274
-
275
- printf("倍率 %lf\n",dMult);
264
+
276
-
277
- printf("width %d\n",BitMapInfoHeader.biWidth);
265
+ printf("%d\n",BitMapInfoHeader.biWidth);
278
-
266
+
279
- printf("height %d\n",BitMapInfoHeader.biHeight);
267
+ printf("%d\n",BitMapInfoHeader.biHeight);
280
-
281
- printf("Size %d\n",BitMapFileHeader.bfSize);
268
+
282
-
283
- printf("Size %d\n",BitMapInfoHeader.biSizeImage);
269
+ printf("%d\n",BitMapInfoHeader.biSizeImage);
284
-
285
-
286
270
 
287
271
 
288
272
 
@@ -312,7 +296,7 @@
312
296
 
313
297
  case 8:
314
298
 
315
- fwrite(&BitMapColor,sizeof(RGBQUAD),1,fp);
299
+ fwrite(&BitMapColor,sizeof(RGBQUAD),iColor,fp);
316
300
 
317
301
 
318
302
 
@@ -324,21 +308,19 @@
324
308
 
325
309
  {
326
310
 
327
-
328
-
329
311
  dHeightSp = 1/dMult*i;
330
312
 
331
313
  dWidthSp = 1/dMult*j;
332
314
 
333
315
 
334
316
 
335
- iHeightSp = (int)(dHeightSp + 0.5);
317
+ iHeightSp = (int)dHeightSp;
336
-
318
+
337
- iWidthSp = (int)(dWidthSp + 0.5);
319
+ iWidthSp = (int)dWidthSp;
338
-
339
-
340
-
320
+
321
+
322
+
341
- sp2 = iWidthSp + ( iHeightSp * lWidth / dMult);
323
+ sp2 = iWidthSp + ( iHeightSp * lWidth);
342
324
 
343
325
 
344
326
 
@@ -348,39 +330,93 @@
348
330
 
349
331
  }
350
332
 
351
-
352
-
353
- printf("j %d\nheight %d\n",i,lHeight);
354
-
355
- printf("sp1 %d\nsp2 %d\n",sp1,sp2);
356
-
357
333
  }
358
334
 
335
+ break;
336
+
359
337
 
360
338
 
339
+ //24bitのときを書き込む
340
+
341
+ case 24:
342
+
343
+ for(i=0; i<BitMapInfoHeader.biHeight; i++)
344
+
345
+ {
346
+
347
+ for(j=0; j<BitMapInfoHeader.biWidth; j++)
348
+
349
+ {
350
+
351
+ dHeightSp = 1/dMult*i;
352
+
353
+ dWidthSp = 1/dMult*j;
354
+
355
+
356
+
357
+ iHeightSp = (int)dHeightSp;
358
+
361
- printf("完了");
359
+ iWidthSp = (int)dWidthSp;
360
+
361
+
362
+
363
+ sp2 = ((iWidthSp * 3) + (iHeightSp * lWidth * 3)) ;
364
+
365
+
366
+
367
+ for(k=0; k<3; k++)
368
+
369
+ {
370
+
371
+ *(pChangeImg+sp1) = *(pImg+sp2);
372
+
373
+ sp1++;
374
+
375
+ sp2++;
376
+
377
+ }
378
+
379
+ }
380
+
381
+ }
362
382
 
363
383
  break;
364
384
 
365
385
 
366
386
 
367
- //24bitのときを書き込む
387
+ //32bitのときを書き込む
368
-
388
+
369
- case 24:
389
+ case 32:
370
-
390
+
371
- for(j=0; j<lHeight; j++)
391
+ for(i=0; i<BitMapInfoHeader.biHeight; i++)
372
392
 
373
393
  {
374
394
 
375
- for(i=0; i<lWidth; i++)
395
+ for(j=0; j<BitMapInfoHeader.biWidth; j++)
376
396
 
377
397
  {
378
398
 
399
+ dHeightSp = 1/dMult*i;
400
+
401
+ dWidthSp = 1/dMult*j;
402
+
403
+
404
+
405
+ iHeightSp = (int)dHeightSp;
406
+
407
+ iWidthSp = (int)dWidthSp;
408
+
409
+
410
+
411
+ sp2 = ((iWidthSp * 4) + (iHeightSp * lWidth * 4)) ;
412
+
413
+
414
+
379
- for(k=0; k<3; k++)
415
+ for(k=0; k<4; k++)
380
416
 
381
417
  {
382
418
 
383
- *(pChangeImg+sp2) = *(pImg+sp1);
419
+ *(pChangeImg+sp1) = *(pImg+sp2);
384
420
 
385
421
  sp1++;
386
422
 
@@ -392,45 +428,7 @@
392
428
 
393
429
  }
394
430
 
395
- break;
396
-
397
-
398
-
399
- //32bitのときを書き込む
400
-
401
- case 32:
402
-
403
- for(i=0; i<lHeight; i++)
404
-
405
- {
406
-
407
- for(j=0; j<lWidth; j++)
408
-
409
- {
410
-
411
- for(k=0; k<4; k++)
412
-
413
- {
414
-
415
- *(pChangeImg+sp2) = *(pImg+sp1);
416
-
417
- sp1++;
418
-
419
- sp2++;
420
-
421
- }
431
+ }
422
-
423
- }
424
-
425
- }
426
-
427
- break;
428
-
429
- }
430
-
431
-
432
-
433
- printf("完了");
434
432
 
435
433
 
436
434
 
@@ -440,18 +438,14 @@
440
438
 
441
439
 
442
440
 
443
- printf("完了");
444
-
445
-
446
-
447
441
  //ファイルを閉じる
448
442
 
449
443
  fclose(fp);
450
444
 
451
- printf("完了");
452
-
453
445
  }
454
446
 
455
447
 
456
448
 
449
+
450
+
457
451
  ```