游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4857|回复: 6

LockRect图像数据后,为何图像上下颠倒了???

[复制链接]

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2011-4-28 09:18:00 | 显示全部楼层 |阅读模式

  1. void CRender::InitData()
  2. {
  3.     unsigned int* pBmpData = NULL;

  4.     CYap yap;
  5.     yap.OpenYap("test.yap");

  6.     // 这里的pBmpData数据读取没有问题的,已测试过可以正常保存tga图片.32位的
  7.     yap.UnPackYas(&pBmpData, m_Width, m_Height, 1, 1, 2);
  8.     int bmpSize = m_Width*m_Height*4;

  9.     m_pD3DDevice->CreateTexture(m_Width, m_Height, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED,
  10. &m_pTexture, NULL);

  11.     D3DLOCKED_RECT lrect;
  12.     HRESULT hr = m_pTexture->LockRect(0, &lrect, NULL, 0/*|D3DLOCK_NO_DIRTY_UPDATE*/);
  13.     if (FAILED(hr))
  14.     {
  15.         m_pTexture->UnlockRect(0);
  16.         return;
  17.     }

  18.     memcpy(lrect.pBits, pBmpData, bmpSize);

  19.     m_pTexture->UnlockRect(0);
  20. }
复制代码


应该怎么LockRect像素?

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-4-28 12:44:00 | 显示全部楼层

Re: LockRect图像数据后,为何图像上下颠倒了???

自己回答:
原因:
BMP数据是从下往上存储的,而D3D则是从上往下存储的。所以必须转换存储顺序

解决方案:


  1. ...
  2.         D3DLOCKED_RECT lrect;
  3.         hr = m_pTexture->LockRect(0, &lrect, NULL, 0/*|D3DLOCK_NO_DIRTY_UPDATE*/);
  4.         if (FAILED(hr))
  5.         {
  6.                 m_pTexture->UnlockRect(0);
  7.                 return;
  8.         }

  9.         unsigned int* pDest = (unsigned int*)lrect.pBits;

  10.         for (int h=0; h<m_Height; h++)
  11.         {
  12.                 for (int w=0; w<m_Width; w++)
  13.                 {

  14.                         pDest[h*m_Width+w] = pBmpData[(m_Height-1-h)*m_Width+w];
  15.                 }
  16.         }

  17.         m_pTexture->UnlockRect(0);
  18. ...
复制代码

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2011-4-29 13:31:00 | 显示全部楼层

Re:LockRect图像数据后,为何图像上下颠倒了???

补充下,win32载入BMP数据,位图信息段数据可载入到数据结构BITMAPINFOHEADER中,结构如下
typedef struct tagBITMAPINFOHEADER{
  DWORD  biSize;
  LONG   biWidth;
  LONG   biHeight;
  WORD   biPlanes;
  WORD   biBitCount;
  DWORD  biCompression;
  DWORD  biSizeImage;
  LONG   biXPelsPerMeter;
  LONG   biYPelsPerMeter;
  DWORD  biClrUsed;
  DWORD  biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;

  其中 biHeight 通过正负号指明了位图数据是否颠倒储存(正值表示是颠倒)。

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-4-29 15:29:00 | 显示全部楼层

Re: Re:LockRect图像数据后,为何图像上下颠倒了???

acros: ReockRect图像数据后,为何图像上下颠倒了???

补充下,win32载入BMP数据,位图信息段数据可载入到数据结构BITMAPINFOHEADER中,结构如下
typedef struct...


这里的“颠倒”很容易搞混
即:
如果该值为正,则像素是以“自下而上”存储,而实际图像是正像
如果该值为负,则像素是以“自上而下”存储,而实际图像是倒像
即:bmp默认是以自下而上为图像的正像
对不对?

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2011-4-29 18:28:00 | 显示全部楼层

Re:LockRect图像数据后,为何图像上下颠倒了???

BMP图片的问题。为啥BMP要从最右下角开始记录图像呢?

麻烦。

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2011-4-29 19:01:00 | 显示全部楼层

Re: Re: Re:LockRect图像数据后,为何图像上下颠倒了???

轩辕崇正: Re: ReockRect图像数据后,为何图像上下颠倒了???



这里的“颠倒”很容易搞混
即:
如果该值为正,则像素是以“自下而上”存储,而实际图像是正像
如果...


准确地应该说“翻转”吧,就是y方向了反着来了。

正值表示 实际图形储存从下往上(从左到右)开始描述
负值就是我们从上往下、从左到右了,


windows游戏编程大师技巧里面有提到。Win32 API里面大概有更具体的描述吧···
我也没搞明白为什么会有这种储存图像数据的情况···
哪种情况出现的多我就更不知道了,等高人解释。

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-4-29 19:14:00 | 显示全部楼层

Re: Re:LockRect图像数据后,为何图像上下颠倒了???

snhun: ReockRect图像数据后,为何图像上下颠倒了???

BMP图片的问题。为啥BMP要从最右下角开始记录图像呢?

麻烦。


tga的像素也是自下而上存储的,这样的话似乎是一种标准。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 02:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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