2015-01-14 3 views
4

Я пытаюсь прочитать простой BMP-файл и без выполнения каких-либо операций. Я пишу его снова в файл.Чтение/запись SImple BMP Image C++

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

- Файл-Чтение -.

std::vector<char> tempImageData; 
/*tempImageData.resize(m_bmpInfo->imagesize); 
file.seekg(m_bmpHeader->dataoffset); 
file.read(&tempImageData[0], m_bmpInfo->imagesize); 
file.close();*/ 
tempImageData.resize(m_bmpInfo->imagesize); 
int padding = 0; 
while (((m_bmpInfo->width*3+padding) % 4) != 0) 
    padding++; 
for(unsigned int i = 0 ; i < m_bmpInfo->height ; i++) 
{ 
    file.seekg(m_bmpHeader->dataoffset + i*(m_bmpInfo->width*3 + padding)); 
    file.read(&tempImageData[i*m_bmpInfo->width*3], i*m_bmpInfo->width*3); 
} 
file.close(); 
//bitmaps are stored as BGR -- lets convert to RGB 
assert(m_bmpInfo->imagesize % 3 == 0); 

for (auto i = tempImageData.begin(); i != tempImageData.end(); i+=3) 
{ 
    m_data_red.push_back(*(i+2)); 
    m_data_green.push_back(*(i+1)); 
    m_data_blue.push_back(*(i+0)); 
} 

- написать код

file.write(reinterpret_cast<const char*>(m_bmpHeader), sizeof(BITMAPFILEHEADER)); 
file.write(reinterpret_cast<const char*>(m_bmpInfo), sizeof(BITMAPINFOHEADER)); 

// this is wrong.. format asks for bgr.. we are putting all r, all g, all b 
std::vector<char> img; 
img.reserve(m_data_red.size() + m_data_green.size() + m_data_blue.size()); 

for(unsigned int i = 0 ; i < m_data_red.size() ; i++) 
{ 
    img.push_back(m_data_blue[i]); 
    img.push_back(m_data_green[i]); 
    img.push_back(m_data_red[i]); 
} 

char bmppad[3] = {0}; 

for(unsigned int i = 0 ; i < m_bmpInfo->height ; i++) 
{ 
    // maybe something is wrong 
    file.write(reinterpret_cast<const char*>(&img[i*m_bmpInfo->width*3]), m_bmpInfo->width * 3 * sizeof(unsigned char)); 
    file.write(bmppad, 1 * ((4-(m_bmpInfo->width*3)%4)%4) * sizeof(char)); 
} 

file.close(); 

Но результаты странно.

Output image------Input image 

enter image description here Input Image

+1

Открываете ли вы файлы в двоичном режиме? Вы оставили этот код. – user3344003

+0

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

+0

Возможно, попробуйте использовать unsigned char вместо char ? –

ответ

6

Как дополнение добавляется к каждой строке, я думаю, вы должны изменить эту строку:

file.seekg(m_bmpHeader->dataoffset + i*m_bmpInfo->width*3 + padding); 

к этому:

file.seekg(m_bmpHeader->dataoffset + i*(m_bmpInfo->width*3 + padding)); 

It также может быть легче сэкономить рассчитанное дополнение, а n вычисляя его двумя разными способами.

Edit: Без всего кода для отладки через, это немного трудно определить, но есть ошибка в этой строке:

file.read(&tempImageData[i*m_bmpInfo->width*3], i*m_bmpInfo->width*3); 

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

+0

Благодарим вас за ответ. Я все еще не понимаю, см. Мое редактирование. – user2705939

+0

См. Дополнительное исправление в моем ответе, но не уверен, что это поможет. –

+0

да .. это было .. спасибо sooo много !! – user2705939