PDA

View Full Version : [C]convertire un immagine bmp in array


sado93
25-06-2010, 16:01
salve a tutti... vorrei sapere come fare per convertire un immagine bmp in un array per poi poter analizzare ogni singolo pixel... pensavo di utilizzare le funzioni presenti nella libreria stdio.h (fopen,fprintf....) però non so proprio come inizziare...
sono un principiante in c....

fero86
25-06-2010, 16:30
qui (http://msdn.microsoft.com/en-us/library/dd183391(v=VS.85).aspx) c'é la descrizione del formato, ma ci sono vie decisamente piu semplici della lettura manuale. puoi caricare l'immagine con LoadImage (http://msdn.microsoft.com/en-us/library/ms648045(v=VS.85).aspx), inserirla in un Memory DC (http://msdn.microsoft.com/en-us/library/dd145049(v=VS.85).aspx) con SelectObject (http://msdn.microsoft.com/en-us/library/dd162957(v=VS.85).aspx) e poi lavorare pixel per pixel con GetPixel (http://msdn.microsoft.com/en-us/library/dd144909(v=VS.85).aspx) e SetPixel (http://msdn.microsoft.com/en-us/library/dd145078(v=VS.85).aspx). se tieni all'efficienza peró é meglio leggere tutti i pixels in una volta con GetDIBits (http://msdn.microsoft.com/en-us/library/dd144879(v=VS.85).aspx), lavorarci sopra e risettarli tutti con SetDIBits (http://msdn.microsoft.com/en-us/library/dd162973(v=VS.85).aspx); o, meglio ancora, specificare LR_CREATEDIBSECTION a LoadImage, trovare l'HANDLE della sezione in cui é mappata l'immagine con GetObject (http://msdn.microsoft.com/en-us/library/dd144904(VS.85).aspx), e lavorare direttamente in memoria.

fero86
25-06-2010, 16:38
faccio un riassunto delle funzioni che devi usare.

per una soluzione semplice e versatile, ma inefficiente:
CreateCompatibleDC, LoadImage, SelectObject, GetPixel, SetPixel.

per una soluzione efficiente (ma piu complessa perché devi capire com'é fatto il layout dei pixel in memoria, che varia da un bitmap all'altro):
LoadImage con LR_CREATEDIBSECTION, GetObject facendoti restituire la struttura DIBSECTION (http://msdn.microsoft.com/en-us/library/dd183567(v=VS.85).aspx) e poi lavori direttamente in memoria.

sado93
25-06-2010, 21:19
sembra molto difficile...cosa volevi dire con come è fatto il layout dei pixel???

sado93
25-06-2010, 21:25
posso chiedere un esempio...per capire meglio le funzioni...

Khronos
25-06-2010, 23:09
sarebbe più facile chiedendoti cosa vuoi ottenere elaborando la tua bitmap.

sado93
27-06-2010, 11:11
Praticamente vorrei controllare di che colore è un determinato pixel in una posizione. Mi spiego meglio. Io vorrei immettere le coordinate di un pixel e dopo di che il programma mi dovrebbe restituire il colore di quel pixel. Solo che mi piaceva l'idea di usare solo la libreria stdio.h e quindi utilizzare le funzioni tipo fopen... che consentono di gestire i file. Solo che non so come ci si può spostare tra i vari byte nel file (tipo leggere il 3 byte nel file).

fero86
27-06-2010, 20:55
Praticamente vorrei controllare di che colore è un determinato pixel in una posizione. Mi spiego meglio. Io vorrei immettere le coordinate di un pixel e dopo di che il programma mi dovrebbe restituire il colore di quel pixel. allora usa la soluzione semplice (GetPixel), quella performante é inutile se devi leggere un solo pixel.



Solo che mi piaceva l'idea di usare solo la libreria stdio.h folle... :stordita:



Solo che non so come ci si può spostare tra i vari byte nel file (tipo leggere il 3 byte nel file). con fseek: http://www.linuxmanpages.com/man3/fseek.3.php

cionci
27-06-2010, 23:27
folle... :stordita:
Nemmeno tanto dai...
http://www.vbforums.com/showthread.php?t=261522

fero86
28-06-2010, 13:48
Nemmeno tanto dai...
http://www.vbforums.com/showthread.php?t=261522 si ma che senso ha che mi dichiara da zero tutte le strutture necessarie? a quel punto usa windows.h

cionci
28-06-2010, 14:51
si ma che senso ha che mi dichiara da zero tutte le strutture necessarie? a quel punto usa windows.h
Ha detto che non vuole usare librerie non standard...un senso mi sembra che ce l'abbia, magari lo prevede il testo dell'esercizio...

fero86
28-06-2010, 21:11
Ha detto che non vuole usare librerie non standard...un senso mi sembra che ce l'abbia, magari lo prevede il testo dell'esercizio... io ho avuto un'impressione un po' diversa: dal nick si evince che lui ha 17 anni, non credo che a 17 anni gli facciano fare esercizi simili :D
inoltre ha scritto che "pensava" di utilizzare solo funzioni di stdio.h, ha scritto che "gli piaceva l'idea di usare solo la libreria stdio.h"...
insomma, mi sembra molto di piu una cosa hobbystica :)
attendiamo conferme o smentite.

sado93
13-07-2010, 08:57
Scusate se rispondo appena adesso ma avevo dei problemi con la linea telefonica...
:D
Si si esatto ho 17 anni:D
non mi fanno fare sti esercizi. Era solo per un mio hobby, cioè mi serviva per un mio robottino che mi sto costruendo. Mi piaceva l'idea di usare solo la libreria stdio.h perchè voglio che il programma giri su tutti i SO e non mi piacciono le funzioni gia pronte, preferisco costruirmene una personalizzata...:D :D :D