0

シンプルな bmp ファイルを読み込んで色を反転し、fread および fwrite バイナリ モードを使用してファイル システムに保存しようとしています。

だから私はやった

BMP_Image * img; 
BMP_Header * hdr;

fread(hdr,sizeof(BMP_Header),1, fptr); 

img->width = hdr->width;
img->height = hdr->height;
img->bytes_per_pixel = hdr->bits*BIT_TO_BYTE; 
img->header = *hdr;
img->data_size = hdr->size; 

BMP_Header が構造体であるヘッダー情報を取得する

次に、画像データを読み取り、配列に入れます

fread(data, sizeof(char), img->data_size - 54, fptr);

次に、画像データの各要素を 255 で減算します

int i = 0;
for(i = 0;i<img->data_size;i++){
   data[i] = 255 - data[i];
}

ファイルをファイル システムに書き戻そうとすると、正しく動作しませんでした。fwrite を 2 回実行する必要があることはわかっています。最初にヘッダーを書き込み、次に画像データを書き込みます。

私はこれまでに持っています:

 fwrite(header, 1 ,dataSize, fptr_out); 

これにより、sgmentation fault と 0 バイトの bmp ファイルが表示されます。

これが私の BMP_Header と BMP_image 構造体の typedef です

typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef int int32_t;

typedef struct {
    uint16_t type;                      // Magic identifier
    uint32_t size;                      // File size in bytes
    uint16_t reserved1;     // Not used
    uint16_t reserved2;       // Not used
    uint32_t offset;                    // Offset to image data in bytes
    uint32_t header_size;               // Header size in bytes
    int32_t  width;                     // Width of the image
    int32_t  height;                    // Height of image
    uint16_t planes;                    // Number of color planes
    uint16_t bits;                      // Bits per pixel
    uint32_t compression;               // Compression type
    uint32_t imagesize;                 // Image size in bytes
    int32_t  xresolution;               // Pixels per meter
    int32_t  yresolution;               // Pixels per meter
    uint32_t ncolours;                  // Number of colors  
    uint32_t importantcolours;          // Important colors

} BMP_Header;

typedef struct {
    BMP_Header header;
    int data_size;
    int width;
    int height;
    int bytes_per_pixel; // This amount should be equals to number of bits/8
    char *data;
} BMP_Image;
4

0 に答える 0