У меня здесь самая странная проблема … Я использую тот же код (копипаст) из 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