Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [GDI+] - Salvare oggetto di tipo Graphics
Forum - C/C++ - [GDI+] - Salvare oggetto di tipo Graphics

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
inthehouse (Normal User)
Newbie


Messaggi: 10
Iscritto: 27/09/2009

Segnala al moderatore
Postato alle 9:11
Domenica, 27/09/2009
Ciao ragazzi... tutto bene?

Forse mi potete aiutare,
ho una piccola applicazione che mi crea un oggetto di tipo Graphics acquisendo l'handle al device context dello schermo, Graphics obj(hdc). (HDC acquisto con BeginPaint).
Purtoppo non riesco a capire come fare a salvare il mio oggetto in un file .png...

Mi sapere aiutare??

Grazie mille...

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 9:37
Domenica, 27/09/2009
Parti da questo

http://msdn.microsoft.com/en-us/library/ms533843(VS.85).aspx

e poi utilizza la Save dell'oggetto bitmap con clsid trovato per il formato PNG.


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
inthehouse (Normal User)
Newbie


Messaggi: 10
Iscritto: 27/09/2009

Segnala al moderatore
Postato alle 9:42
Domenica, 27/09/2009
Già provato... ma non mi salva nulla

Bitmap *b = new (w,h,&g)
b->save(L"c:\\tmp.png", &pngclsid, NULL)

questo lo faccio in un metodo della mia classe che è chiamato dal messaggio WM_PAINT.
GDI+ è inizializzata nel file principale...

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 9:44
Domenica, 27/09/2009
Ma scusa ... e il CLSID in pngclsid quando lo ottieni?


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
inthehouse (Normal User)
Newbie


Messaggi: 10
Iscritto: 27/09/2009

Segnala al moderatore
Postato alle 9:50
Domenica, 27/09/2009
ho dimenticato a scrivere l'istruzione, lo ottengo con GetEncoderClsid(L"image/png", &pngid);

posto il codice completo:

Codice sorgente - presumibilmente C/C++

  1. //inizializzo il contesto grafico
  2.         Graphics g(hdc);
  3.         Bitmap *bmp = new Bitmap(rt.top-rt.bottom,rt.right-rt.left, g);
  4.  
  5.         //Qui disegno
  6.  
  7.         CLSID pngid;
  8.         GetEncoderClsid(L"image/png", &pngid);
  9.         bmp->Save(L"c:\\temporanea.png",&pngid,NULL);


PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 9:53
Domenica, 27/09/2009
Hai controllato, con il debug, eseguendo linea per linea, se il CLSID e' corretto?

Se vuoi, posta il progetto completo in modo da poterlo provare ...


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
inthehouse (Normal User)
Newbie


Messaggi: 10
Iscritto: 27/09/2009

Segnala al moderatore
Postato alle 9:57
Domenica, 27/09/2009
Si, il CLSID dovrebbe essere corretto, lo ottengo con la funzione che ho trovato sulle MSDN:

Codice sorgente - presumibilmente C#

  1. int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
  2. {
  3.    UINT  num = 0;          // number of image encoders
  4.    UINT  size = 0;         // size of the image encoder array in bytes
  5.  
  6.    ImageCodecInfo* pImageCodecInfo = NULL;
  7.  
  8.    GetImageEncodersSize(&num, &size);
  9.    if(size == 0)
  10.       return -1;  // Failure
  11.  
  12.    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
  13.    if(pImageCodecInfo == NULL)
  14.       return -1;  // Failure
  15.  
  16.    GetImageEncoders(num, size, pImageCodecInfo);
  17.  
  18.    for(UINT j = 0; j < num; ++j)
  19.    {
  20.       if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
  21.       {
  22.          *pClsid = pImageCodecInfo[j].Clsid;
  23.          free(pImageCodecInfo);
  24.          return j;  // Success
  25.       }    
  26.    }
  27.  
  28.    free(pImageCodecInfo);
  29.    return -1;  // Failure
  30. }



Il mio problema è disegnare su una finestra con un oggetto Graphics e poi salvare questa immagine

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 10:03
Domenica, 27/09/2009
Ma il file non viene creato o viene creato vuoto ... o cosa ?

Hai controllato cosa restituisce la chiamata a bmp->Save ?

Ripeto ... se puoi postare TUTTO il progetto, lo provo ... altrimenti non so cosa dirti ...



- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
inthehouse (Normal User)
Newbie


Messaggi: 10
Iscritto: 27/09/2009

Segnala al moderatore
Postato alle 10:09
Domenica, 27/09/2009
Il file non viene creato affatto, e al debug la bmp->save restituisce come LastStatus InvalidParameter mentre le operazioni di disegno effettuate su g, restituiscono come LastStatus un OK.

Postare tutto il progetto o solo i file sorgente della mia classe e del cpp principale?

Un altra cosa, io la GDIplus la inizializzo nel cpp principale, quello che gestisce i case dei messaggi. Non è che la devo inizializzare pure all'interno del mio metodo? Eppure posso disegnare sull'oggetto g

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo