【100分】一个文件读写的问题,读BMP和TXT,然后生成新的文件格式.

hsc456 2009-11-22 07:12:36
各位高手,好久没来提问了,给各位送分来了,请笑纳!!!!

一个文件读写的问题:

读BMP和TXT,然后生成新的文件格式,后缀名就随意啦,

生成新的文件后,要能用程序再次打开,看到里面的BMP图片和文本信息。

请问怎么实现???请详细说明!有代码更好!!!


回帖操作者皆有分,解决问题者不少于50分,不够新开贴继续给!!!!呵呵.............

各位高手也许不在乎分数,这只代表本人诚意感激。
...全文
196 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
漫跑者也 2009-12-02
  • 打赏
  • 举报
回复
按照文件系统的方法比较好。格式如下:
文件1数据的偏移量 文件1的基本信息
文件2数据的偏移量 文件2的基本信息
文件3数据的偏移量 文件3的基本信息
.......
文件1实际数据
文件2实际数据
文件3实际数据
.......


说明,文件的基本信息至少要能表达文件的数据大小,比如BMP的width、height、colordepth(位深)都是必须的,而txt文件则只需知道大小就行了。
y_l_stone 2009-11-23
  • 打赏
  • 举报
回复
最简单的办法,分别读两个文件入内存
然后filemapping里写入文件内容(设置格式),可以如上面3楼说的,长度加偏移
再写入新文件就可以了
yangxxxxxx66 2009-11-23
  • 打赏
  • 举报
回复
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]));
feilinhe 2009-11-23
  • 打赏
  • 举报
回复
使用“序列化”方式实现,CArchieve类
Allen_zhang 2009-11-23
  • 打赏
  • 举报
回复
你的问题是什么?文件读写这个应该没有问题吧?

可能有一个难点就是在内存数据中怎样装载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;
}
muzizongheng 2009-11-23
  • 打赏
  • 举报
回复
这个我发过一个帖子 就是说文件合成的问题. 你在csdn上可以看到, 我的资源里有那个demo..

帖子里有实现思路.

你也可以参考
www.codeproject.com上的CFileTar,
fandh 2009-11-23
  • 打赏
  • 举报
回复
实际上,是不同数据格式混合存储!
楼主在混合的时候,加上关键识别标识,写和读都用即可!
qq14923349 2009-11-23
  • 打赏
  • 举报
回复
注意头格式就行
hsc456 2009-11-23
  • 打赏
  • 举报
回复
CFileTar 确实是个不错的东西.看了.

谢谢 8 楼
hsc456 2009-11-23
  • 打赏
  • 举报
回复
以前没有读写过二进制文件,呵呵....也就读写TXT,ini文之类的........

看来高手真的多多呀!!!!

还有没有更好的方法......

还有没有更加完整的代码......

谢谢各位.
bobob 2009-11-23
  • 打赏
  • 举报
回复
如果你做过文件二进制的读写,就不该问这个问题
用户 昵称 2009-11-23
  • 打赏
  • 举报
回复
俺习惯于将所有数据都转为base64编码,然后写成文本格式。
vann1982 2009-11-23
  • 打赏
  • 举报
回复
支持前面的回复 开头固定长度存储两个指针 分别指向BMP以及TXT数据的首部就好了
jyh_baoding 2009-11-23
  • 打赏
  • 举报
回复
可以试试楼上的意见
田暗星 2009-11-22
  • 打赏
  • 举报
回复
如果想保密 可以把 txt 文件写入 bmp
操作思想:
1. bmp 复制+重命名 或者 读写到另一文件
2. fopen "rb+"打开 新的bmp文件 把txt文件 写到bmp文件 从第 55字节开始的 地位
3. 注意:代价是 bmp数据区 改变了 但效果肉眼感觉不到 且 bmp 只能保存本身大小 一半 的txt文件
river80 2009-11-22
  • 打赏
  • 举报
回复
一种简便的方法,就是直接把读入的文本,写到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();
MoXiaoRab 2009-11-22
  • 打赏
  • 举报
回复
将Bmp文件读取进来,放进一个字符串数组bmpBuffer,将Txt也读进来,放进一个字符串数组txtBuffer

CreateFile新建一个文件,开头存放2个Buffer即将存放的位移和长度,假设bmpBuffer长度为1023,txtBuffer长度为200

在文件开头几个地方记录下来,然后开始写

读取的时候从指定的位移读取出对应长度的Buffer,分别写成2个CMemFile,然后读取显示么
la_feng 2009-11-22
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
up

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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