C ++: Ошибка записи формата изображения BMP в WINDOWS

У меня здесь самая странная проблема … Я использую тот же код (копипаст) из Linux в Windows для READ и WRITE и BMP изображение. И по какой-то причине в Linux все работает отлично , но когда я перехожу на Windows 10 с некоторых Я не могу открыть эти изображения и получаю сообщение об ошибке, в котором говорится примерно следующее:

«Похоже, мы не поддерживаем этот формат файла.»

Ты хоть представляешь, что мне делать? Я помещу код ниже.

EDIT:

Я решил проблему заполнения, и теперь он пишет изображения, но они полностью белые , знаете почему? Я также обновил код.

  struct BMP {int width;  int height;  заголовок беззнакового символа [54];  беззнаковый символ * пиксели;  int size;  int row_padded;}; void writeBMP (строка имени файла, изображение BMP) {строка fileName = "Выходные файлы \" + имя файла;  ФАЙЛ * out = fopen (имя_файла.c_str (), "wb");  fwrite (image.header, sizeof (символ без знака), 54, выход);  беззнаковый символ tmp;  for (int i = 0; i  

С моей точки зрения, этот код должен быть кроссплатформенным … Но это не … почему?

Спасибо для справки


Проверьте заголовок

Заголовок должен начинаться со следующих двух байтов подписи: 0x42 0x4D . Если это что-то другое, стороннее приложение подумает, что этот файл не содержит изображения BMP, несмотря на расширение файла .bmp.

Размер и способ сохранения пикселей также немного сложнее, чем вы ожидаете: вы предполагаете, что количество битов на пиксель равно 24 и никакого сжатия не используется. Это не гарантируется. Если это не так, вы можете прочитать больше данных, чем доступно, и повредить файл при его обратной записи.

Кроме того, размер заголовка зависит также от версии BMP, которую вы используете, что можно определить с помощью 4-байтового целого числа по смещению 14.

Улучшите свой код

Когда вы загружаете файл, проверьте подпись, версию BMP, количество бит на пиксель и степень сжатия. В целях отладки рассмотрите возможность сброса заголовка, чтобы проверить его вручную:

  for (int i = 0; i  

Кроме того, когда вы fread () проверяете, что количество прочитанных байтов соответствует размеру, который вы хотите прочитать, чтобы убедиться, что вы не работаете с неинициализированными данными буфера.

Edit:

Проверив дамп, выясняется, что формат такой ожидается. Но при проверке размера с заполнением в заголовке с размером с заполнением, который вы рассчитали, похоже, что ошибка здесь:

  image.row_padded = (image.width * 3 + 3  ) & (~ 3); //нормальный размер одной строки с округлением до кратного 4image.pixels = new unsigned char [image.row_padded]; //упс!  Немного короче?   

На самом деле вы читаете строку за строкой, но сохраняете в памяти только последнюю! Это отличается от вашей первой версии, где вы прочитали все пиксели изображения.

Точно так же вы пишете время повторения высоты последней строки.

Пересмотрите свои отступы, работая с общим размером отступов.

  image.row_padded = (image.width * 3 + 3) & (~ 3); //нормальный размер одной строки с округлением до кратного 4image.size_padded = image.row_padded * image.height; //заполненный полный размерimage.pixels = новый символ без знака [image.size_padded]; //да уж !  if (fread (image.pixels, sizeof (unsigned char), image.size_padded, f)! = image.size_padded) {cout  

Оцените статью
Botgadget.ru
Добавить комментарий