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.
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.
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_write
gefunden 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 …
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
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.
R. Samuel Klatschko
Probier das aus Magick++-API zu ImageMagick.
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