marsel Δημοσ. 16 Ιουνίου 2010 Δημοσ. 16 Ιουνίου 2010 Καλησπέρα, έχω ένα πρόβλημα με την αποθήκευση 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.
V.I.Smirnov Δημοσ. 16 Ιουνίου 2010 Δημοσ. 16 Ιουνίου 2010 Δεν ξέρω τι κάνεις αλλά το μήκος μιας γραμμής σε bytes υπολογίζεται ως rowLength = 4 * ( ( pInfo->bmiHeader.biWidth * pInfo->bmiHeader.biBitCount + 31 ) / 32) και έτσι είναι πάντα πολλαπλάσιο του 4. pInfo είναι ο δείκτης στη δομή BITMAPINFO του bmp. Και το header το σώζεις αφού βρεις όλα τα στοιχεία του. Μακροσκοπικά μιλώντας, φαίνεται ότι εσύ πρώτα σώζεις το header και μετά συμπληρώνεις την εικόνα οπότε λανθασμένα το header έχει τις παλιές διαστάσεις της εικόνας ( ή το έχεις τροποποιήσει ήδη πριν ; ) Kαι επιπλέον, αφού το image είναι πίνακας δεν χρειάζεται το & στις τρεις fwrite ( ή κανω λάθος ; )
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.