Растровые curropts после загрузки и сохранения

Я загрузил 24-битное несжатое растровое изображение в 2D массив R,G,B беззнаковых символов, а затем сохранил его снова, я использую файловые потоки в двоичных режимах, чтобы гарантировать, что автоматическое форматирование не происходит, и заголовок экспортируется так же импортируется как и весь…Обивка не требуется, так как я использую изображения, кратные 4 по ширине.

Тем не менее выход есть прикрепленный вопрос, своего рода…деформация Изображение говорит само за себя

Примечание : я попробовал и файл и fstream в двоичных режимах, и все дали этот выход
Другое дело, что при проверке вывода с помощью шестнадцатеричного редактора я обнаружил, что он имеет очень повторяющееся значение «CD», которое кажется каким-то повреждением.

Обновление: исходный код:

#include <fstream>
#include <iostream>
#pragma pack(2)
using namespace std;
struct RGB
{
    unsigned char R,G,B;
};

int main()
{
    ifstream f("Picture.bmp",ios::in|ios::binary);
    unsigned char Header[54];
    f.read(reinterpret_cast <char*> (Header),54);
    int W=*(int*) (&Header[18]);
    int H=*(int*) (&Header[22]);

    RGB**Pic=new RGB*[H];
    for (int i=0;i < H;i++)
    {
        Pic[i]=new RGB[W];
        for (int i2=0;i2<W;i2++)
        {
            f>>Pic[i][i2].R;
            f>>Pic[i][i2].B;
            f>>Pic[i][i2].G;
        }
    }
    ofstream save("Output.bmp",ios::out|ios::binary);
    save.write(reinterpret_cast<char*>(&Header),54);
    for (int i=0;i < H;i++)
    {
        for (int i2=0;i2<W;i2++)
        {
            save<<Pic[i][i2].R;
            save<<Pic[i][i2].B;
            save<<Pic[i][i2].G;
        }
    }
        return 0;
}

Спасибо заранее.

1 ответ

  1. Проблема заключается не в неинициализированных значениях, а в том, как >>работает оператор; он пропускает пробелы перед чтением (даже в ios::binaryрежиме). Поэтому всякий раз, когда он достиг символа пробела ( 0x0A,0x0D, и т.д.) он пропустит его и таким образом испортит ваш выход.

    Вы можете исправить это, добавив f >> noskipwsперед работой над файлом.

    Как правило, вы хотите работать с двоичными файлами с read()/write()(или get()/put()для отдельных символов) и не использовать операторы извлечения. Аналогично тому, как вы обрабатывали получение ширины и высоты. Если бы вы сделали file >> someintэто, то он попытался бы разобрать цифры, а не читать sizeof(int)байты.