PDA

View Full Version : Lettura file BMP


russo30
18-12-2006, 21:15
ciao a tutti
devo fare un programma in ANSI C che legga il contenuto di un file bitmap a 8 bit e lo scriva su un altro file bitmap modificandone alcuni campi
Per leggere il file uso la funzione fread ma purtroppo quando provo a stampare ciò che viene letto nel file ( ad esempio cerco di stampare il campo offset dell'header del file) mi vengono stampati numeri strani tipo
-10854545 oppure 65990
qualcuno sa darmi una mano?
grazie

^TiGeRShArK^
18-12-2006, 21:45
ciao a tutti
devo fare un programma in ANSI C che legga il contenuto di un file bitmap a 8 bit e lo scriva su un altro file bitmap modificandone alcuni campi
Per leggere il file uso la funzione fread ma purtroppo quando provo a stampare ciò che viene letto nel file ( ad esempio cerco di stampare il campo offset dell'header del file) mi vengono stampati numeri strani tipo
-10854545 oppure 65990
qualcuno sa darmi una mano?
grazie
ehm...
dipende dal formato del BMP ke vuoi leggere....
Se è un BMP ad 8 bit (256 colori) ogni byte rappresenta il valore del colore della palette in quel punto....
ovviamente devi saltare un bel pò di byte all'inizio del file xkè se non sbaglio viene codificata la palette...
Se utilizzi BMP a 24 bit allora avrai 3 valori da 1BYTE x ogni colore..
se non erro è utilizzato lo standard BRG al posto del + comune RGB...infatti ricordo ke quando ai tempi avevo fatto un visualizzatore di BMP/TIFF/TGA mi uscivano tutti i colori sballati :asd:
cmq ti consiglio di leggere le specifike del formato BMP e di non andare a caso km ho fatto io ai tempi con un editor esadecimale :asd:
X quanto riguarda i numeri strani ke ti stampa immagino sia proprio l'errata interpretazione ke dai a quei byte in quanto immagino li stai leggendo come se fossero signed int anzikè interpretarli byte x byte :p

russo30
18-12-2006, 23:09
il formato di una immagine bitmap a 8 bit è:
1) File header (14 byte)
2) Information header (40 byte)
3) palette (1024 byte)
4) image data ( altezza * larghezza in byte )


poi il file header ha diversi campi
1) bitmap file type (2 byte): due caratteri (“B” e “M”) di 1 byte ciascuno
2) bitmap file size (4 byte): valore che contiene la lunghezza del file
bitmap in byte
ecc

allora io ho usato la fread nel seguente modo:

typedef struct
{
// ho messo solo questo campo per l'esempio
unsigned int LunghezzaFile;

} BMPHeader;

int main(void)
{
unsigned int *LunghezzaFile;
unsigned int *Altezza;
BMPHeader *b_header;
FILE *fp;
if ((fp = fopen("lago.bmp","rb")) == NULL)
printf("errore");
char B = getc(fp);
char M = getc(fp);
fread(&b_header, sizeof(unsigned int), 1 , fp);
printf("%d \n ", &b_header->LunghezzaFile);
fclose(fp);
return (0);
}


dovrebbe stamparmi la lunghezza del file ma invece mi stampa 65990 che nn credo sia la lunghezza del file in byte

^TiGeRShArK^
18-12-2006, 23:45
come puoi vedere dall'allegato a me convertendo dall'offset 2h all'offset 5h in int (kiamato long int dall'editor hex) mi restituisce correttamente 65978 ke è la dimensione del file bolle di sapone.bmp ke puoi trovare sotto la cartella windows :p
Ora è da vari anni ke nn leggo file col c... (circa da quando ho scritto il visualizzatore di cui sopra :asd: ) qdi... a scanso di equivoci..
guardati 'sta paginetta ke mi sa ke fa al caso tuo :D
http://local.wasp.uwa.edu.au/~pbourke/dataformats/bmp/

