J'ai besoin de lire un fichier image en C/C++. Ce serait très bien, si quelqu'un peut poster le code pour moi.
Je travaille sur des images en niveaux de gris et les images sont JPEG. Je voudrais lire les images dans un tableau 2D qui facilitera mon travail.
Vous pouvez écrire le vôtre en consultant le format JPEG .
Cela dit, essayez une bibliothèque préexistante comme CImg , ou Boost's GIL . Ou pour strictement JPEG, libjpeg . Il existe également la classe CxImage sur CodeProject.
Voici un grande liste .
Si vous décidez d'opter pour une approche minimale, sans dépendances libpng/libjpeg, je vous suggère d'utiliser stb_image
et stb_image_write
, trouvé ici .
C'est aussi simple que possible, il vous suffit de placer les fichiers d'en-tête stb_image.h
et stb_image_write.h
dans votre dossier.
Voici le code dont vous avez besoin pour lire les images:
#include <stdint.h>
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
int main() {
int width, height, bpp;
uint8_t* rgb_image = stbi_load("image.png", &width, &height, &bpp, 3);
stbi_image_free(rgb_image);
return 0;
}
Et voici le code pour écrire une image:
#include <stdint.h>
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
#define CHANNEL_NUM 3
int main() {
int width = 800;
int height = 800;
uint8_t* rgb_image;
rgb_image = malloc(width*height*CHANNEL_NUM);
// Write your code to populate rgb_image here
stbi_write_png("image.png", width, height, CHANNEL_NUM, rgb_image, width*CHANNEL_NUM);
return 0;
}
Vous pouvez compiler sans indicateurs ni dépendances:
g++ main.cpp
D'autres alternatives légères incluent:
Découvrez Intel Open CV Library ...
Vérifiez ce fil: lire et écrire le fichier image .
Jetez également un œil à cette autre question sur Stackoverflow .
corona est sympa. Du tutoriel:
corona::Image* image = corona::OpenImage("img.jpg", corona::PF_R8G8B8A8);
if (!image) {
// error!
}
int width = image->getWidth();
int height = image->getHeight();
void* pixels = image->getPixels();
// we're guaranteed that the first eight bits of every pixel is red,
// the next eight bits is green, and so on...
typedef unsigned char byte;
byte* p = (byte*)pixels;
for (int i = 0; i < width * height; ++i) {
byte red = *p++;
byte green = *p++;
byte blue = *p++;
byte alpha = *p++;
}
les pixels seraient un tableau unidimensionnel, mais vous pourriez facilement convertir une position x et y donnée en une position dans un tableau 1D. Quelque chose comme pos = (y * largeur) + x
Découvrez Magick ++ API to ImageMagick .