拡大・縮小を行うことはできるようになったのですが、8bitのBMPファイルで3.33倍,0.33倍を行うことができません。サポートされていないと出ます。BMPファイル24bit、32bitだと問題なく行えます。
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; //ファイル先頭から画像データまでのオフセット (byte) 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[1000]; //カラーパレット 46 BYTE *pImg, *pChangeImg; 47 int i, j, k,l, m, iSize, sp1=0, sp2=0, iColor; 48 int lWidth, lHeight; 49 double dMult; 50 double dWidthSp, dHeightSp,dk; 51 int iWidthSp, iHeightSp; 52 FILE *fp; 53 54 if(argc != 3) 55 { 56 printf("フォーマットが違います。"); 57 exit(1); 58 } 59 60 fp = fopen(argv[1],"rb"); 61 62 if(fp == NULL) 63 { 64 printf("ファイルが存在しません。"); 65 exit(1); 66 } 67 printf("%s file open\n", argv[1]); 68 69 //ファイルヘッダーを読み込む 70 fread(&BitMapFileHeader,sizeof(BITMAPFILEHEADER),1,fp); 71 if(BitMapFileHeader.bfType != 0x4D42){ 72 printf("ビットマップではありません。\n"); 73 exit(1); 74 } 75 76 //情報ヘッダーを読み込む 77 fread(&BitMapInfoHeader,sizeof(BITMAPINFOHEADER),1,fp); 78 79 //カラーパレットを読み込む 80 switch(BitMapInfoHeader.biBitCount) 81 { 82 case 8: 83 iColor = (BitMapFileHeader.bfOffBits-54)/4; 84 fread(&BitMapColor,sizeof(RGBQUAD),iColor ,fp); 85 iSize = BitMapInfoHeader.biWidth * BitMapInfoHeader.biHeight; 86 break; 87 case 24: 88 iSize = BitMapFileHeader.bfSize - ( 14 + 40 ); 89 break; 90 case 32: 91 iSize = BitMapFileHeader.bfSize - ( 14 + 40 ); 92 break; 93 default: 94 printf("失敗しました"); 95 exit(1); 96 } 97 98 pImg = (BYTE *) malloc(iSize); 99 100 //画像データ部の読み込み 101 fread(pImg,sizeof(BYTE),iSize,fp); 102 103 //ファイルを閉じる 104 if(fclose(fp) == EOF){ 105 printf("ファイルを閉じることが出来ませんでした。\n"); 106 } 107 108 //パスのファイルへ書き込み 109 fp = fopen("sample.bmp","wb"); 110 111 //書き込み 112 dMult = atof(argv[2]); 113 114 iSize = iSize * pow(dMult,2); 115 116 printf("%d\n",iSize); 117 printf("%d\n",BitMapFileHeader.bfSize); 118 printf("%d\n",BitMapInfoHeader.biWidth); 119 printf("%d\n",BitMapInfoHeader.biHeight); 120 printf("%d\n\n\n",BitMapInfoHeader.biSizeImage); 121 122 lWidth = BitMapInfoHeader.biWidth; 123 lHeight = BitMapInfoHeader.biHeight; 124 125 BitMapFileHeader.bfSize = iSize + BitMapFileHeader.bfOffBits; 126 BitMapInfoHeader.biWidth = BitMapInfoHeader.biWidth * dMult; 127 BitMapInfoHeader.biHeight = BitMapInfoHeader.biHeight * dMult; 128 BitMapInfoHeader.biSizeImage = BitMapInfoHeader.biSizeImage * pow(dMult,2); 129 130 printf("%d\n",BitMapFileHeader.bfSize); 131 printf("%d\n",BitMapInfoHeader.biWidth); 132 printf("%d\n",BitMapInfoHeader.biHeight); 133 printf("%d\n",BitMapInfoHeader.biSizeImage); 134 135 //ファイルヘッダーを書き込む 136 fwrite(&BitMapFileHeader,sizeof(BITMAPFILEHEADER),1,fp); 137 //情報ヘッダーを書き込む 138 fwrite(&BitMapInfoHeader,sizeof(BITMAPINFOHEADER),1,fp); 139 140 //マロック 141 pChangeImg = (BYTE *) malloc(iSize); 142 143 //画像データを書き込む 144 switch(BitMapInfoHeader.biBitCount) 145 { 146 //8bitのときを書き込む 147 case 8: 148 fwrite(&BitMapColor,sizeof(RGBQUAD),iColor,fp); 149 150 for(i=0; i < BitMapInfoHeader.biHeight; i++) 151 { 152 for(j=0; j<BitMapInfoHeader.biWidth; j++) 153 { 154 dHeightSp = 1/dMult*i; 155 dWidthSp = 1/dMult*j; 156 157 iHeightSp = (int)dHeightSp; 158 iWidthSp = (int)dWidthSp; 159 160 sp2 = iWidthSp + ( iHeightSp * lWidth); 161 162 *(pChangeImg+sp1) = *(pImg+sp2); 163 sp1++; 164 } 165 } 166 break; 167 168 //24bitのときを書き込む 169 case 24: 170 for(i=0; i<BitMapInfoHeader.biHeight; i++) 171 { 172 for(j=0; j<BitMapInfoHeader.biWidth; j++) 173 { 174 dHeightSp = 1/dMult*i; 175 dWidthSp = 1/dMult*j; 176 177 iHeightSp = (int)dHeightSp; 178 iWidthSp = (int)dWidthSp; 179 180 sp2 = ((iWidthSp * 3) + (iHeightSp * lWidth * 3)) ; 181 182 for(k=0; k<3; k++) 183 { 184 *(pChangeImg+sp1) = *(pImg+sp2); 185 sp1++; 186 sp2++; 187 } 188 } 189 } 190 break; 191 192 //32bitのときを書き込む 193 case 32: 194 for(i=0; i<BitMapInfoHeader.biHeight; i++) 195 { 196 for(j=0; j<BitMapInfoHeader.biWidth; j++) 197 { 198 dHeightSp = 1/dMult*i; 199 dWidthSp = 1/dMult*j; 200 201 iHeightSp = (int)dHeightSp; 202 iWidthSp = (int)dWidthSp; 203 204 sp2 = ((iWidthSp * 4) + (iHeightSp * lWidth * 4)) ; 205 206 for(k=0; k<4; k++) 207 { 208 *(pChangeImg+sp1) = *(pImg+sp2); 209 sp1++; 210 sp2++; 211 } 212 } 213 } 214 } 215 216 //画像データ部を書き込む 217 fwrite(pChangeImg,sizeof(BYTE),iSize ,fp); 218 219 //ファイルを閉じる 220 fclose(fp); 221} 222 223
> きれいに行うことができません
具体的にどのような問題が起こっているのか記載してください
拡大縮小アルゴリズムをWeb検索すればすぐ出てくると思うのですが。というか、前回ページ紹介しましたよね。回答読む気がないなら自分で考えるなり好きにしてください。
あなたの回答
tips
プレビュー