C++ Comment créer un fichier bitmap
Je suis à essayer de comprendre comment créer un fichier bitmap en C++ VS. Actuellement, j'ai pris le nom de fichier et l'ajout de l' ".bmp" l'extension à créer le fichier. Je veux savoir comment je pouvais changer les pixels du fichier en faisant en différentes couleurs ou des motifs (ie. comme un damier) C'est ma fonction que j'ai et je crois que j'ai envoyer 3 Octets différents à la fois afin d'établir la couleur du pixel.
void makeCheckerboardBMP(string fileName, int squaresize, int n) {
ofstream ofs;
ofs.open(fileName + ".bmp");
writeHeader(ofs, n, n);
for(int row = 0; row < n; row++) {
for(int col = 0; col < n; col++) {
if(col % 2 == 0) {
ofs << 0;
ofs << 0;
ofs << 0;
} else {
ofs << 255;
ofs << 255;
ofs << 255;
}
}
}
}
void writeHeader(ostream& out, int width, int height){
if (width % 4 != 0) {
cerr << "ERROR: There is a windows-imposed requirement on BMP that the width be a
multiple of 4.\n";
cerr << "Your width does not meet this requirement, hence this will fail. You can fix
this\n";
cerr << "by increasing the width to a multiple of 4." << endl;
exit(1);
}
BITMAPFILEHEADER tWBFH;
tWBFH.bfType = 0x4d42;
tWBFH.bfSize = 14 + 40 + (width*height*3);
tWBFH.bfReserved1 = 0;
tWBFH.bfReserved2 = 0;
tWBFH.bfOffBits = 14 + 40;
BITMAPINFOHEADER tW2BH;
memset(&tW2BH,0,40);
tW2BH.biSize = 40;
tW2BH.biWidth = width;
tW2BH.biHeight = height;
tW2BH.biPlanes = 1;
tW2BH.biBitCount = 24;
tW2BH.biCompression = 0;
out.write((char*)(&tWBFH),14);
out.write((char*)(&tW2BH),40);
}
(1) Avez-vous fermer le flux de données? (2) Vous pouvez modifier la taille en modifiant l'en-tête (c'est une propriété dans l'en-tête)
Lorsqu'un objet est hors de portée de son destructeur est appelé.
Oui je l'ai fait fermer le flux de données
Bien dans certains langages de programmation, vous devez fermer le flux de données, et je n'aurais pas compter sur de telles méthodes. Car vous ne savez pas quand le destructeur sera appelé, il peut prendre des heures. Et la tenue d'un fichier ouvert n'est pas une bonne idée car cela peut provoquer des conflits avec d'autres programmes ou à cause de l'OS de tuer le programme quand vous avez trop de fichiers ouverts. 😀
La question est étiqueté
Lorsqu'un objet est hors de portée de son destructeur est appelé.
ofstream
s destructeur appelle close
. Donc oui, le cours d'eau est fermé.Oui je l'ai fait fermer le flux de données
Bien dans certains langages de programmation, vous devez fermer le flux de données, et je n'aurais pas compter sur de telles méthodes. Car vous ne savez pas quand le destructeur sera appelé, il peut prendre des heures. Et la tenue d'un fichier ouvert n'est pas une bonne idée car cela peut provoquer des conflits avec d'autres programmes ou à cause de l'OS de tuer le programme quand vous avez trop de fichiers ouverts. 😀
La question est étiqueté
c++
; votre référence à "certains langages de programmation" est surprenant. Dans le code ci-dessus vous ne voir quand le destructeur s'exécute. ofs
est localement étendue; la durée de vie est facile à deviner. Comme pour le "trop de fichiers ouverts" argument: avoir un vrai OS.OriginalL'auteur user2557642 | 2013-09-16
Vous devez vous connecter pour publier un commentaire.
Donné votre
writeHeader
est correctement mis en œuvre il est presque correct. Vous avez besoin de fixer 2 questions cependant:int
par canal de couleur. Ce doit être un octet à la place. Vous avez besoin de jeter les littéraux deunsigned char
.DWORD
-alignés. Après votre intérieur de la boucle sur lescol
vous avez besoin d'écrire des octets supplémentaires pour tenir compte de cela, à moins que la taille en octets de la ligne est un multiple de quatre.OriginalL'auteur IInspectable
Ce sont les deux fonctions que j'utilise pour mon code (un gris, l'un RVB économie d').
Pourrait vous donner un indice ce qui se passe mal.
Note: ils sont fait pour travailler, pas pour être efficace.
biSizeImage
ne pas prendre scanline rembourrage en compte. Pour les images RVB non compressé c'est le meilleur set à 0 de toute façon. Votre calcul debfOffBits
ne tient pas compte de l'alignement des exigences. Utilisationoffsetof(BITMAPINFO, bmiColors[256])
à la place. Vous dumping véritablement octets aléatoires, trop (empty
). Il y a plus de problèmes et qu'il montre une fois de plus: Ne pas rouler votre propre. Utiliser le Windows Imaging Component - c'est là pour une raison.OriginalL'auteur SinisterMJ
Vous avez besoin pour forcer la sortie à être écrite dans binaire format, pas de texte, c'est choisi lorsque vous ouvrez votre fichier/créer votre flux et à la sortie de toutes les valeurs des octets, et non pas des nombres entiers, cela peut être fait dans un certain nombre de façons, éventuellement, le plus simple étant d'écrire
chr(0)
ouchr(255)
- vous aussi vous avez besoin pour démarrer votre fichier avec un en - tête de section il y a un certain nombre de formules qui font de ce trop long d'entrer dans dans la réponse ici - certains d'entre eux sont en baisse de préférence d'autant que rien. Il y a un bon résumé dans Wikipédia.Fondamentalement, vous devez en informer la réception des demandes quel format que vous utilisez, le nombre de lignes, de colonnes et de la façon dont les couleurs sont stockées.
OriginalL'auteur Steve Barnes