2013-03-10 86 views
0

我正在尝试读取BMP文件并将其保存在2维的缓冲区中,以便以直角旋转它。但是,最终文件不正确,无法显示。以下代码中的问题是什么?读取BMP文件并旋转

#include <fstream.h> 
#include <iostream.h> 

int main() { 
    long int width=686; 
    long int height=800 ; 
/* open file */ 
    FILE * bitmap_file= fopen("filename.bmp", "rb"); 
    if(!bitmap_file) { 
     printf("Could not find file.\n"); 
     fclose(bitmap_file); 
     return 0; 
    } 
    printf("File opened.\n"); 
    typedef struct buffer1 
    {   
     int red; 
     int green; 
     int blue; 
    } buffer1; 
    static buffer1 buffer_bitmap1[686][800]; 
    fseek(bitmap_file, 0, SEEK_SET); 
    int count=0; 
    for(int i = 0; i <8; ++i){ 
     for(int j = 0; j <6; ++j){ 
      fread(&buffer_bitmap1[j][i].red , 1, 1, bitmap_file); /*for rotate bmp exchange the width with height in matrix.*/ 
      fread(&buffer_bitmap1[j][i].green, 1, 1, bitmap_file); 
      fread(&buffer_bitmap1[j][i].blue, 1, 1, bitmap_file); 
      count=count+8; 
      fseek(bitmap_file,count, SEEK_CUR);  /*move pointer*/ 
     } 
    } 
    fclose(bitmap_file); 
    FILE *bitmap_file1= fopen("filename.bmp", "a"); 
    count=0; 
    fseek(bitmap_file, 0, SEEK_SET); 
    char * a ="a"; 
    for(int i = 0; i <6; ++i){ 
     for(int j = 0; j <8; ++j) { 
      fwrite(&buffer_bitmap1[i][j],1,1,bitmap_file1); 
      fwrite(&buffer_bitmap1[i][j].blue,1,1,bitmap_file1); 
      fwrite(&buffer_bitmap1[i][j].green,1,1,bitmap_file1); 
      count=count+8; 
      fseek(bitmap_file, 8, SEEK_CUR);  /*move pointer*/ 
     } 
    } 
    fclose(bitmap_file); 
    return 0; 
} 
+3

看起来像纯C语言为什么它被标记为C++? – 2013-03-10 12:46:40

+0

所以,你包含'fstream.h'和'iostream.h'(它们都不应该存在),并且根本不使用它们。然后你使用了一堆隐含的声明函数,因为你没有包含'cstdio'。哎哟。除此之外,你能提供能显示你想要的结果和你的实际结果的图片吗? – Zeta 2013-03-10 12:49:18

+1

在函数作用域中定义结构体?现在,这是一个怪异的东西! – 2013-03-10 12:54:28

回答

3

至少,你不能简单的从一开始就读取BMP文件,因为它有一个BMP Header

第一所有需要读取的报头INT为了得到BMP参数(图像大小,数据偏移量,每个像素等比特)

第二的,为了将图像旋转并成为能够看到结果,您还需要修改标题。