Я пытаюсь читать, писать и переводить файл изображения bmp с помощью c/С++, формат выходного файла bmp не поддерживается в окне (используя визуальную студию)

Код начинается здесь

      //creat the stucture for the bitmap file, which consist the header of size 54, which contains the information about the file.     
    struct BMP {
        int width;
        int height;
        unsigned char header[54];
        unsigned char *pixels;
        int size;
    };

Функция чтения и записи для файла bmp в c/c++. Здесь я использовал функцию fopen()

      // read the image
BMP readBMP(string filename) {
    BMP image;
    int i;
    string fileName = filename;
    FILE *f = fopen(fileName.c_str(), "rb");
    fread(image.header, sizeof(unsigned char), 54, f); // read the 54-byte header

    // extract image height and width from header
    image.width = *(int *) &image.header[18];
    image.height = *(int *) &image.header[22];
    cout<<"inage width: "<< image.width <<", image height: "<< image.height <<endl;

    image.size = 3 * image.width * image.height;
    image.pixels = new unsigned char[image.size]; // allocate 3 bytes per pixel
    fread(image.pixels, sizeof(unsigned char), image.size, f); // read the rest of the data at once
    fclose(f);

    // bmp stors data in BGR format, so changing the BGR to RGB.
    for (i = 0; i < image.size; i += 3) {
        unsigned char tmp = image.pixels[i];
        image.pixels[i] = image.pixels[i + 2];
        image.pixels[i + 2] = tmp;
    }
    return image;
}

// write image
void writeBMP(string filename, BMP image) {
    string fileName = filename;
    FILE *out = fopen(fileName.c_str(), "wb");
    fwrite(image.header, sizeof(unsigned char), 54, out);
    int i;
    unsigned char tmp;
    for (i = 0; i < image.size; i += 3) {
        tmp = image.pixels[i];
        image.pixels[i] = image.pixels[i + 2];
        image.pixels[i + 2] = tmp;
    }
    fwrite(image.pixels, sizeof(unsigned char), image.size, out); // read the rest of the data at once
    fclose(out);
}

Функция перевода изображения, чтобы перевести изображение в соответствии с размерами x и y.

      // image translation
BMP translation(BMP image, int tx, int ty) {
    BMP newImage = image;
    unsigned char *pixel = new unsigned char[image.size];

    // translation
    for (int x = 0; x < image.width; ++x){
        for (int y = 0; y < image.height; ++y) {
            int xx = x-tx;
            int yy = y+ty;
            if (xx >= 0 && xx < image.width && yy >= 0 && yy < image.height){
                pixel[(y * image.width + x) * 3 + 0] = image.pixels[(yy * image.width + xx) * 3 + 0];
                pixel[(y * image.width + x) * 3 + 1] = image.pixels[(yy * image.width + xx) * 3 + 1];
                pixel[(y * image.width + x) * 3 + 2] = image.pixels[(yy * image.width + xx) * 3 + 2];
            }
        }
    }
    newImage.pixels = pixel;
    return newImage;
}

Вызов основной функции для выполнения операций чтения, записи и перевода приведен ниже.

      int main() {
    BMP image = readBMP("sample_640×426.bmp"); 
    BMP image_t;

    // // original image
    writeBMP("Output-11.bmp", image);

    // image translation
    int x0=100, y0=50;
    image_t = translation(image, x0, y0);
    writeBMP("Out_translate.bmp", image_t);

    return 0;
}

Выходное изображение Windows находится здесь [1][1]: https://stackru.com/images/57360a7d101575d7cf8cd81ba5c5409731f4808a.png

0 ответов

Другие вопросы по тегам