Я пытаюсь читать, писать и переводить файл изображения 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