2011-01-01 62 views
7

Si supponga di voler leggere un file di immagine in un formato di file comune dal disco rigido, cambiare il colore di un pixel e visualizzare l'immagine risultante sullo schermo, in C++.Il modo più semplice per disegnare un'immagine?

Quali librerie (open-source) suggeriresti di eseguire quanto sopra con la quantità minima di codice?

In alternativa, quali librerie farebbero quanto sopra nel modo più elegante possibile?

Un po 'di background: Recentemente ho letto molta letteratura di computer grafica e ci sono molti algoritmi basati su pixel relativamente semplici che vorrei implementare. Tuttavia, sebbene l'algoritmo stesso di solito sia semplice da implementare, la quantità necessaria di frame-work per manipolare un'immagine su una base per pixel e visualizzare il risultato mi ha impedito di farlo.

+1

La visualizzazione da sola è un sacco di codice e anche di sistema. Stai già usando una libreria GUI? Che piattaforma stai usando? –

+0

Martin: non c'è ancora il codice sorgente. (In realtà c'è, ma abbastanza piccolo da non esitare a ricominciare da zero) – Benno

+3

È l'eterna domanda C++. Backup con 5 upvotes già. Dopo oltre 20 anni di interfacce utente grafiche mainstream, il problema principale di mostrare un'immagine continua a galla il flautista dei praticanti della lingua. Non bene. –

risposta

10

La libreria CImg è facile da usare.

CImg<unsigned char> img("lena.png");    // Read in the image lena.png 
const unsigned char valR = img(10,10,0,0);  // Read the red component at coordinates (10,10) 
const unsigned char valG = img(10,10,0,1);  // Read the green component at coordinates (10,10) 
const unsigned char valB = img(10,10,2);   // Read the blue component at coordinates (10,10) (Z-coordinate omitted here). 
const unsigned char avg = (valR + valG + valB)/3; // Compute average pixel value. 
img(10,10,0) = img(10,10,1) = img(10,10,2) = avg; // Replace the pixel (10,10) by the average grey value. 
CImgDisplay main_disp(img, "Modified Lena");  // Display the modified image on the screen 
img.save("lena_mod.png");       // Save the modified image to lena_mod.png 

Può anche essere utilizzato come una libreria di elaborazione di immagini piuttosto potente. Vedi gli esempi here.

+0

Per un programma più semplice ("la quantità minima di codice" era la richiesta), non visualizzare l'immagine, solo emettere l'immagine modificata e utilizzare un programma di visualizzazione di immagini separato. – Raedwald

+0

@Raedwald "e visualizzare l'immagine risultante sullo schermo" <- che mi dà l'impressione OP vuole lanciare un visualizzatore di immagini dal programma. È una sola linea, quindi non c'è bisogno di preoccuparsi di IMHO. – marcog

+0

Bello! Se non sbaglio, dipende da LibPNG e LibJPEG? – Viet

4

Si dovrebbe esaminare la libreria OpenCV, soprattutto se si sta facendo una ricerca teorica sulla computer grafica.

+0

Un'alternativa più lussuosa è la libreria Intel Performance Primitives :) – 9dan

+0

+1 la mia scelta, se vuoi più di un pixel .... @ 9dan per qualche ragione, ho pensato che OpenCV sia partito dalle librerie Intel ... ho sbagliato su questo ? – kenny

0

Se l'applicazione di destinazione è solo per Windows, è possibile utilizzare GDI +, descritto here e here. E here è una delle molte dimostrazioni di concetto per la manipolazione di immagini tramite GDI +.

EDIT: la libreria non è open source, inclusa nel sistema operativo da Windows XP (può essere installata su 98 e 2000), l'API è disponibile pubblicamente e offre molte funzioni di elaborazione delle immagini che potrebbero essere utilizzate in modo più complicato algoritmi.

0

+1 per CImg, è stato progettato per questo scopo: implementare algoritmi di elaborazione delle immagini molto velocemente e facilmente, in un framework multi-piattaforma.

Problemi correlati