已经实现生成BMP,怎么改成生成PNG数据形式????

arong2004 2008-10-30 03:38:17
生成BMP数据格式 如下: 怎么能改成生成PNG数据的形式那
Buffer:截屏后的内存数据指针

int height,int width 为此buffer图片的宽高

bool _CreateBMP(BYTE* Buffer,int height,int width,int& newBufferSize)
{

int nBitPerPixel = 32;

int bufferSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + height * width * nBitPerPixel/8;
newBufferSize = bufferSize;
BYTE* NewBuffer = new BYTE[bufferSize];
BYTE* temp = NewBuffer;

BITMAPFILEHEADER* pBMPHeader = (BITMAPFILEHEADER*)temp;
pBMPHeader->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
pBMPHeader->bfReserved1 = 0;
pBMPHeader->bfReserved2 = 0;
pBMPHeader->bfSize = bufferSize;
pBMPHeader->bfType = 0x4d42;
temp += sizeof(BITMAPFILEHEADER);

BITMAPINFOHEADER* pInfoHeader = (BITMAPINFOHEADER*)temp;
pInfoHeader->biBitCount = nBitPerPixel;
pInfoHeader->biClrImportant = 0;
pInfoHeader->biClrUsed = 0;
pInfoHeader->biCompression = BI_RGB;
pInfoHeader->biHeight = height;
pInfoHeader->biWidth = width;
pInfoHeader->biPlanes = 1;
pInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
pInfoHeader->biSizeImage = 0;
pInfoHeader->biXPelsPerMeter = 0;
pInfoHeader->biYPelsPerMeter = 0;
temp += sizeof(BITMAPINFOHEADER);


for (int i = height; i > 0 ; --i)
{
int nPass = (i - 1) * width;
for (int j = 0; j < width ; ++j)
{
BYTE* begin = CKTexBuffer;
begin += (nPass + j)*4;

*((DWORD*)temp) = *((DWORD*)begin);
temp += (nBitPerPixel/8);
}
}

return true;

}
...全文
145 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Longinc 2008-10-30
  • 打赏
  • 举报
回复
找点RGB转换方面的东西看看
redleaves 2008-10-30
  • 打赏
  • 举报
回复
还不明白....
libPng可以从内存里读,也可以写回内存,这还不能满足你的要求?
arong2004 2008-10-30
  • 打赏
  • 举报
回复
更正一下:::

生成BMP数据格式 如下: 怎么能改成生成PNG数据的形式那
Buffer:截屏后的内存数据指针

int height,int width 为此buffer图片的宽高

BYTE* _CreateBMP(BYTE* Buffer,int height,int width,int& newBufferSize)
{

int nBitPerPixel = 32;

int bufferSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + height * width * nBitPerPixel/8;
newBufferSize = bufferSize;
BYTE* NewBuffer = new BYTE[bufferSize];
BYTE* temp = NewBuffer;

BITMAPFILEHEADER* pBMPHeader = (BITMAPFILEHEADER*)temp;
pBMPHeader->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
pBMPHeader->bfReserved1 = 0;
pBMPHeader->bfReserved2 = 0;
pBMPHeader->bfSize = bufferSize;
pBMPHeader->bfType = 0x4d42;
temp += sizeof(BITMAPFILEHEADER);

BITMAPINFOHEADER* pInfoHeader = (BITMAPINFOHEADER*)temp;
pInfoHeader->biBitCount = nBitPerPixel;
pInfoHeader->biClrImportant = 0;
pInfoHeader->biClrUsed = 0;
pInfoHeader->biCompression = BI_RGB;
pInfoHeader->biHeight = height;
pInfoHeader->biWidth = width;
pInfoHeader->biPlanes = 1;
pInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
pInfoHeader->biSizeImage = 0;
pInfoHeader->biXPelsPerMeter = 0;
pInfoHeader->biYPelsPerMeter = 0;
temp += sizeof(BITMAPINFOHEADER);


for (int i = height; i > 0 ; --i)
{
int nPass = (i - 1) * width;
for (int j = 0; j < width ; ++j)
{
BYTE* begin = CKTexBuffer;
begin += (nPass + j)*4;

*((DWORD*)temp) = *((DWORD*)begin);
temp += (nBitPerPixel/8);
}
}

return NewBuffer;

}

其实这里涉及到DX的东西,通过3DContex获得Texture,
BYTE* bytee = Texture->LockSurface()//锁定当前Texture
..........
BYTE bmpByte=_CreateBMP(bytee ,height,width,&size); //bmpByte为处理好的返回数据
Texture->UnLockSurface()//处理完之后解锁
arong2004 2008-10-30
  • 打赏
  • 举报
回复
其实这里涉及到DX的东西,通过3DContex获得Texture,
BYTE* bytee = Texture->LockSurface()//锁定当前Texture
..........
_CreateBMP(bytee ,height,width,&size);
Texture->UnLockSurface()//处理完之后解锁
redleaves 2008-10-30
  • 打赏
  • 举报
回复
内存读数据?是什么概念?
arong2004 2008-10-30
  • 打赏
  • 举报
回复
有谁能帮帮我写下算法最好了 谢谢哦!
arong2004 2008-10-30
  • 打赏
  • 举报
回复
Cximage里面的生成png更加方便了 只是转化效率不高
arong2004 2008-10-30
  • 打赏
  • 举报
回复
我用过libPNG来生成png,就两行代码可以搞定,比较简单.但是前提是我怎么才能从内存中提取出来数据,这个需要算法的.
redleaves 2008-10-30
  • 打赏
  • 举报
回复
PNG的格式有点复杂,请使用libPNG来搞.
arong2004 2008-10-30
  • 打赏
  • 举报
回复
谢谢
这个网站可以打开,但是什么都下载不了

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