Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Gdiplus::Bitmap *pBitmap = 0;
- /*
- PVOID hBuffer = GlobalAlloc(GMEM_MOVEABLE, ImgSize);
- if(hBuffer)
- {
- PUCHAR pBuffer = (PUCHAR)GlobalLock(hBuffer);
- if(pBuffer)
- {
- if(ImgData)
- memcpy(pBuffer, ImgData, ImgSize);
- else
- ReadFile(hFile, pBuffer, ImgSize, &ImgSize, 0);
- GlobalUnlock(hBuffer);
- IStream* pStream = 0;
- if(CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK)
- {
- pBitmap = Gdiplus::Bitmap::FromStream(pStream);
- pStream->Release();
- }
- }
- GlobalFree(hBuffer);
- }
- */
- cStream Stream;
- if(Path)
- {
- if(!Stream.m.ReadFile(Path))
- return;
- }
- else
- {
- Stream.m.Set(ImgData, ImgSize);
- }
- pBitmap = Gdiplus::Bitmap::FromStream(&Stream);
- Stream.Release();
- //if(hFile)
- // CloseHandle(hFile);
- if(!pBitmap)
- return;
- LONG W = pBitmap->GetWidth();
- LONG H = pBitmap->GetHeight();
- if(Width)
- *Width = W;
- if(Height)
- *Height = H;
- PUCHAR BitmapBits = 0;
- HBITMAP hBitmap = 0;
- if(Bitmap)
- {
- BITMAPV5HEADER bi;
- memset0(&bi, sizeof(BITMAPV5HEADER));
- bi.bV5Size = sizeof(BITMAPV5HEADER);
- bi.bV5Width = W;
- bi.bV5Height = -H;
- bi.bV5Planes = 1;
- bi.bV5BitCount = 32;
- bi.bV5Compression = BI_BITFIELDS;
- bi.bV5AlphaMask = 0xFF000000;
- bi.bV5RedMask = 0x00FF0000;
- bi.bV5GreenMask = 0x0000FF00;
- bi.bV5BlueMask = 0x000000FF;
- hBitmap = CreateDIBSection(hScreen, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&BitmapBits, 0, 0);
- if(hBitmap)
- *Bitmap = hBitmap;
- }
- Gdiplus::Rect rc(0, 0, W, H);
- Gdiplus::BitmapData data;
- memset0(&data, sizeof(data));
- if( (Bits || BitmapBits) &&
- pBitmap->LockBits(&rc, ImageLockModeRead, PixelFormat32bppARGB, &data) == Gdiplus::Ok )
- {
- PUCHAR pBits = (PUCHAR)data.Scan0, pSrc, pDst;
- PUCHAR pBuff = BitmapBits ? BitmapBits : new UCHAR [ W * H * 4 ];
- if(pBuff)
- {
- BOOL bRev = !(data.Stride > 0);
- for(LONG y = 0; y < H; y++)
- {
- pSrc = &pBits[ W * 4 * y ];
- pDst = bRev ? &pBuff[ W * 4 * (H - 1 - y) ] : &pBuff[ W * 4 * y ];
- for(LONG x = 0; x < W; x++)
- {
- if(AlphaFix)
- {
- pDst[0] = (pSrc[0] * pSrc[3]) / 255;
- pDst[1] = (pSrc[1] * pSrc[3]) / 255;
- pDst[2] = (pSrc[2] * pSrc[3]) / 255;
- pDst[3] = (pSrc[3]);
- }
- else
- {
- *(PULONG32)pDst = *(PULONG32)pSrc;
- }
- pSrc += 4;
- pDst += 4;
- }
- }
- if(Bits)
- *Bits = pBuff;
- }
- pBitmap->UnlockBits(&data);
- }
- delete pBitmap;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement