函数fopen的参数”w”与”wb”在图像处理中引发的问题
来源:互联网 发布:微信商城模板源码 编辑:程序博客网 时间:2024/05/24 11:14
函数fopen的参数”w”与”wb”在图像处理中引发的问题
函数fopen是一个标准c函数,其功能是打开一个文件,之后便可以进行读或写的操作.其原型是这样的:
FILE *fopen( const char *filename, const char *mode );
第一个参数是要打开文件的名字(路径),第二个参数是打开文件所用的模式.对于模式参数的”w”和”wb”,”r”和”rb”,我起初并不是很理解,按照课本上的说法,”w”是以文本的形式进行写入,而”wb”是以二进制模式进行写入.这样的解释令人感觉有点玄乎,不能准确理解.
最近写了一个小程序用从文本中读取数据,进行一定处理后转换为位图图像.数据格式大概是这样:
0.005 0.083 0.083 0.078 0.078 0.044 0.049 0.049 0.044 0.044 0.044 0.039 0.034 0.039 0.034 0.029 0.029 0.034 0.029 0.029 0.029 0.020 0.015 0.005 0.000 0.005 0.000 0.010…
经过处理后得到的图像大概是这样的:
.
而令我感到很奇怪的是,我同学用几乎和我差不多的代码得出的图像颜色上却有很大不同:
显然,初衷是显示256色的灰度图,而他得出的图形却是偏绿的,有点奇怪.仔细想想,之所以会呈现绿色,应该跟调色板有关系,估计是色调的映射出了点问题.而调色板的初始化我们都是这么写的:
for( int i=0;i<256;i++ )
{
m_pRGBQuad[i].rgbBlue= i;
m_pRGBQuad[i].rgbGreen = i;
m_pRGBQuad[i].rgbRed = i;
m_pRGBQuad[i].rgbReserved = 0;
}
从其初始化来看,应该是没有问题的,那问题出在哪里呢?
于是我用ultraedit打开了两幅图像,发现它们的前五行都是一样的,而第二幅图第六行是这样的:
00000050h: 06 00 07 07 07 00 08 08 08 00 09 09 09 00 0D
00000060h: 0D
第一幅图:
00000050h: 06 00 07 07 07 00 08 08 08 00 09 09 09 00
00000060h:
可以很清楚的看到,第一幅图的3个
那么,是什么原因造成这样的差异呢?几经调试之后,终于发现是fopen的参数引起的.如果这么写
fpOut = fopen( strOut, "wb" );
可以得到正常的图像,而
fpOut = fopen( strOut, "w" );
得到的就是绿色的图像.看来是参数”w”和”wb”造成的差异.为什么呢?让我们看看msdn的描述:
b Open in binary (untranslated) mode; translations involving carriage-return and linefeed characters are suppressed.
If t or b is not given in mode, the default translation mode is defined by the global variable _fmode. If t or b is prefixed to the argument, the function fails and returns NULL.
原来,如果有参数b,是以二进制方式打开,这种方式不会进行”回车符”和”换行符”的转换.而如果没有b,即单以”w”为参数的话,系统就把换行符
至此,总算是弄明白了所谓二进制打开和文本打开的区别,真晕.-.-b
所以,以后进行数据处理时要小心了,当然,如果你已经不用fopen那估计就万事大吉,这篇文章算是白看了,呵呵~
- 函数fopen的参数”w”与”wb”在图像处理中引发的问题
- 函数fopen的参数”w”与”wb”的区别
- fopen中w和wb的区别
- fopen 参数的意义 w wb r rb
- fopen里的wb和w的区别即fwrite的返回值与实际文件大小不一致的问题
- c语言处理fopen(path,"wb")的路径转换问题
- fopen中w w+ wb区别:
- fopen中w w+ wb区别:
- fopen中w w+ wb区别
- 在windows下使用fopen的wb和w的区别
- fopen w 和wb
- fopen w wb mode
- C\C++中 fopen中w w+ wb区别:
- C\C++中 fopen中w w+ wb区别
- fopen()中w 和w+的区别
- fopen()中w 和w+的区别
- fread "rb"与"r","wb","w"的区别
- fread "rb"与"r","wb","w"的区别
- JBuilder2006与WebLogic8.1建立J2EE开发环境
- Mysql随机修改记录,用于随机抽奖程序
- 今天真的好难得啊!CSDN验证号是88888
- 移除starteam对visual studio2005项目的绑定
- 祝我生日快樂!
- 函数fopen的参数”w”与”wb”在图像处理中引发的问题
- 我的所有知识都来自大富翁游戏
- .NET 面试题集
- 求教各位大虾,用jBuider2006打包的.exe文件为何不能执行?
- 小写金额转为大写
- 人脉第一:高燃
- sql分段分组
- [Python]private and public
- .NET下使用DataAdapter保存数据时,如何生成command语句及使用事务