2017-07-07 54 views
1
int main(void) { 
    setvbuf(stdout, NULL, _IONBF, 0); 

    //Input File 
    FILE* infile; 
    infile = fopen("test.bmp", "rb"); 

    //Vars for image 
    char bm[2]; 
    int imageSize; 
    int fileSize; 
    int width, height; 
    char restOfDataOne[12]; 
    char restOfDataTwo[28]; 

    //Read Header Info 
    fread(bm, 1, 2, infile); 
    fread(&fileSize, 1, 4, infile); 
    imageSize = fileSize - 54; 
    fread(restOfDataOne, 1, 12, infile); 
    fread(&width, sizeof(int), 1, infile); 
    fread(&height, sizeof(int), 1, infile); 
    fread(restOfDataTwo, 1, 28, infile); 
    int rowWidth = width * 3; 
    //Read Image Data 
    unsigned char image[height][(width * 3)]; 
    fread(image, sizeof(char), imageSize, infile); 

    //Close 
    fclose(infile); 

    //################################################# 
    //Small BMP 
    //################################################# 
    FILE* smallOut; 
    smallOut = fopen("small.bmp", "wb"); 

    //Small Vars 
    int imageSizeSmall = imageSize/4; 
    int fileSizeSmall = imageSizeSmall + 54; 
    int widthSmall = width/2; 
    int heightSmall = height/2; 
    int smallRowWidth = widthSmall * 3; 
    unsigned char imageSmall[heightSmall][smallRowWidth]; 

    //Image Data 
    int c, d, e; 
    //For every 4 pixels.. store one in small image 
    for(c = 0; c < rowWidth; c++) { 
     for(d = 0; d < height; d++) { 
      //imageSmall[d/2][c/2] = image[d][c]; 
      for(e = 0; e < 3; e++) { 
       //grab every 1 out of 4 and place into small? 
      } 
     } 
    } 

私はbmp画像を読み込むコードを持っていますので、それを縮小し、それを幅の半分と高さの半分の小さなバージョンに出力する必要があります。 4倍小さい。だから私は3ピクセルごとに1つを取らなければならないことを知っていますか?私の新しいsmallImageに入れてみましたが、入れ子になったforループで複数のことを試してみましたが、アルゴリズムを落とすことはできません。私はstackexchangeで複数の投稿を見てきましたが、私は使用できないライブラリを使用しています。 (宿題)。私は誰かが私のためにそれをするのを探していない、ちょうど正しい方向に私を指すか、私にヒントを与えるために誰かを探していますか? フルコードはこちら。 https://pastebin.com/ZVmXtmCxC言語のBMP画像を縮尺する

+0

まあ私は各ピクセルが3バイトである4ピクセルのうち1ピクセルを必要としますか?私は – Jacob

+0

[画像スケーリングアルゴリズム](https://en.wikipedia.org/wiki/Image_scaling)を実装しようとしていると思いますか? –

+0

私は、イメージを単純に幅の半分と半分の大きさに縮小しようとしています。だから私の2D配列(私の元の画像データをBMPヘッダーのものなしで保持している)上でループを実行してから、新しい4番目のピクセルを新しい小さな画像配列に配置します。私はまた、より大きな画像(4倍のサイズ)を作成することによって同じことをする必要があります – Jacob

答えて

1

あなたは次のアドレスで問題のための素晴らしいと詳細な研究があります:私は引用

http://www.davdata.nl/math/bmresize.html

を:

これは、これらのピクセルをスキャンすることによって行われているが、左から右へ上から下へ ソース・ビットマップ上で宛先ピクセルを投影します。

+0

私はそれを読んだので、私は自分のコードのためのアイデアを最初に得た。私はそれを私のforループで2次元配列形式に変換するのに問題があります – Jacob

+0

次にhttps://stackoverflow.com/questions/24672744/how-to-scale-a-bmp-image-using-c-を見てください。と私はちょうど - iostream-and-stdio-headers – Fabien

+0

@ Fabien--あなたは答えを提供していない、あなたはただのリンクを見つけるだけです。これらはコメントでなければなりません。 –

関連する問題