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つにするにはどのようにアルゴリズムを考えればいいですか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。