Чтение bmp файла в c ++ - PullRequest
0 голосов
/ 28 апреля 2020

Я работаю над проектом. Его суть заключается в чтении и записи увеличенных BMP-файлов и должна делать это с помощью бинарных файлов. У меня проблема с чтением высоты и ширины изображения. Если я помещаю изображение 1x1 в программу, оно говорит, что размер изображения составляет 65kx65k, что совершенно неправильно. Вот мой код Мне нужна помощь с этим.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
typedef struct {
    int8_t id[2];            // Завжди дві літери 'B' і 'M'
    int32_t filesize;        // Розмір файла в байтах
    int16_t reserved[2];     // 0, 0
    int32_t headersize;      // 54L для 24-бітних зображень
    int32_t infoSize;        // 40L для 24-бітних зображень
    int32_t width;           // ширина зображення в пікселях
    int32_t depth;           // висота зображення в пікселях
    int16_t biPlanes;        // 1 (для 24-бітних зображень)
    int16_t bits;            // 24 (для 24-бітних зображень)
    int32_t biCompression;   // 0L
    int32_t biSizeImage;     // Можна поставити в 0L для зображень без компрессії (наш варіант)
    int32_t biXPelsPerMeter; // Рекомендована кількість пікселів на метр, можна 0L
    int32_t biYPelsPerMeter; // Те саме, по висоті
    int32_t biClrUsed;       // Для індексованих зображень, можна поставити 0L
    int32_t biClrImportant;  // Те саме
} BMPHEAD;

typedef struct {
    int8_t redComponent;
    int8_t greenComponent;
    int8_t blueComponent;
} PIXELDATA;
const int width = 65;
const int height = 65;
int main() {
    FILE* in = fopen("test.bmp", "rb");
    if (!in) { cout << "Something wrong with input file"; exit(1); }
    FILE* out = fopen("out.bmp", "wb");
    if(!out){cout << "Something wrong with output file"; exit(2); }
    BMPHEAD head;
    fread(&head, sizeof(BMPHEAD), 1, in);
    fwrite(&head, sizeof(BMPHEAD), 1, out);
    PIXELDATA p;
     for (int i = 1; i <= height; i++) {
        for (int j = 1; j <= width; j++) {
            fread(&p, sizeof(PIXELDATA), 1, in);
            fwrite(&p, sizeof(PIXELDATA), 1, out);
        }
        for (int j = 1; j <= (sizeof(PIXELDATA) * width) % 4; j++)
            fputc(0x00, out);
    }
    fclose(in);
    fclose(out);
    cout << sizeof(PIXELDATA);
}
...