View Full Version : [C]convertire un immagine bmp in array
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....
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.
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.
sembra molto difficile...cosa volevi dire con come è fatto il layout dei pixel???
posso chiedere un esempio...per capire meglio le funzioni...
sarebbe più facile chiedendoti cosa vuoi ottenere elaborando la tua bitmap.
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).
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
folle... :stordita:
Nemmeno tanto dai...
http://www.vbforums.com/showthread.php?t=261522
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
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...
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.
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.