io ora mi sa ke stakko ;)

cionci
18-12-2006, 23:53
BMPHeader b_header;
FILE *fp;
if ((fp = fopen("lago.bmp","rb")) == NULL)
printf("errore");
char B = getc(fp);
char M = getc(fp);
fread(&b_header, sizeof(BMPHeader), 1 , fp);
printf("%d \n ", b_header.LunghezzaFile);

Hai un po' confusione fra puntatori e &...

^TiGeRShArK^
18-12-2006, 23:56
Hai un po' confusione fra puntatori e &...
:rotfl:
appunto uno dei vari motivi x cui mi sta un pò sulle bolls il C :asd:
figurati se me ne accorgevo io a quest'ora arrugginito come sono :asd:
almeno in java esiste solo il passaggio x copia del riferimento ke mi semplifica notevolmente la vita :asd:
e dopo questa vi saluto davvero :O
AUGH! :O
:asd:

recoil
19-12-2006, 01:06
secondo voi per quale motivo i BMP sono memorizzati alla rovescia? per la miseria... :rolleyes: non so se quelli OS/2 sono come quelli di Windows, ma è una cosa che concettualmente trovo fastidiosa...

comunque se cerchi "BMP header" con google il primo o secondo risultato ha già la descrizione dettagliata dei campi e della loro dimensione. scrivere un programma che lo legga è semplicissimo, manipolare l'immagine e convertirla un po' meno, meglio se non ci penso :help:

71104
19-12-2006, 09:54
comunque se cerchi "BMP header" con google il primo o secondo risultato ha già la descrizione dettagliata dei campi e della loro dimensione. vorrei tanto sapere perché la gente va a cercare documentazione scrausa e non ufficiale quando esiste quella completa e ufficiale... :mbe:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_4v1h.asp?frame=true

71104
19-12-2006, 09:56
qualcuno sa darmi una mano? caricalo con LoadImage, così già un problema l'hai fatto fuori. per convertirlo usa le funzioni della GDI, inutile che lo fai a mano. se aspetti un attimo ti cerco qualche funzione che ti può essere utile...

71104
19-12-2006, 09:59
se aspetti un attimo ti cerco qualche funzione che ti può essere utile... eccoci qua:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_0fzo.asp?frame=true
If the color formats of the source and destination device contexts do not match, the BitBlt function converts the source color format to match the destination format.
non hai che da creare un Memory Device Context col formato in cui vuoi convertire quel bitmap, disegnarcelo con BitBlt, e salvarlo su file.

71104
19-12-2006, 10:02
dovrebbe stamparmi la lunghezza del file ma invece mi stampa 65990 che nn credo sia la lunghezza del file in byte ma controllare no eh...? :D

russo30
19-12-2006, 10:25
ok grazie dell'aiuto ora provo a lavorare con il materiale che mi avete dato

cionci
19-12-2006, 10:32
caricalo con LoadImage, così già un problema l'hai fatto fuori. per convertirlo usa le funzioni della GDI, inutile che lo fai a mano. se aspetti un attimo ti cerco qualche funzione che ti può essere utile...
C'e' scritto sopra che deve usare ANSI C :)

71104
19-12-2006, 10:47
C'e' scritto sopra che deve usare ANSI C :) giusto, quindi deve linkare gdi32.lib dalla command line del linker e non con #pragma comment :asd: :D :D :D

cionci
19-12-2006, 10:57
giusto, quindi deve linkare gdi32.lib dalla command line del linker e non con #pragma comment :asd: :D :D :D
Penso nel senso che sia obbligato ad usare la libreria standard....

recoil
19-12-2006, 12:08
vorrei tanto sapere perché la gente va a cercare documentazione scrausa e non ufficiale quando esiste quella completa e ufficiale... :mbe:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_4v1h.asp?frame=true

sono allergico al sito Micro$oft :asd:

