请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

ESFKAMI

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

ESFX

ESF: Xenoverse

ESF123

ESF1.2.3

EVM2.1

EVM2.1

ECXSSJ

ECX: TeamSSJ

ECX2.2

ECX RC2

ECX2.3

ECX RC3

查看: 1454|回复: 0

[代码|Code]GDI Load Frame

[复制链接]

212

主题

217

帖子

1221

积分

ESFKAMI

Rank: 8Rank: 8

积分
1221
发表于 2017-7-14 16:43:12 | 显示全部楼层 |阅读模式

通过以下代码你可以选择画哪一张GIF的帧到HUD上[]
You can select to draw which frame of GIF onto HUD by this code.

loadimage.h:

  1. unsigned char * loadNormalFormat (const wchar_t *filename, int *width, int *height, int frame);
复制代码
loadimage.cpp:

  1. #include <Windows.h>
  2. #include <GdiPlus.h>

  3. #include "loadimage.h"

  4. #pragma comment (lib, "gdiplus.lib")

  5. unsigned char* loadNormalFormat (const wchar_t *filename, int *width, int *height, int frame)
  6. {
  7.         // 启动GDI+
  8.         Gdiplus::GdiplusStartupInput gdipSIn;
  9.         unsigned long gdipToken;
  10.         Gdiplus::GdiplusStartup (&gdipToken, &gdipSIn, NULL);

  11.         // 加载图像文件
  12.         Gdiplus::Bitmap *pBitmap = new Gdiplus::Bitmap (filename);

  13.         // 获得图像高宽
  14.         unsigned int bitmapWidth = pBitmap->GetWidth ();
  15.         unsigned int bitmapHeight = pBitmap->GetHeight ();

  16.         if (bitmapWidth <= 0 || bitmapHeight <= 0)
  17.         {
  18.                 delete pBitmap;
  19.                 // 结束GDI+
  20.                 Gdiplus::GdiplusShutdown (gdipToken);
  21.                 return NULL;
  22.         }

  23.         /* Load Frame Here */
  24.         UINT count;

  25.         count = pBitmap->GetFrameDimensionsCount();
  26.         GUID* pDimID = new GUID[count];

  27.         pBitmap->GetFrameDimensionsList(pDimID,count);
  28.         int FrameCount = pBitmap->GetFrameCount(&pDimID[0]);

  29.         pBitmap->SelectActiveFrame(&pDimID[0], frame);// Set Frame

  30.         // 获取图像元数据构造GlImage
  31.         Gdiplus::Rect bitmapArea (0, 0, bitmapWidth, bitmapHeight);
  32.         Gdiplus::BitmapData bitmapData;
  33.         pBitmap->RotateFlip(Gdiplus::Rotate180FlipX); // 因为位图的存储是上下翻转的,这里要绕X轴转180度[]
  34.         pBitmap->LockBits (&bitmapArea, Gdiplus::ImageLockModeRead, pBitmap->GetPixelFormat (), &bitmapData);

  35.         const BYTE *imageData = (BYTE *)bitmapData.Scan0;
  36.         int stride = bitmapData.Stride;
  37.         unsigned char *glImageData = NULL;

  38.         if (imageData != 0)
  39.         {
  40.                 glImageData = new unsigned char[bitmapWidth * bitmapHeight * 4];
  41.                 const int destR = 0, destG = 1, destB = 2, destA = 3;
  42.                 int srcR, srcG, srcB, srcA, bytesPerPixel;

  43.                 // 根据像素格式设置初始值[]
  44.                 switch (bitmapData.PixelFormat)
  45.                 {
  46.                         case PixelFormat24bppRGB:
  47.                         {
  48.                                 srcR = 2; srcG = 1; srcB = 0; bytesPerPixel = 3;
  49.                                 break;
  50.                         }
  51.                         case PixelFormat32bppARGB:
  52.                         {
  53.                                 srcA = 3; srcR = 2; srcG = 1; srcB = 0; bytesPerPixel = 4;
  54.                                 break;
  55.                         }
  56.                         default: // 图片的像素格式不支持
  57.                         {
  58.                                 delete [] glImageData;
  59.                                 pBitmap->UnlockBits (&bitmapData);
  60.                                 delete pBitmap;

  61.                                 // 结束GDI+
  62.                                 Gdiplus::GdiplusShutdown (gdipToken);
  63.                                 return NULL;
  64.                         }
  65.                 }

  66.                 // 复制及转换图像数据[]
  67.                 for (unsigned int y = 0; y < bitmapHeight; ++y)
  68.                 {
  69.                         for (unsigned int x = 0; x < bitmapWidth; ++x)
  70.                         {
  71.                                 glImageData[(y * bitmapWidth + x) * 4 + destR] = imageData[((bitmapHeight - 1 - y) * stride) + x * bytesPerPixel + srcR];
  72.                                 glImageData[(y * bitmapWidth + x) * 4 + destG] = imageData[((bitmapHeight - 1 - y) * stride) + x * bytesPerPixel + srcG];
  73.                                 glImageData[(y * bitmapWidth + x) * 4 + destB] = imageData[((bitmapHeight - 1 - y) * stride) + x * bytesPerPixel + srcB];

  74.                                 if (bytesPerPixel == 4)
  75.                                 {
  76.                                         glImageData[(y * bitmapWidth + x) * 4 + destA] = imageData[((bitmapHeight - 1 - y) * stride) + x * bytesPerPixel + srcA];
  77.                                 }
  78.                                 else
  79.                                         glImageData[((bitmapHeight - 1 - y) * stride) * 4 + destA] = 255;
  80.                         }
  81.                 }
  82.         }

  83.         pBitmap->UnlockBits (&bitmapData);
  84.         delete pBitmap;

  85.         // 返回图像尺寸
  86.         *width = bitmapWidth;
  87.         *height = bitmapHeight;

  88.         // 结束GDI+
  89.         Gdiplus::GdiplusShutdown (gdipToken);
  90.         return glImageData;
  91. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|ESFKAMI    

GMT+8, 2018-9-22 10:15 , Processed in 0.314315 second(s), 21 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表