web-dev-qa-db-fra.com

Lecture d'un fichier image en C / C ++

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.

21
skyrulz

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 .

14
GManNickG

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:

10

Découvrez Intel Open CV Library ...

3
Ashish

Vérifiez ce fil: lire et écrire le fichier image .

Jetez également un œil à cette autre question sur Stackoverflow .

3
Lazer

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

2
Firas Assaad

Essayez la bibliothèque CImg . Le tutoriel vous aidera à vous familiariser. Une fois que vous avez un objet CImg, la fonction data () vous donnera accès au tableau de tampons de pixels 2D.

1
mwcz

Découvrez Magick ++ API to ImageMagick .

1
R Samuel Klatchko