71104
19-12-2006, 12:10
sono allergico al sito Micro$oft :asd: si, e dopodiché i programmi fanno cagare :huh:

71104
19-12-2006, 12:11
Penso nel senso che sia obbligato ad usare la libreria standard.... cioè non ci credo, mi hai preso sul serio!! :D

recoil
19-12-2006, 12:17
si, e dopodiché i programmi fanno cagare :huh:

no perché?
dopotutto a me serve l'header, c'è un sito con una tabellina e tanto basta.
la documentazione M$ a onor del vero è scritta bene e quando programmi per windows la usi e sei pure felice perché c'è tutto!
io sviluppo in linux, tra l'altro ho abbandonato il BMP per passare al PNM ma non per odio verso la Microsoft, proprio per quella rappresentazione rovesciata del bitmap che rende scomodo lavorarci.
come se non bastasse di default le immagini BMP bianco e nero hanno bit 1 per il bianco e 0 per il nero, altra cosa che concettualmente mi fa arrabbiare :p

71104
19-12-2006, 14:36
OT: ma che cazzo succede, alcune parole sono sottolineate due volte e mostrano della pubblicità merdosa... :huh: :huh:
ma che avete combinato :Puke:

cionci
19-12-2006, 14:54
ma che avete combinato :Puke:
Lo chiedi a me ? Io non c'entro niente con lo staff del sito :D

71104
19-12-2006, 16:21
sono veementemente contrariato a questa discutibile iniziativa :|

mi sa di TCPA :|

se lo lasciate così com'è sto sito per quanto mi riguarda è diventato... be'... un escremento fumante :|

71104
19-12-2006, 16:28
no perché?
dopotutto a me serve l'header, c'è un sito con una tabellina e tanto basta. la tabellina potrebbe non dirti i tipi dei campi (molte dicono solo la dimensione)

io sviluppo in linux, tra l'altro ho abbandonato il BMP per passare al PNM ma non per odio verso la Microsoft, proprio per quella rappresentazione rovesciata del bitmap che rende scomodo lavorarci. nella mia esperienza ne ho trovati anche di "messi al diritto". tutto sommato non è troppo strano collocare l'origine degli assi in basso a sinistra anziché in alto (in geometria analitica l'asse delle ordinate è rivolto sempre verso l'alto); il problema è che lo fa(ceva) solo Microsoft. talvolta comunque può ancora risultare comodo (vedi OpenGL).

come se non bastasse di default le immagini BMP bianco e nero hanno bit 1 per il bianco e 0 per il nero, altra cosa che concettualmente mi fa arrabbiare :p è perfettamente normale: nel modello RGB una tripla (0, 0, 0) esprime il nero, non il bianco.

recoil
19-12-2006, 17:17
è perfettamente normale: nel modello RGB una tripla (0, 0, 0) esprime il nero, non il bianco.

vero, ma nel caso del solo bianco e nero lo trovo scomodo. più che altro perché è più veloce mettere tutto a zero e settare a 1 i (pochi) bit neri rispetto al contrario, questo per il tipo di immagini che gestisco io
insomma, mi stava un pochino sulle palle sto BMP :D

in realtà non mi esalta più di tanto nemmeno PNM, ma ormai mi sono deciso a usare quello e la smetto.
preferisco il formato TIFF per certi versi, almeno c'è un involucro che garantisce una certa flessibilità :)

71104
19-12-2006, 18:21
vero, ma nel caso del solo bianco e nero lo trovo scomodo. più che altro perché è più veloce mettere tutto a zero e settare a 1 i (pochi) bit neri rispetto al contrario, questo per il tipo di immagini che gestisco io
insomma, mi stava un pochino sulle palle sto BMP :D in informatica le religioni e gli odi tecnicamente immotivati sono la matrice dei programmatori mediocri :Prrr:

il programmatore con le palle quadrate non è quello che si incula i mangiatori di quiche, è quello a cui le idiosincrasie fanno un pippone :O :O :O :Prrr: