2009-12-16 14 views
10

Come aprire e leggere i pixel di un'immagine in C++? Leggili sotto forma di X, Y e per conoscere il colore.Lettura di pixel dell'immagine in C++

+1

Qualsiasi particolare formato di immagine? Diversi formati hanno diverse librerie. –

+1

Quale formato è l'immagine? BMP? PNG? JPEG? –

+0

Probabilmente JPG o BMP. Sarà estratto da openGL quindi non sono ancora sicuro. Importa? Se sì, quale è meglio? –

risposta

3

Se avete intenzione di lavorare con le immagini si dovrebbe guardare nella libreria OpenCV, ha praticamente tutto hai bisogno di lavorare con le immagini.

OpenCV 2.0 è uscito un paio di mesi fa ed è molto amichevole con C++.

+4

OpenCV è eccessivo per la sola lettura delle immagini. –

+0

Sì, è una grande libreria, la sto solo ponendo come opzione se vuole fare altre cose oltre a leggere/scrivere sarebbe bello averne familiarità. – rem7

5

Utilizzare una libreria come DevIL (http://openil.sourceforge.net/). DevIL caricherà i dati dell'immagine in una matrice e potrai accedere ai dati grezzi dei pixel usando una funzione come ilGetPixels() o così.

DevIL ha anche il supporto OpenGL.

+0

s/ilGetPixels()/ilGetData() –

2

I BMP sono incredibilmente semplici. I BMP non compressi sono costituiti da un'intestazione, alcune informazioni sul BMP, la tavolozza dei colori (se applicabile) e quindi i dati bitmap, pixel per pixel. Scrivere il tuo parser bitmap è un esercizio divertente, anche se c'è un sacco di lavoro extra che gestisce tutte le funzionalità (compressione a 8 bit, RLE, ecc.).

La soluzione migliore è utilizzare una libreria. Image Magick ha una libreria C che ti permetterà di aprire praticamente qualsiasi formato di immagine e accedere ai pixel. SDL_image è un'altra libreria che è molto facile da usare e SDL può essere facilmente utilizzato con OpenGL.

Quale formato di immagine è necessario utilizzare dipenderà dall'applicazione. I JPG hanno una compressione piuttosto buona, ma la compressione è LOSSY, il che significa che si perdono i dettagli. Se l'immagine ha un testo, o ha ampie aree di colori o bordi solidi (come un fumetto) questo è male, otterrai artefatti evidenti. Per le foto, i JPG sono generalmente soddisfacenti. I PNG sono una bella alternativa, sono compressi ma la compressione è LOSSLESS. I JPG saranno generalmente più piccoli dei PNG, entrambi saranno più piccoli dei BMP.

4

O si utilizza una libreria esistente o si scrive il proprio codice. In genere, il primo approccio è migliore poiché un formato di file di immagine è spesso più complesso di quanto sembri in superficie e, se non si presta attenzione, si può finire con immagini capovolte o con componenti di colore non corretti.

A seconda delle esigenze, potrebbe essere necessario prendere in considerazione anche le capacità del formato. Se il supporto per l'alta gamma dinamica è interessante, OpenEXR è un'ottima scelta, se non lo è probabilmente è solo scomodo in quanto non ha un grande supporto tra altri programmi come ad esempio PNG.

Qui ci sono due librerie spesso mi rivolgo a quando hanno bisogno di leggere e scrivere le immagini: libpng, OpenExr

+0

Usiamo libpng per la generazione di immagini, è davvero facile da usare e puro codice C++ quindi non c'è bisogno di occuparsi di un'interfaccia crappy. –

+1

@ Matthieu M .: libpng non è certamente scritto in "puro C++". È scritto in C89, come afferma nella pagina collegata a Laserallan. – unwind

5

Leggendo il colore di un pixel da un file immagine utilizzando il Magick++ biblioteca

#include <Magick++.h> 
#include <iostream> 

using namespace Magick; 
using namespace std; 

int main(int argc, char **argv) { 
try { 
    InitializeMagick(*argv); 
    Image img("C:/test.bmp"); 
    ColorRGB rgb(img.pixelColor(0, 0)); // ie. pixel at pos x=0, y=0 
    cout << "red: " << rgb.red(); 
    cout << ", green: " << rgb.green(); 
    cout << ", blue: " << rgb.blue() << endl; 
} 
    catch (Magick::Exception & error) { 
    cerr << "Caught Magick++ exception: " << error.what() << endl; 
} 
return 0; 
}