Newsgroup: it.comp.programmare.win32
Titolo: C++ e Bitmap

Salve a tutti,
scrivo per la prima volta in questo newsgruop perchč ho un "problemino" che
non riesco a risolvere...
Sto sviluppando un semplicissimo programma C++ che legge un file BMP a 24
bit non compresso, lo memorizza in una matrice di oggetti di tipo pixel (in
pratica 3 unsigned char, uno per il rosso, uno per il verde e l'altro per il
blu) e poi fa il negativo di tale immagine e lo salva su un altro file. E
fin qui tutto bene...
Il problema č che il programma si comporta in modo "anomalo": funziona
benissimo con BMP create da me direttamente da Paint (fa il negativo
correttamente), mentre se gli passo un'immagine diversa (presa dagli
appunti, ottenuta risalvando un'altra immagine, magari jpg, ecc...) non
funziona piů (fa solo poche righe di negativo e poi tutte il resto appare
monocromatico)... non riesco a capire! eppure l'header č corretto,
altrimenti non funzionerebbe neppure con le immagini da me create "a
mano"...
C'č qualcosa che non so?
Comunque debuggando qua e la credo che il problema sia nella lettura
dell'immagine (infatti quando si verifica il problema anche i valori nella
matrice sono monocromatici!)... provo a postare parte del codice di lettura,
magari c'č qualche errore...
byte č un unsigned char, inizio_dati_immagine un long int, come altezza e
lunghezza, temp č unsigned char
leggi.open (percorso);
leggi.seekg (inizio_dati_immagine, ios::beg);  //Porto il cursore all'inizio
dei bytes dell'immagine
//Riempio la matrice di Pixel AL CONTRARIO, perchč le BMP sono memorizzate
cosě su file!
for (int c = abs (altezza)-1; c >= 0; c--)
{
   for (int d = lunghezza-1; d >= 0; d--)
   {
    leggi>>byte;
    matrice_di_pixel [c] [d].set_blue (byte);
    leggi>>byte;
    matrice_di_pixel [c] [d].set_green (byte);
    leggi>>byte;
    matrice_di_pixel [c] [d].set_red (byte);
   }
//Salto i bytes a 0 fittizi che servono solo per rendere la riga un multiplo
di 4 bytes
   for (int zero = 0; zero < numero_di_zeri_tra_bytes_utili; zero++)
   {
    leggi>>temp;
   }
}
  leggi.close ();
Grazie a tutti
Ciao by Nanni!

 
Hai chiamato una variabile byte? Stai attento che "byte" potrebbe essere 
un tipo di dato. Anche a me è già successo di fare una cosa del genere, 
il compilatore lo compilava ma poi il programma faceva cose strane. 
Prova chiamarla byte_letto o cambiargli completamente il nome.
Ciao.

fin qui tutto bene...
Perche' non usi le GDI++ per aprire il file? Avrai molti meno
problemi di compatibilita' nei formati .bmp

 Ciao.
Grazie e ciao!

 problemi di compatibilita' nei formati .bmp
Perchè non le conosco :-( e poi, essendo la prima volta che mi avvicino
all'argomento, preferirei capirne il funzionamento "intimo" con lo scopo di
imparare :-)
Grazie peril consiglio... sicuramente farò ricerche anche sulle GDI++
Ciao!

Ho un'altra teoria: può essere che il programma incontra un pixel dal valore
"strano" e che ciò comprometta tutto il processo di acuisizione da li in
poi? Perchè ho fatto una prova:
Ho osservato il punto preciso in cui l'immagine iniziava ad essere
sbagliata, poi ho aperto paint, ed ho inserito quell'immagine in uno spazio
bianco molto più grosso, in modo che risultasse centrata. Ho lanciato il
programma e si è fermato nello stesso punto! solo che questa volta ha
elaborato correttamente una parte più grande di immagine (essendo l'immagine
stessa più grande grazie ala parte bianca). Allora mi sa proprio che
l'errore dipenda dal pixel specifico... può essere?

> acuisizione
scusate l'errore :-P

     leggi>>byte;
Dovresti aprire il file in formato binario, nel seguente modo:
leggi.open(percorso, std::ios::binary);
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

      
http://digilander.libero.it/carlmila
Grazie ancora
Ciao!