读取位图并存储问题?????????

半天想不出来 2010-01-16 03:51:13
BITMAPFILEHEADER FileHeader; // The bitmap file header
BITMAPINFO info;

GLuint ImageSize;

FILE* file = fopen("E:\\1.bmp", "rb");//图1是我要读取的图,已知,是8位位图
FILE *out = fopen("E:\\33.bmp", "wb");


fread(&FileHeader, sizeof(BITMAPFILEHEADER), 1, file); // Read the bitmap file heade

fwrite(&FileHeader, sizeof(BITMAPFILEHEADER), 1, out);

if (FileHeader.bfType != 0x4D42)
{
MessageBox(NULL, "Could not match BMP type", "ERROR", MB_OK);
fclose(file);
return false;
}

fread(&info.bmiHeader, sizeof(BITMAPINFOHEADER), 1, file);
fread(&InfoHeader, sizeof(BITMAPINFOHEADER), 1, file);



fwrite(&info, sizeof(BITMAPINFO), 1, out);

m_width = info.bmiHeader.biWidth;
m_height = info.bmiHeader.biHeight;
m_bpp = info.bmiHeader.biBitCount;

if (info.bmiHeader.biClrUsed != 0)
{//带颜色表
ImageSize = info.bmiHeader.biSizeImage;
}
else
{//不带颜色表的
ImageSize = m_height*m_bpp;
}
if(NULL != m_data)
{
delete []m_data;
m_data = NULL;
}
m_data = new unsigned char [ImageSize];


if (m_data==NULL) // Confirm memory allocation
{
MessageBox(NULL, "Could not allocate memory for image", "SHUTDOWN ERROR",MB_OK |MB_ICONINFORMATION);
fclose(file);
return false;
}
fseek(file, FileHeader.bfOffBits, SEEK_SET);
fread(m_data, 1, ImageSize, file);

fseek(out, FileHeader.bfOffBits, SEEK_SET);
fwrite(m_data, 1, ImageSize, out);
if (m_data==NULL) // Make sure bitmap image data was read
{
MessageBox(NULL, "Could not read image data", "SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
fclose(file);
return false;
}








这是我编写的代码,希望将1.bmp复制到33.bmp中。但始终有问题。
请问高手,存储位图,到底要存储些什么东西??
...全文
89 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
半天想不出来 2010-01-16
  • 打赏
  • 举报
回复
ImageSize = info.bmiHeader.biSizeImage;

高手。这个地方有问题,我有的图 这个biSizeImage是0,我改了以下 height*width*(bitcount/8)
就解决了 一点问题

但是 问题又出现了。

复制的图片,不完整,比原图小,,,我观察了一下。是图片顶部 一部分没显示。。。

这个是不是 跟头文件有什么关系?????????
traceless 2010-01-16
  • 打赏
  • 举报
回复
是的,这个就是copy,只不过LZ说要分步copy,按照文件信息和内容分步来copy

那就在源代码上帮LZ更正了。。。
macrojj 2010-01-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 traceless 的回复:]
C/C++ codeint main()
{
BITMAPFILEHEADER FileHeader;// The bitmap file header BITMAPINFO info;int ImageSize;
FILE* file= fopen("E:\\1.bmp","rb");//图1是我要读取的图,已知,是8位位图 FILE*out= fopen("E:\\33.bmp","wb");

fread(&FileHeader,sizeof(BITMAPFILEHEADER),1, file);// Read the bitmap file heade fwrite(&FileHeader,sizeof(BITMAPFILEHEADER),1,out);if (FileHeader.bfType!=0x4D42)
{
fclose(file);returnfalse;
}
fread(&info.bmiHeader,sizeof(BITMAPINFOHEADER),1, file);
fwrite(&info.bmiHeader,sizeof(BITMAPINFOHEADER),1,out);int m_width= info.bmiHeader.biWidth;int m_height= info.bmiHeader.biHeight;int m_bpp= info.bmiHeader.biBitCount;if (info.bmiHeader.biClrUsed!=0)
{//带颜色表 ImageSize= info.bmiHeader.biSizeImage;
}else
{//不带颜色表的 ImageSize= m_height*(m_width*m_bpp+31)/8;//// }
PBYTE m_data= NULL;
m_data=new BYTE [ImageSize];
memset(m_data,0, ImageSize);
fread(m_data,1, ImageSize, file);
fwrite(m_data,1, ImageSize,out);return0;
}

我在你的代码的基础上简单地修改了一下,通过。修改了哪些地方,你自己对比吧

[/Quote]

这个就是copy啊
traceless 2010-01-16
  • 打赏
  • 举报
回复

是不是直接测试上面的代码呀?
只要源文件有,就可以生成,我都生成了。

你先另开个工程,先运行上面的代码嘛

然后再调试其他模块
半天想不出来 2010-01-16
  • 打赏
  • 举报
回复
高手,还是不行啊,得到的33。bmp,还是不对
traceless 2010-01-16
  • 打赏
  • 举报
回复
int main()
{
BITMAPFILEHEADER FileHeader; // The bitmap file header
BITMAPINFO info;
int ImageSize;
FILE* file = fopen("E:\\1.bmp", "rb");//图1是我要读取的图,已知,是8位位图
FILE *out = fopen("E:\\33.bmp", "wb");

fread(&FileHeader, sizeof(BITMAPFILEHEADER), 1, file); // Read the bitmap file heade
fwrite(&FileHeader, sizeof(BITMAPFILEHEADER), 1, out);

if (FileHeader.bfType != 0x4D42)
{
fclose(file);
return false;
}
fread(&info.bmiHeader, sizeof(BITMAPINFOHEADER), 1, file);
fwrite(&info.bmiHeader, sizeof(BITMAPINFOHEADER), 1, out);

int m_width = info.bmiHeader.biWidth;
int m_height = info.bmiHeader.biHeight;
int m_bpp = info.bmiHeader.biBitCount;
if (info.bmiHeader.biClrUsed != 0)
{//带颜色表
ImageSize = info.bmiHeader.biSizeImage;
}
else
{//不带颜色表的
ImageSize = m_height*(m_width*m_bpp+31)/8; ////
}
PBYTE m_data = NULL;
m_data = new BYTE [ImageSize];
memset(m_data, 0, ImageSize);
fread(m_data, 1, ImageSize, file);
fwrite(m_data, 1, ImageSize, out);
return 0;
}


我在你的代码的基础上简单地修改了一下,通过。修改了哪些地方,你自己对比吧
traceless 2010-01-16
  • 打赏
  • 举报
回复
哦 那你的解压缩部分搞定没错了,是不 ?
半天想不出来 2010-01-16
  • 打赏
  • 举报
回复
我的任务是,把每个像素 压缩,比如说 00001111,我把像素提取出来,只存储1111在一个txt中,后面我解压的时候,按照一定规律,恢复像素 00001111,利用txt恢复原图
半天想不出来 2010-01-16
  • 打赏
  • 举报
回复
就是,我按照 位图结构,取文件信息头和位图信息, 数据。马上把这些依次又放在另个文件,但显示出来的东西 不是原图
traceless 2010-01-16
  • 打赏
  • 举报
回复
那句压缩 再解压,我没用过,帮不上忙

但是这句“问题就是,我现在连 原图文件写了 都读不出来”什么意思,请再表达一次
半天想不出来 2010-01-16
  • 打赏
  • 举报
回复
不是这个意思。。

我本来的任务是:把8位位图,的像素读出来,用变长格式压缩。。然后解压恢复原图文件。

问题就是,我现在连 原图文件写了 都读不出来
traceless 2010-01-16
  • 打赏
  • 举报
回复
Faint~~

还有什么要求吗,就位图文件复制吗, 搞这么复杂

int main()
{
FILE* file = fopen("E:\\1.bmp"", "rb");//图1是我要读取的图,已知,是8位位图
FILE *out = fopen("E:\\33.bmp", "wb");
const int nSize = 1024*1024;
char *pData = (char *)malloc(nSize);
memset(pData, 0, nSize);
while(!feof(file))
{
int nRead = fread(pData, 1, nSize, file);
if (nRead)
fwrite(pData, 1, nRead, out);
else
break;
}
free(pData);
fclose(file);
fclose(out);
return 0;
}

如果仅仅是文件的复制,就那样行了,还考虑什么头文件信息
还以为你要用DC创建bmp

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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