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++ - Immagine invertita, come mai?
Forum - C/C++ - Immagine invertita, come mai?

Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 21:32
Domenica, 18/04/2010
Salve a tutti. Qualcuno sa perchè date le seguente funzioni

Codice sorgente - presumibilmente C#

  1. BITMAPINFO getBitmapInfo(HBITMAP srcBmp) {
  2.         BITMAPINFO srcBmpInfo;
  3.         ZeroMemory(&srcBmpInfo,sizeof(BITMAPINFO));
  4.         srcBmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  5.         HDC srcHdc = CreateCompatibleDC(NULL);
  6.         GetDIBits(srcHdc,srcBmp,0,0,NULL,&srcBmpInfo,DIB_RGB_COLORS);
  7.         ReleaseDC(NULL, srcHdc);
  8.         DeleteDC(srcHdc);
  9.         return srcBmpInfo;
  10. }
  11.  
  12.  
  13. BYTE* convertBitmapToByteArray(HBITMAP hBitmap) {
  14.     BITMAPINFO bmpInfo = getBitmapInfo(hBitmap);
  15.     HDC hdc = CreateCompatibleDC(NULL);
  16.  
  17.     int size = ( (bmpInfo.bmiHeader.biBitCount / 8) * bmpInfo.bmiHeader.biWidth * bmpInfo.bmiHeader.biHeight);
  18.     BYTE* pBuf = (BYTE*)malloc(size);
  19.     bmpInfo.bmiHeader.biCompression = BI_RGB;
  20.         GetDIBits(hdc,hBitmap,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);
  21.  
  22.         if(hdc) {
  23.         ReleaseDC(NULL,hdc);
  24.         DeleteDC(hdc);
  25.     }
  26.     return pBuf;
  27. }
  28.  
  29.  
  30. void saveBitmap(char *szFilename,HBITMAP hBitmap) {
  31.     FILE* fp = NULL;
  32.     LPVOID pBuf = NULL;
  33.     BITMAPINFO bmpInfo = getBitmapInfo(hBitmap);
  34.     BITMAPFILEHEADER bmpFileHeader;
  35.     HDC hdc = CreateCompatibleDC(NULL);
  36.         if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage)) == NULL) {
  37.                 printf("Unable to Allocate Bitmap Memory\n");
  38.         } else {
  39.                 bmpInfo.bmiHeader.biCompression = BI_RGB;
  40.                 GetDIBits(hdc,hBitmap,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);
  41.                 if((fp = fopen(szFilename,"wb")) == NULL){
  42.                         printf("Unable to Create Bitmap File\n");
  43.                 } else {
  44.                         bmpFileHeader.bfReserved1 = 0;
  45.                         bmpFileHeader.bfReserved2 = 0;
  46.                         bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bmpInfo.bmiHeader.biSizeImage;
  47.                         bmpFileHeader.bfType = 19778; //Equivale a scrivere bmpFileHeader.bfType='MB';
  48.                         bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  49.                         fwrite(&bmpFileHeader, sizeof(BITMAPFILEHEADER), 1, fp);
  50.                         fwrite(&bmpInfo.bmiHeader, sizeof(BITMAPINFOHEADER), 1, fp);
  51.                         fwrite(pBuf, bmpInfo.bmiHeader.biSizeImage, 1, fp);
  52.                 }
  53.         }
  54.     if(hdc) {
  55.         ReleaseDC(NULL,hdc);
  56.         DeleteDC(hdc);
  57.     }
  58.     if(pBuf) {
  59.         free(pBuf);
  60.     }
  61.     if(fp) {
  62.         fclose(fp);
  63.     }
  64. }




il codice
Codice sorgente - presumibilmente Plain Text

  1. HBITMAP myImage= LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(MyImage));
  2.  
  3.                 BYTE* imgAsByteArray = convertBitmapToByteArray(myImage);
  4.                 BITMAPINFO bmpInfo = getBitmapInfo(myImage);
  5.                 HBITMAP newBMP = CreateBitmap (
  6.                                 bmpInfo.bmiHeader.biWidth,
  7.                                 bmpInfo.bmiHeader.biHeight,
  8.                                 bmpInfo.bmiHeader.biPlanes,
  9.                                 bmpInfo.bmiHeader.biBitCount,
  10.                                 imgAsByteArray);
  11. saveBitmap("prova.bmp", newBMP);



Salva un'immagine completamente invertita (ossia la parte destra si trova a sinistra e la parte superiore si trova in basso) di quella che gli ho passato in input?

Ultima modifica effettuata da robrock80 il 18/04/2010 alle 21:33


Nel mondo ci sono 10 tipi di persone: quelle che capiscono il binario e quelle che non lo capiscono
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 21:35
Domenica, 18/04/2010

anche il remote desktop vuoi implementare?


Ingegnere Informatico
https://ldlagency.it
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:50
Lunedì, 19/04/2010
Se non sbaglio il formato Bitmap memorizza le immagini a "testa sotto", cioè parte dall'ultima linea in basso a salire... sarà questo il tuo problema?


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 17:05
Lunedì, 19/04/2010
Ciao. Alla fine poi ho risolto anche se resta un mistero il motivo per cui il codice che ho cambiato non funziona. Praticamente ho riscritto una delle funzioni in questa maniera

Codice sorgente - presumibilmente C/C++

  1. byte* convertBitmapToByteArray(HBITMAP hBitmap) {
  2.     BITMAPINFO bmpInfo = getBitmapInfo(hBitmap);
  3.  
  4.     int size = ( (bmpInfo.bmiHeader.biBitCount / 8) * bmpInfo.bmiHeader.biWidth * bmpInfo.bmiHeader.biHeight);
  5.     byte* pBuf = (byte*)malloc(size);
  6.     bmpInfo.bmiHeader.biCompression = BI_RGB;
  7.     GetBitmapBits(hBitmap,size, pBuf);
  8.     return pBuf;
  9. }



Ora sono di fronte a un nuovo problema: esiste una libreria open source o free che posso utilizzare con gcc/g++ che mi permetta di trasformare l'immagine bitmap in jpeg (o in un formato ancora più leggero se esiste) e di lavorarla in memoria?
P.S.: Escludiamo CxImage che con gcc ha enormi problemi

Ultima modifica effettuata da robrock80 il 19/04/2010 alle 17:29


Nel mondo ci sono 10 tipi di persone: quelle che capiscono il binario e quelle che non lo capiscono
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 22:00
Lunedì, 19/04/2010
hai provato libjpeg?


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 12:32
Martedì, 20/04/2010
No, non l'ho mai provato... Alla fine ho trovato quest'altra libreria
http://freeimage.sourceforge.net/
Sembra promettere bene. Qualora dovessi avere dei problemi anche con questa vado con quella che mi hai suggerito tu


Nel mondo ci sono 10 tipi di persone: quelle che capiscono il binario e quelle che non lo capiscono
PM Quote