Προς το περιεχόμενο

Πρόβλημα με bmp σε C


marsel

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

έχω ένα πρόβλημα με την αποθήκευση bmp αρχείου σε C.

Ενώ δουλεύει με τις εικόνες που το width τους σε bytes είναι πολλαπλάσιο του τέσσερα,

ο παρακάτω κώδικας κολλάει μάλλον στο κομμάτι που συμπληρώνω με μηδενικά bytes ώστε να γίνει πολλαπλάσιο του τέσσερα.

 

>
if(!(newImage = fopen(dest,"wb")))
{
	return 0;
}

if(!(writeHeader(newImage,info)))
{
	return 0;
}

if(!(writeInfo(newImage,info)))
{
	return 0;
}

for(loop=infoHeader->biHeight-1;loop>=0;loop--)
{
	for(loopi=0;loopi<infoHeader->biWidth;loopi++)
	{
		fwrite(&image[loopi][loop].rgbBlue,sizeof(unsigned char),1,newImage);
		fwrite(&image[loopi][loop].rgbGreen,sizeof(unsigned char),1,newImage);
		fwrite(&image[loopi][loop].rgbRed,sizeof(unsigned char),1,newImage);
	}
	tmp = (infoHeader->biWidth*3 % 4);
	if(tmp!=0)
	{
		for(loop=0;loop<tmp;loop++)
		{
			fwrite(&zero,sizeof(unsigned char),1,newImage);
		}
	}
}

 

Η μεταβλητή zero είναι const unsigned char με τιμή 0.

Δημοσ.

Δεν ξέρω τι κάνεις αλλά το μήκος μιας γραμμής σε bytes υπολογίζεται ως

rowLength = 4 * ( ( pInfo->bmiHeader.biWidth * pInfo->bmiHeader.biBitCount + 31 ) / 32)

και έτσι είναι πάντα πολλαπλάσιο του 4.

pInfo είναι ο δείκτης στη δομή BITMAPINFO του bmp.

Και το header το σώζεις αφού βρεις όλα τα στοιχεία του.

 

Μακροσκοπικά μιλώντας, φαίνεται ότι εσύ πρώτα σώζεις το header και μετά συμπληρώνεις την εικόνα οπότε

λανθασμένα το header έχει τις παλιές διαστάσεις της εικόνας ( ή το έχεις τροποποιήσει ήδη πριν ; )

Kαι επιπλέον, αφού το image είναι πίνακας δεν χρειάζεται το & στις τρεις fwrite ( ή κανω λάθος ; )

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...