【100分】一个文件读写的问题,读BMP和TXT,然后生成新的文件格式. 各位高手,好久没来提问了,给各位送分来了,请笑纳!!!!一个文件读写的问题:读BMP和TXT,然后生成新的文件格式,后缀名就随意啦,生成新的文件后,要能用程序再次打开,看到里面的BMP图片和文本信息。请问怎么实现???请详细说明!有代码更好!!!回帖操作者皆有分,解决问题者不少于50分,不够新开贴继续给!!!!呵呵.............各位高手也许不在乎分数,这只代表本人诚意感激。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 将Bmp文件读取进来,放进一个字符串数组bmpBuffer,将Txt也读进来,放进一个字符串数组txtBufferCreateFile新建一个文件,开头存放2个Buffer即将存放的位移和长度,假设bmpBuffer长度为1023,txtBuffer长度为200在文件开头几个地方记录下来,然后开始写读取的时候从指定的位移读取出对应长度的Buffer,分别写成2个CMemFile,然后读取显示么 一种简便的方法,就是直接把读入的文本,写到bmp数据的结尾处,读入时,计算bmp结尾处,再从结尾处读入文本.CFile file;if (!file.Open(strFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)){ MessageBox(_T("不能写bmp文件! \n") + m_strBmpDesDir); return FALSE;}// 32位增强型真彩色位图file.Write(&bmfh, sizeof(BITMAPFILEHEADER));file.Write(&bmih, sizeof(BITMAPINFOHEADER));file.Write(pBmpData, bmpDataSize);// 写入文本file.Write(pStrBuf, strBufSize);file.Close(); 如果想保密 可以把 txt 文件写入 bmp操作思想:1. bmp 复制+重命名 或者 读写到另一文件2. fopen "rb+"打开 新的bmp文件 把txt文件 写到bmp文件 从第 55字节开始的 地位3. 注意:代价是 bmp数据区 改变了 但效果肉眼感觉不到 且 bmp 只能保存本身大小 一半 的txt文件 这个我发过一个帖子 就是说文件合成的问题. 你在csdn上可以看到, 我的资源里有那个demo..帖子里有实现思路. 你也可以参考www.codeproject.com上的CFileTar, 你的问题是什么?文件读写这个应该没有问题吧?可能有一个难点就是在内存数据中怎样装载bmp文件吧?给你一个函数参考一下HBITMAP GetBitmapFromBuffer(BYTE* pBmpData){ if ( pBmpData == NULL ) { return NULL; } BITMAPFILEHEADER bmpHeader; //位图头结构 DWORD dwHeaderLen = sizeof(BITMAPFILEHEADER); memcpy( &bmpHeader, pBmpData, dwHeaderLen ); if( bmpHeader.bfType != 0x4D42 ) // "BM" // 设置位图文件头 { ASSERT( FALSE ); return NULL; } BITMAPINFOHEADER &bmpInfoHead = *(LPBITMAPINFOHEADER)(pBmpData+dwHeaderLen); m_wCurBitCount = bmpInfoHead.biBitCount; m_wMaxBitCount = max( m_wCurBitCount, m_wMaxBitCount ); BITMAPINFO &bmpInfo = *(LPBITMAPINFO)(pBmpData+dwHeaderLen); LPVOID pdibbit = pBmpData + ((BITMAPFILEHEADER*)pBmpData)->bfOffBits; CClientDC dc(this); HBITMAP hbitmap = ::CreateDIBitmap(dc.m_hDC, &bmpInfoHead, CBM_INIT, pdibbit, &bmpInfo, DIB_RGB_COLORS); if ( hbitmap == NULL ) { ASSERT( FALSE ); } return hbitmap;} 使用“序列化”方式实现,CArchieve类 Bitmap bmp = new Bitmap(讀取路徑); Rectangle roi = new Rectangle(0,0,bmp.Width,int.Parse(TextBox1.Text)); PixelFormat format = bmp.PixelFormat; Bitmap cloneBitmap = bmp.Clone(roi, format); string[] str = Image.ImageUrl.Split('.'); cloneBitmap.Save(保存路徑(str[0] + "1." + str[1])); 最简单的办法,分别读两个文件入内存然后filemapping里写入文件内容(设置格式),可以如上面3楼说的,长度加偏移再写入新文件就可以了 支持前面的回复 开头固定长度存储两个指针 分别指向BMP以及TXT数据的首部就好了 俺习惯于将所有数据都转为base64编码,然后写成文本格式。 以前没有读写过二进制文件,呵呵....也就读写TXT,ini文之类的........看来高手真的多多呀!!!!还有没有更好的方法......还有没有更加完整的代码......谢谢各位. CFileTar 确实是个不错的东西.看了.谢谢 8 楼 按照文件系统的方法比较好。格式如下:文件1数据的偏移量 文件1的基本信息文件2数据的偏移量 文件2的基本信息文件3数据的偏移量 文件3的基本信息.......文件1实际数据文件2实际数据文件3实际数据.......说明,文件的基本信息至少要能表达文件的数据大小,比如BMP的width、height、colordepth(位深)都是必须的,而txt文件则只需知道大小就行了。 windows多线程 VC6+XP提示找不到IShellFolder2接口 请问用VLC播放器的dll写程序怎样实现录像功能? NTDLL! 7c921230()问题! ado访问设置密码Access数据库问题,急!!!在线等! 要做一个VC界面, 帮看看能不能这样做或是有什么更好的方法. 谢谢 我不知道按了什么,就变成这样,怎么办? 谁有ActiveX的例程或者代码,复杂一点的? 求mp3播放器的源代吗,高分相赠! 有谁知道BoundsChecker6.2 for VC++的序列号或者BoundsChecker6.01软件的下载地址? 指针和COM c++窗口调用问题
CFile file;
if (!file.Open(strFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary))
{
MessageBox(_T("不能写bmp文件! \n") + m_strBmpDesDir);
return FALSE;
}// 32位增强型真彩色位图
file.Write(&bmfh, sizeof(BITMAPFILEHEADER));
file.Write(&bmih, sizeof(BITMAPINFOHEADER));
file.Write(pBmpData, bmpDataSize);
// 写入文本
file.Write(pStrBuf, strBufSize);
file.Close();
操作思想:
1. bmp 复制+重命名 或者 读写到另一文件
2. fopen "rb+"打开 新的bmp文件 把txt文件 写到bmp文件 从第 55字节开始的 地位
3. 注意:代价是 bmp数据区 改变了 但效果肉眼感觉不到 且 bmp 只能保存本身大小 一半 的txt文件
www.codeproject.com上的CFileTar,
给你一个函数参考一下HBITMAP GetBitmapFromBuffer(BYTE* pBmpData)
{
if ( pBmpData == NULL )
{
return NULL;
} BITMAPFILEHEADER bmpHeader; //位图头结构
DWORD dwHeaderLen = sizeof(BITMAPFILEHEADER);
memcpy( &bmpHeader, pBmpData, dwHeaderLen ); if( bmpHeader.bfType != 0x4D42 ) // "BM" // 设置位图文件头
{
ASSERT( FALSE );
return NULL;
}
BITMAPINFOHEADER &bmpInfoHead = *(LPBITMAPINFOHEADER)(pBmpData+dwHeaderLen); m_wCurBitCount = bmpInfoHead.biBitCount;
m_wMaxBitCount = max( m_wCurBitCount, m_wMaxBitCount );
BITMAPINFO &bmpInfo = *(LPBITMAPINFO)(pBmpData+dwHeaderLen);
LPVOID pdibbit = pBmpData + ((BITMAPFILEHEADER*)pBmpData)->bfOffBits;
CClientDC dc(this);
HBITMAP hbitmap = ::CreateDIBitmap(dc.m_hDC, &bmpInfoHead, CBM_INIT, pdibbit, &bmpInfo, DIB_RGB_COLORS); if ( hbitmap == NULL )
{
ASSERT( FALSE );
} return hbitmap;
}
Rectangle roi = new Rectangle(0,0,bmp.Width,int.Parse(TextBox1.Text));
PixelFormat format = bmp.PixelFormat;
Bitmap cloneBitmap = bmp.Clone(roi, format);
string[] str = Image.ImageUrl.Split('.');
cloneBitmap.Save(保存路徑(str[0] + "1." + str[1]));
然后filemapping里写入文件内容(设置格式),可以如上面3楼说的,长度加偏移
再写入新文件就可以了
文件1数据的偏移量 文件1的基本信息
文件2数据的偏移量 文件2的基本信息
文件3数据的偏移量 文件3的基本信息
.......
文件1实际数据
文件2实际数据
文件3实际数据
.......
说明,文件的基本信息至少要能表达文件的数据大小,比如BMP的width、height、colordepth(位深)都是必须的,而txt文件则只需知道大小就行了。