lire la valeur du pixel dans un fichier bmp
Comment lire la valeur de couleur de 24 bits des images BMP à tous les pixels [h*w] en C ou C++ sur Windows [mieux sans un 3ème partie de la bibliothèque]. J'ai eu Dev-C++
Un code de travail sera vraiment apprécié que je n'ai jamais travaillé sur la lecture de l'Image & viennent AINSI de après Googler [si vous pouvez google mieux que moi, plz fournir un lien].
<1 seconde de recherche sur google avec "format de fichier bmp": en.wikipedia.org/wiki/BMP_file_format
OriginalL'auteur Sourav | 2012-02-15
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer celui-ci:
Maintenant
data
doit contenir le (R, G, B) les valeurs des pixels. La couleur du pixel (i, j) est stocké àdata[3 * (i * width + j)]
,data[3 * (i * width + j) + 1]
etdata[3 * (i * width + j) + 2]
.Dans la dernière partie, le swap entre chaque premier et troisième pixels est fait parce que windows stocke les valeurs de couleur (B, G, R) triples, pas de (R, G, B).
int row_padded = (width*3 + 3) & (~3)
Vous ensuitefread()
une ligne derow_padded
octets, mais uniquement de la largeur des éléments. Le reste est jeté...Veuillez noter que la fonction ci-dessus a quelques lacunes, dans les attributions de la largeur et de la hauteur de l'image: 1. il suppose little-endian. Il ne fonctionnera pas pour big endian la plate-forme 2. Il suppose que sizeof(int) est de 4. Il ne fonctionnera pas si elle ne l'est pas.
OriginalL'auteur 0605002
Code de readBMP fonction après remplissage correctif:
il retourne
data
. L'appelant doitdelete
ladata
quand il/elle est fait avec elle.Peut-être tort, mais je crois que ce code a une faute de frappe. La quantité de mémoire nécessaire est de 3 * largeur * hauteur, pas row_padded. row_padded est nécessaire que pour la lecture du fichier.
mais il est de la lecture du fichier, de sorte que le remplissage est ok? Donc, si votre image a 121 pixels dans une ligne, préparez-vous à lire 124 et jeter le dernier 3--si j'ai bien compris.
Ce qui est faux. Vous n'avez pas de retour de l'intégralité des données.
OriginalL'auteur Krzysztof Kachniarz
Ici est une version C++ de la réponse:
OriginalL'auteur didil
Je ne peux pas commenter sur le haut niveau de réponse parce que je n'ai pas assez de stackoverflow rep, mais je voulais juste faire remarquer un point très critique d'un bug avec la mise en œuvre.
Certaines images peuvent être écrit avec un négatif de la hauteur, de sorte que lorsque vous essayez de répartir votre image de la mémoire de données, votre code crash avec
std::bad_alloc
. Images avec des négatifs hauteur signifie que les données d'image sont stockées haut vers le bas au lieu du haut vers le bas. Par conséquent, un peu plus de la version de l'haut niveau de réponse est (toujours pas compris la portabilité pour les systèmes avec différents boutisme et la taille d'octets):OriginalL'auteur Owen Morgan
J'ai créé une classe BitMap qui fonctionne pour les fichiers bmp qui ont 24 bits par pixel. Si le bmp n'est pas compatible, vous devriez obtenir une erreur pertinentes.
Il suit presque exactement avec la Article de Wikipedia. (Le seul problème est qu'il ne fonctionne pas avec des fichiers qui ont un pixel de la matrice de décalage est supérieur à 255. Ce qui est noté dans le code et doit être facilement réparable.)
J'ai été en utilisant ce avec bmp fichiers créés par mspaint.
Voici un exemple d'utilisation
example.cpp
example_vector contient maintenant le rvb (dans cet ordre) les valeurs du pixel de coordonnées (1,1) indexé à partir du haut de l'image, en allant vers le bas. Les Indices commencent à 0. Voir Wikipedia exemples.
Voici le fichier d'en-tête:
qu'est-ce que les valeurs correctes et que faites-vous. Je me souviens en utilisant ce assez largement, mais il est possible que cette version a une erreur
Ok, vous avez raison. J'ai été en utilisant uniquement ce pour de petits objets (sprites) et donc, la question n'est jamais venu. Je vais le corriger.
de l'essayer. Il doit être fixé.
La hauteur et la largeur (et les pixels de la matrice de décalage) de 4 octets réservés pour eux. J'ai été en utilisant uniquement un octet à l'origine. Vous voyez les changements pertinents en vertu de la
THE FOLLOWING LINE ONLY WORKS IF THE OFFSET IS 1 BYTE!!!!
section dans le courant de la version précédente.OriginalL'auteur Liam
Vous avez qu'à lire l'en-tête bitmap en premier. Après avoir obtenu de l'offset des données que vous trouverez dans le bitmap en-têtes et de lire les pixels de la ligne par ligne, de rendre les soins de santé au sujet de la marge dans le format de fichier bmp.
prendre un coup d'oeil sur le site msdn
http://msdn.microsoft.com/en-us/library/aa452883.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/dd318229(v=vs. 85).aspx
OriginalL'auteur AlexTheo
Simple, OS-portable Python solution est fournie dans Comment puis-je lire la valeur RVB d'un pixel donné en Python?. S'adapte à de multiples formats d'image, prend soin de rembourrage et ainsi de suite.
OriginalL'auteur Chris Johnson
J'ai essayé les codes ci-dessus par didil et j'ai cité ci-dessous comme référence (désolé, et je n'ai pas assez de réputation pour faire un commentaire).
Le code se compile bien, mais se bloque au cours de la boucle d'itération. Je pense que cela a quelque chose à faire avec des " je " étant un uint32_t, au lieu de int. Quand 'je' arrive à zéro, la boucle est toujours valide et le " je " devient décrémenté par 3 qui devient une valeur négative. Depuis le 'je' est un uint32_t, sa valeur devient une valeur positive et supérieure à 0. En tant que tel, la boucle ne se termine jamais et provoque l'exécution de planter quand 'je' points au-delà de la limite de l'img de stockage.
OriginalL'auteur Habibie