Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.50 KB | None | 0 0
  1.  
  2.     Gdiplus::Bitmap *pBitmap = 0;
  3.  
  4. /*
  5.     PVOID hBuffer = GlobalAlloc(GMEM_MOVEABLE, ImgSize);
  6.     if(hBuffer)
  7.     {
  8.         PUCHAR pBuffer = (PUCHAR)GlobalLock(hBuffer);
  9.         if(pBuffer)
  10.         {
  11.             if(ImgData)
  12.                 memcpy(pBuffer, ImgData, ImgSize);
  13.             else
  14.                 ReadFile(hFile, pBuffer, ImgSize, &ImgSize, 0);
  15.  
  16.             GlobalUnlock(hBuffer);
  17.  
  18.             IStream* pStream = 0;
  19.             if(CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK)
  20.             {
  21.                 pBitmap = Gdiplus::Bitmap::FromStream(pStream);
  22.                 pStream->Release();
  23.             }
  24.         }
  25.  
  26.         GlobalFree(hBuffer);
  27.     }
  28. */
  29.  
  30.     cStream Stream;
  31.  
  32.     if(Path)
  33.     {
  34.         if(!Stream.m.ReadFile(Path))
  35.             return;
  36.     }
  37.     else
  38.     {
  39.         Stream.m.Set(ImgData, ImgSize);
  40.     }
  41.  
  42.     pBitmap = Gdiplus::Bitmap::FromStream(&Stream);
  43.     Stream.Release();
  44.  
  45.  
  46.     //if(hFile)
  47.     //  CloseHandle(hFile);
  48.  
  49.  
  50.     if(!pBitmap)
  51.         return;
  52.  
  53.     LONG W = pBitmap->GetWidth();
  54.     LONG H = pBitmap->GetHeight();
  55.  
  56.     if(Width)
  57.         *Width = W;
  58.  
  59.     if(Height)
  60.         *Height = H;
  61.  
  62.     PUCHAR BitmapBits = 0;
  63.     HBITMAP hBitmap = 0;
  64.     if(Bitmap)
  65.     {
  66.         BITMAPV5HEADER bi;
  67.         memset0(&bi, sizeof(BITMAPV5HEADER));
  68.  
  69.         bi.bV5Size = sizeof(BITMAPV5HEADER);
  70.         bi.bV5Width = W;
  71.         bi.bV5Height = -H;
  72.         bi.bV5Planes = 1;
  73.         bi.bV5BitCount = 32;
  74.         bi.bV5Compression = BI_BITFIELDS;
  75.         bi.bV5AlphaMask = 0xFF000000;
  76.         bi.bV5RedMask   = 0x00FF0000;
  77.         bi.bV5GreenMask = 0x0000FF00;
  78.         bi.bV5BlueMask  = 0x000000FF;
  79.  
  80.         hBitmap = CreateDIBSection(hScreen, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&BitmapBits, 0, 0);
  81.  
  82.         if(hBitmap)
  83.             *Bitmap = hBitmap;
  84.     }
  85.  
  86.     Gdiplus::Rect rc(0, 0, W, H);
  87.     Gdiplus::BitmapData data;
  88.  
  89.     memset0(&data, sizeof(data));
  90.  
  91.     if( (Bits || BitmapBits) &&
  92.         pBitmap->LockBits(&rc, ImageLockModeRead, PixelFormat32bppARGB, &data) == Gdiplus::Ok )
  93.     {
  94.         PUCHAR pBits = (PUCHAR)data.Scan0, pSrc, pDst;
  95.         PUCHAR pBuff = BitmapBits ? BitmapBits : new UCHAR [ W * H * 4 ];
  96.  
  97.         if(pBuff)
  98.         {
  99.             BOOL bRev = !(data.Stride > 0);
  100.  
  101.             for(LONG y = 0; y < H; y++)
  102.             {
  103.                 pSrc = &pBits[ W * 4 * y ];
  104.                 pDst = bRev ? &pBuff[ W * 4 * (H - 1 - y) ] : &pBuff[ W * 4 * y ];
  105.  
  106.                 for(LONG x = 0; x < W; x++)
  107.                 {
  108.                     if(AlphaFix)
  109.                     {
  110.                         pDst[0] = (pSrc[0] * pSrc[3]) / 255;
  111.                         pDst[1] = (pSrc[1] * pSrc[3]) / 255;
  112.                         pDst[2] = (pSrc[2] * pSrc[3]) / 255;
  113.                         pDst[3] = (pSrc[3]);
  114.                     }
  115.                     else
  116.                     {
  117.                         *(PULONG32)pDst = *(PULONG32)pSrc;
  118.                     }
  119.  
  120.                     pSrc += 4;
  121.                     pDst += 4;
  122.                 }
  123.             }
  124.  
  125.             if(Bits)
  126.                 *Bits = pBuff;
  127.         }
  128.  
  129.         pBitmap->UnlockBits(&data);
  130.     }
  131.  
  132.     delete pBitmap;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement