🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1694閲覧

BMP画像の拡大、縮小の手がかり

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2020/11/30 07:36

編集2020/11/30 09:04

c言語

1#include<stdio.h> 2#include<math.h> 3 4typedef unsigned char BYTE; 5 6//アライメント 7#pragma pack(push,1) 8typedef struct tagBITMAPFILEHEADER 9{ 10 unsigned short bfType; //ファイルタイプ 11 unsigned long bfSize; //ファイルサイズ (byte) 12 unsigned short bfReserved1; //予約領域 13 unsigned short bfReserved2; //予約領域 14 unsigned long bfOffBits; //予約領域 15} BITMAPFILEHEADER; 16#pragma pack(pop) 17 18typedef struct tagBITMAPINFOHEADER 19{ 20 unsigned long biSize; //情報ヘッダのサイズ (byte) 21 long biWidth; //画像の幅 (ピクセル) 22 long biHeight; //画像の高さ (ピクセル) 23 unsigned short biPlanes; //プレーン数 24 unsigned short biBitCount; //1 画素あたりのデータサイズ (bit) 25 unsigned long biCompression; //圧縮形式 26 unsigned long biSizeImage; //画像データ部のサイズ (byte) 27 long biXPixPerMeter; //横方向解像度 (1mあたりの画素数) 28 long biYPixPerMeter; //縦方向解像度 (1mあたりの画素数) 29 unsigned long biClrUsed; //格納されているパレット数 (使用色数) 30 unsigned long biClrImporant; //重要なパレットのインデックス 31} BITMAPINFOHEADER; 32 33typedef struct tagRGBQUAD 34{ 35 unsigned char rgbBlue; //青 36 unsigned char rgbGreen; //緑 37 unsigned char rgbRed; //赤 38 unsigned char rgbReserved; //予約領域 39} RGBQUAD; 40 41void main(int argc, char **argv) 42{ 43 BITMAPFILEHEADER BitMapFileHeader; //BMPのファイルヘッダー 44 BITMAPINFOHEADER BitMapInfoHeader; //BMPの情報ヘッダー 45 RGBQUAD BitMapColor; //カラーパレット 46 BYTE *pimg; 47 int i, iSize; 48 FILE *fp; 49 50 51 fp = fopen(argv[1],"rb"); 52 53 if(fp == NULL) 54 { 55 printf("ファイルが存在しません。"); 56 exit(1); 57 } 58 printf("%s file open\n", argv[1]); 59 60 //ファイルヘッダーを読み込む 61 fread(&BitMapFileHeader,sizeof(BITMAPFILEHEADER),1,fp); 62 if(BitMapFileHeader.bfType != 0x4D42){ 63 printf("ビットマップではありません。\n"); 64 exit(1); 65 } 66 67 //情報ヘッダーを読み込む 68 fread(&BitMapInfoHeader,sizeof(BITMAPINFOHEADER),1,fp); 69 70 //カラーパレットを読み込む 71 switch(BitMapInfoHeader.biBitCount) 72 { 73 case 8: 74 fread(&BitMapColor,sizeof(RGBQUAD),1,fp); 75 iSize = BitMapFileHeader.bfSize - ( 14 + 40 + 4 ); 76 printf("%d\n",BitMapInfoHeader.biBitCount); 77 break; 78 case 24: 79 iSize = BitMapFileHeader.bfSize - ( 14 + 40 ); 80 printf("%d\n",BitMapInfoHeader.biBitCount); 81 break; 82 case 32: 83 iSize = BitMapFileHeader.bfSize - ( 14 + 40 ); 84 printf("%d\n",BitMapInfoHeader.biBitCount); 85 break; 86 default: 87 printf("失敗しました"); 88 exit(1); 89 } 90 91 pimg = (BYTE *) malloc(iSize); 92 93 //画像データ部の読み込み 94 fread(pimg,sizeof(BYTE),iSize,fp); 95 96 //ファイルを閉じる 97 if(fclose(fp) == EOF){ 98 printf("ファイルを閉じることが出来ませんでした。\n"); 99 } 100 101 //パスのファイルへ書き込み 102 fp = fopen("sample.bmp","wb"); 103 104 //書き込み 105 //ファイルヘッダーを書き込む 106 fwrite(&BitMapFileHeader,sizeof(BITMAPFILEHEADER),1,fp); 107 //情報ヘッダーを書き込む 108 fwrite(&BitMapInfoHeader,sizeof(BITMAPINFOHEADER),1,fp); 109 110 //8byteのときだけカラーバレットを書き込む 111 if(BitMapInfoHeader.biBitCount == 8) 112 { 113 fwrite(&BitMapColor,sizeof(RGBQUAD),1,fp); 114 } 115 //画像データ部を書き込む 116 fwrite(pimg,sizeof(BYTE),iSize,fp); 117 118 fclose(fp); //ファイルを閉じる 119} 120

8byte,24byte,32byteのBMPファイルを読み込んで、指定の拡大、縮小を行いたいんですが、何から始めればいいんでしょうか。

2倍の拡大の場合は1画素を4倍の大きさにすることが可能ということがわかりました。

そこで1画素を4つにするにはどのようにアルゴリズムを考えればいいですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

8byte,24byte,32byteのBMPファイルを読み込んで、指定の拡大、縮小を行いたいんですが、何から始めればいいんでしょうか。

byteではなくbitでは。

  1. 32bitBmp読込
  2. 24bitBmp読込(読込時にメモリ上で32bitに変換)
  3. 8bitBmp読込(読込時にメモリ上で32bitに変換)
  4. 拡大処理(様々なアルゴリズムがあるので、必要に応じて実装)
  5. 縮小処理(様々なアルゴリズムがあるので、必要に応じて実装)
  6. 32bitBmp保存
  7. 24bitBmp保存(32bit⇒24bit減色処理含む)
  8. 8bitBMP保存(32bit⇒8bit減色処理含む)

ざっと考えただけでも、これくらいのボリュームがあります。まずはファイルの読み込みからでしょうね。
自力でこれら全てを書くと相当な労力になるので、学習目的でないならImageMagick等の既存の画像処理ライブラリを探した方が無難かと思われますが。


2倍の拡大の場合は1画素を4倍の大きさにすることが可能ということがわかりました。

そこで1画素を4つにするにはどのようにアルゴリズムを考えればいいですか?

なんかいつの間にかしれっと質問が追加されていますが、質問変えるなら回答の内容変わってくるので、新しい質問で立ててください。

投稿2020/11/30 08:32

編集2020/11/30 13:23
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まずは、BMP画像のデータフォーマットを調べましょう
ぐぐれば解説が出てきます

投稿2020/11/30 07:40

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問