Lesen einer Bilddatei in C/C++ [closed]

Lesezeit: 4 Minuten

Benutzer-Avatar
skyrulz

Ich muss eine Bilddatei in C/C++ lesen. Wäre sehr nett, wenn mir jemand den Code posten könnte.

Ich arbeite mit Graustufenbildern und die Bilder sind JPEG. Ich möchte die Bilder in ein 2D-Array einlesen, was meine Arbeit erleichtern wird.

  • Ist die Dokumentation für libjpeg (ijg.org) oder was für eine native API Sie nicht haben?

    – Grauschimmer

    16. Januar 2010 um 7:01 Uhr


  • Vergessen Sie nicht, eine richtige Antwort auf die drei Fragen auszuwählen, die Sie gestellt haben.

    – mwcz

    20. Januar 2010 um 14:33 Uhr

Benutzer-Avatar
Jaime Ivan Cervantes

Wenn Sie sich für einen minimalen Ansatz ohne libpng/libjpeg-Abhängigkeiten entscheiden, empfehle ich die Verwendung von stb_image und stb_image_writegefunden hier.

Es ist so einfach wie es nur geht, Sie müssen nur die Header-Dateien platzieren stb_image.h und stb_image_write.h in Ihrem Ordner.

Hier ist der Code, den Sie zum Lesen von Bildern benötigen:

#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;
}

Und hier ist der Code, um ein Bild zu schreiben:

#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;
}

Sie können ohne Flags oder Abhängigkeiten kompilieren:

g++ main.cpp

Andere leichte Alternativen sind:

  • Ich musste die math.h-Bibliothek einschließen und beim Kompilieren verknüpfen (stackoverflow.com/questions/8671366/…) oder ich würde einen undefinierten Verweis auf pow in der Bildbibliothek erhalten.

    – Ste_95

    8. Februar 2017 um 16:03 Uhr

  • Ich weiß, es ist nur ein Beispiel, aber können Sie erklären, was die magische Zahl 3 im Code bedeutet?

    – mattshu

    24. Januar 2018 um 4:56 Uhr

  • @mattshu es ist die Anzahl der Kanäle (rot, grün, blau), vielleicht sollte ich das in meinem Code klarstellen, ich werde eine Bearbeitung vornehmen.

    – Jaime Ivan Cervantes

    25. Januar 2018 um 2:41 Uhr

  • Wie würde ich so etwas OHNE seltsame Bibliotheken machen? Ich bin nicht der Autor der Frage, aber ich möchte wissen, wie das nur mit Standardbibliotheken wie stdio.h geht. Wie geht das eigentlich NUR mit stdio.h?

    Benutzer12211554

    16. Januar 2020 um 17:32 Uhr

  • STB-Entwickler sind nicht gut.

    – Dreipuls

    20. Oktober 2020 um 10:23 Uhr

Sie könnten Ihre eigene schreiben, indem Sie sich die ansehen JPEG-Format.

Versuchen Sie jedoch eine bereits vorhandene Bibliothek wie CImgoder Boosts GIL. Oder für reine JPEGs, libjpeg. Es gibt auch die CxImage Klasse auf CodeProject.

Hier ist ein große Liste.

  • Boost.GIL funktioniert nicht und wird nicht gewartet.

    – Tronik

    25. Januar 2010 um 15:59 Uhr

  • Da C erlaubt ist, halte ich libjpeg für die leichteste Lösung. CImg und GIL sind syntaktisch definitiv einfacher – erfordern aber auch libjpeg. Sie können die Daten ganz einfach aus einem CImg-Objekt in einen STL-Container oder ein Array kopieren.

    – Jiggunjer

    30. Juni 2015 um 15:24 Uhr

  • CImg verwendet auch eine LGPL-ähnliche Lizenz, die deutlich restriktiver ist als die BSD-ähnliche Lizenz von libjpeg.

    – TypIA

    7. Oktober 2016 um 15:38 Uhr

Kasse Intel Open CV-Bibliothek

Benutzer-Avatar
Laser

Schau dir diesen Thread an: Bilddatei lesen und schreiben.

Schauen Sie sich auch diese andere Frage bei Stackoverflow an.

Corona ist schön. Aus dem Tutorial:

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++;
}

Pixel wären ein eindimensionales Array, aber Sie könnten eine gegebene x- und y-Position einfach in eine Position in einem 1D-Array umwandeln. So etwas wie pos = (y * Breite) + x

Benutzer-Avatar
mwcz

Probieren Sie die aus CImg Bibliothek. Das Lernprogramm wird Ihnen helfen, sich vertraut zu machen. Sobald Sie ein CImg-Objekt haben, wird die Daten() -Funktion erhalten Sie Zugriff auf das 2D-Pixel-Puffer-Array.

Benutzer-Avatar
R. Samuel Klatschko

Probier das aus Magick++-API zu ImageMagick.

1371700cookie-checkLesen einer Bilddatei in C/C++ [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy