inthehouse (Normal User)
Newbie
Messaggi: 10
Iscritto: 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...
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
|
|
inthehouse (Normal User)
Newbie
Messaggi: 10
Iscritto: 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...
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Ma scusa ... e il CLSID in pngclsid quando lo ottieni?
|
|
inthehouse (Normal User)
Newbie
Messaggi: 10
Iscritto: 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++ |
//inizializzo il contesto grafico
Graphics g(hdc);
Bitmap *bmp = new Bitmap(rt.top-rt.bottom,rt.right-rt.left, g);
//Qui disegno
CLSID pngid;
GetEncoderClsid(L"image/png", &pngid);
bmp->Save(L"c:\\temporanea.png",&pngid,NULL);
|
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/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 ...
|
|
inthehouse (Normal User)
Newbie
Messaggi: 10
Iscritto: 27/09/2009
|
Si, il CLSID dovrebbe essere corretto, lo ottengo con la funzione che ho trovato sulle MSDN:
Codice sorgente - presumibilmente C# |
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; // number of image encoders UINT size = 0; // size of the image encoder array in bytes ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size); if(size == 0) return -1; // Failure pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo == NULL) return -1; // Failure GetImageEncoders(num, size, pImageCodecInfo); for(UINT j = 0; j < num; ++j) { if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ) { *pClsid = pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; // Success } } free(pImageCodecInfo); return -1; // Failure }
|
Il mio problema è disegnare su una finestra con un oggetto Graphics e poi salvare questa immagine
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/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 ...
|
|
inthehouse (Normal User)
Newbie
Messaggi: 10
Iscritto: 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
|
|