PNG laden und in 24 Bit Bitmap convertieren
-
Moin Leute,
ich werd hier fast verrückt.Ich muss ein PNG laden und das geladene PNG intern in ein CBitmap einfügen!
Dieses geht als Byte Array anschliessend via USB an ein Display.
Ich hab schon alles mögliche Probiert.CImage und Co...
Aber nichts haut so richtig hin.
Kann mir mal jemand auf die Sprünge helfen?Das Bitmap hat 128x64 Pixel mit 24 Bit (eben weil es ein Farb LCD ist in der größe)
Vielen Dank
-
DevIL sollte funktionieren, FreeImage, ...
Wenns bei dir nicht hinhaut, liegt das vermutlich daran, dass du irgendwas falsch machst. In dem Fall würde es wohl helfen wenn du mal Code postest.
-
So über folgenden weg hab ich es probiert! Er legt mir auch nen BMP auf der Platte ab, aber sobald ich das probier ans Display zu übertragen kommt da nur noch Mist bei raus!
BITMAP bm; CBitmap tbmp; CImage image,test; image.Load("C:\\test.png"); //HBITMAP hBitmap = (HBITMAP) image; CDC *pDC = this->GetDC(); CDC *iDC = CDC::FromHandle(image.GetDC()); CDC imageDC; tbmp.CreateCompatibleBitmap(pDC,128,64); tbmp.SetBitmapBits(24,NULL); tbmp.GetBitmap(&bm); imageDC.CreateCompatibleDC(pDC); imageDC.SelectObject(tbmp); CRect rect = new CRect(0,0,128,64); CBrush brush; brush.CreateSolidBrush(RGB(255,255,255)); imageDC.FillRect(rect,&brush); // PNG Logo in Bitmap DC zeichnen imageDC.BitBlt(0,0,64,48,iDC,0,0,SRCCOPY); // Auf den Dialog zeichnen pDC->BitBlt(0,0,128,64,&imageDC,0,0,SRCCOPY); image.ReleaseDC(); HBITMAP sBitmap; sBitmap = (HBITMAP)SelectObject(imageDC,tbmp); test.Attach(sBitmap); test.Save("c:\\test.bmp"); test.ReleaseDC();Also auf meinem Dialog und auf der Platte liegt es korrekt (augenscheinlich)...
Ich dreh fast durch hier!Danke
-
ok aus einem mir noch nicht definirbaren grund sind die BMPs 32 Bit und nicht 24....ist klar das das Display dann mist anzeigt

Nur wie bekomme ich die intern jetzt in 24 Bit konvertiert?
EDIT : Ich habs jetzt in nem 24 Bit Format
Muss es nur noch wieder in ein BYTE Array packen...Code Lösung kommt gleich!
-
Hier nun meine Lösung
#define BUFFER_COLOR_SIZE (1024*24) char bmpbuffer[ BUFFER_COLOR_SIZE ]; CImage image; image.Load("C:\\test.png"); int * colorBuffer; //a 24Bit color-buffer (the image) int width = 128; int height = 64; BITMAPINFO bitmapinfo; HBITMAP bitmap; CBitmap bmp; CDC *pDC = this->GetDC(); CDC *pngDC = CDC::FromHandle(image.GetDC()); CDC MemDC; MemDC.CreateCompatibleDC(pDC); //Set up windows bitmap stuff bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bitmapinfo.bmiHeader.biWidth = width; bitmapinfo.bmiHeader.biHeight = -height; /* top-down */ bitmapinfo.bmiHeader.biPlanes = 1; bitmapinfo.bmiHeader.biBitCount = 24; bitmapinfo.bmiHeader.biCompression = BI_RGB; bitmapinfo.bmiHeader.biSizeImage = width * height * sizeof(int); bitmapinfo.bmiHeader.biXPelsPerMeter = 0; bitmapinfo.bmiHeader.biYPelsPerMeter = 0; bitmapinfo.bmiHeader.biClrUsed = 0; bitmapinfo.bmiHeader.biClrImportant = 0; bitmap = CreateDIBSection(MemDC, &bitmapinfo, DIB_RGB_COLORS, reinterpret_cast <void**> (&colorBuffer), 0, 0); SelectObject(MemDC, bitmap); //weißer Hintergrund CRect rect = new CRect(0,0,128,64); CBrush brush; brush.CreateSolidBrush(RGB(255,255,255)); MemDC.FillRect(rect,&brush); MemDC.BitBlt(0,0,64,48,pngDC,0,0,SRCCOPY); ////////hier zeichnen!!!!!!!!!!!! //Bitmap anzeigen pDC->BitBlt(0,0,128,64,&MemDC,0,0,SRCCOPY); bmp.Attach(bitmap); bmp.GetBitmapBits(BUFFER_COLOR_SIZE,bmpbuffer); image.ReleaseDC(); int x,y,bytePerLine; bytePerLine=width*3; for(y=0; y<height/2; y++) { for(x=0; x<bytePerLine; x++) { swap(bmpbuffer[y*bytePerLine+x],bmpbuffer[(height-1-y)*bytePerLine+x]); } }danach folgt nur noch der Code zum übermitteln ans LCD....geht jetzt sauber!