[ Rongon @ 07.09.2010. 15:48 ] @
Naime, imam ovakav problem:
Imam niz bajtova, u kome je JPEG slika, i velicinu te slike u bajtovima, i ja to zelim da prikazem u prozoru moje win32 aplikacije
Code:
BYTE userImage[MAX];
int userImageSize;

Pokusao sam ovako:
Code:
HWND iUserImage;
//kreiram staticku kontrolu preko win32 api-ja, na koju kasnije iscrtavam
iUserImage = CreateWindow(L"Static", NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP | WS_BORDER,408,20,242,322,hwnd,(HMENU)ID_I_SLIKA,g_hInst,0);
...
...
//i onda u nekoj funkciji, kada zelim da ucitam jpg
BITMAPINFO bmpInfo;
ZeroMemory(&bmpInfo, sizeof(bmpInfo));
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = 242;
bmpInfo.bmiHeader.biHeight = 322;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 0;
bmpInfo.bmiHeader.biCompression = BI_JPEG;
bmpInfo.bmiHeader.biSizeImage = userImageSize;
bmpInfo.bmiHeader.biXPelsPerMeter = 0;
bmpInfo.bmiHeader.biYPelsPerMeter = 0;
bmpInfo.bmiHeader.biClrUsed = 0;
bmpInfo.bmiHeader.biClrImportant = 0;
StretchDIBits(GetWindowDC(iUserImage), 0, 0, 242, 322, 0, 0, 242, 322, userImage, &bmpInfo, 0, 0);

Ovo jednostavno popuni celu sliku (staticku kontrolu iUserImage) crnom bojom. Kakvo delotvorno resenje mi predlazete?
[ deerbeer @ 07.09.2010. 15:54 ] @
Da li je u tom nizu bajtova dekompresovan JPG ili si samo otvorio neki jpg fajl i smestio ga u niz ?
[ Rongon @ 07.09.2010. 16:36 ] @
Verovatno je kompresovan JPG, jer je MAX u userImage[MAX] jednako 7700.
Radi se o tome da pokusavam da prikazem sliku sa elektronske licne karte.
[ VladimirCDT @ 07.09.2010. 16:58 ] @
Pre, sada vec dosta godina, ja sam se nesto zezao sa tim jpegom.

Mislim da ces prvo morati da dekompresujes taj jpeg u bitmap, pa tek onda da iscrtavas. Ne znam da li sada ima neka gotivnija podrska za dekompresiju jpeg-a, onomad kada sam ja radio, napatio sam se sa onom jpeg bibliotekom.
[ Goran Rakić @ 07.09.2010. 18:19 ] @
Sigurno da postoji klasa/kontrola sa podrškom za JPEG. Ne verujem da mora da piše sopstvenu dekompresiju u bitmapu, ali moguće da ova klasa koju koristi to ne podržava. Ne bavim se Win32. Google daje ovo kao rezultat http://www.arstdesign.com/articles/picloader.html za alternativu.


Zapravo, pogledaj ovde: http://msdn.microsoft.com/en-us/library/dd145121(VS.85).aspx

Citat:
If the biCompression member of BITMAPINFOHEADER is BI_JPEG or BI_PNG, lpBits points to a buffer containing a JPEG or PNG image, respectively. The biSizeImage member of the BITMAPINFOHEADER structure specifies the size of the buffer. The iUsage parameter must be set to DIB_RGB_COLORS. The dwRop parameter must be set to SRCCOPY.


Stara dobra navika da se pročita man stranica. Probaj sa:
StretchDIBits(GetWindowDC(iUserImage), 0, 0, 242, 322, 0, 0, 242, 322, userImage, &bmpInfo, DIB_RGB_COLORS, SRCCOPY);
[ Mihajlo Cvetanović @ 07.09.2010. 18:37 ] @
CxImage biblioteka sa code projecta ima i mogućnost čitanja slike iz memorije, pored čitanja sa hard diska.
[ Rongon @ 07.09.2010. 23:55 ] @
@Mihajlo Cvetanović
Hvala ti, proradilo je preko CxImage. Jeste da je malo overkill (posto cela biblioteka ima pregrst opcija za sve standardne formate), pa je exe skocio sa 60KB na 900KB, ali radi...
Code:
CxImage* pCxSlika;
...
pCxSlika = new CxImage(userImage, userImageSize, CXIMAGE_FORMAT_JPG);
SendMessage(iUserImage, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)pCxSlika->MakeBitmap());
delete pCxSlika;
Pokusacu sada da izdvojim samo deo biblioteke koji radi sa JPG slikama :)
P.S. Za one koje zanima, dimenzije slike na elektronskoj licnoj karti su 240x320px.

Izmena:
U fajlu "ximacfg.h" u glavnom projektu "CxImage" sam jedino ostavio:
#define CXIMAGE_SUPPORT_JPG 1
, a sve ostale formate sam stavio na 0. Mnogo manji fajl se kreira, exe je sada 100KB, sto je super. :) :)

[Ovu poruku je menjao Rongon dana 08.09.2010. u 01:16 GMT+1]