Я загрузил 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;
}
Спасибо заранее.
Проблема заключается не в неинициализированных значениях, а в том, как
>>
работает оператор; он пропускает пробелы перед чтением (даже вios::binary
режиме). Поэтому всякий раз, когда он достиг символа пробела (0x0A
,0x0D
, и т.д.) он пропустит его и таким образом испортит ваш выход.Вы можете исправить это, добавив
f >> noskipws
перед работой над файлом.Как правило, вы хотите работать с двоичными файлами с
read()/write()
(илиget()/put()
для отдельных символов) и не использовать операторы извлечения. Аналогично тому, как вы обрабатывали получение ширины и высоты. Если бы вы сделалиfile >> someint
это, то он попытался бы разобрать цифры, а не читатьsizeof(int)
байты.