シンプルな 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;