J’essaie de lire un fichier BMP simple et sans effectuer aucune opération, je l’écris de nouveau dans le fichier.
Je ne sais pas où l’erreur est dans la lecture ou la réécriture du fichier. J’ai ajouté un rembourrage lors de la lecture et de l’écriture
– Fichier-lu -.
std::vector 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 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)); }
– écrire le code
file.write(reinterpret_cast(m_bmpHeader), sizeof(BITMAPFILEHEADER)); file.write(reinterpret_cast(m_bmpInfo), sizeof(BITMAPINFOHEADER)); // this is wrong.. format asks for bgr.. we are putting all r, all g, all b std::vector 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 height ; i++) { // maybe something is wrong file.write(reinterpret_cast(&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();
Mais les résultats sont étranges.
Output image------Input image
Comme le remplissage est ajouté à chaque ligne, je pense que vous devez changer cette ligne:
file.seekg(m_bmpHeader->dataoffset + i*m_bmpInfo->width*3 + padding);
pour ça:
file.seekg(m_bmpHeader->dataoffset + i*(m_bmpInfo->width*3 + padding));
Il pourrait également être plus facile de sauvegarder le remplissage calculé plutôt que de le calculer de deux manières différentes.
Edit: Sans tout le code à déboguer, il est un peu difficile à cerner, mais il y a une erreur sur cette ligne:
file.read(&tempImageData[i*m_bmpInfo->width*3], i*m_bmpInfo->width*3);
vous ne devriez pas avoir la partie dans le montant que vous lisez. Cela signifie qu’à la ligne 200, vous lisez 200 lignes de données dans le tableau, en remplaçant éventuellement la fin du tableau. une fois que vous avez parcouru plus de la moitié de l’image, ce qui est intéressant compte tenu de votre rendu.