怪异的图像转换
来源:互联网 发布:java工厂模式代码 编辑:程序博客网 时间:2024/04/29 06:25
从网上搜到一个Bmp<->jpg 图片相互转换的程序,细看来感觉怪异:
其大致思路为
IplImage *src=cvLoadImage(原图),然后直接修改文件扩展名,如将.jpg 改为.bmp ,然后再 cvSaveImage(改过扩展名后的文件,原图),仅仅是修改一下后缀就可以将这两种文件格式相互转换?不需要考虑压缩编解码的问题?这样与在windows中直接修改扩展名又有何区别?
#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
int main(int argc, char *argv[])
{
system("dir /b jpg > jpglist.txt");
ifstream jpglist("jpglist.txt");
vector<string> jpgName;
string buf;
while(jpglist)
{
if(getline(jpglist,buf))
{
jpgName.push_back(buf);
}
}
jpglist.close();
for(string::size_type i=0;i<jpgName.size();i++)
{
string save_dir="bmp/";
string open_dir="jpg/";
string filename=jpgName[i];
string file_no_ext="";
for(int j=0;j<jpgName[i].length()-4;j++)
{
file_no_ext+=filename[j];
}
file_no_ext.append(".bmp");
IplImage *src=cvLoadImage(open_dir.append(jpgName[i]).c_str());
if(!src)
{
cout<<"can not load the image : "<<jpgName[i]<<endl;
break;
}
cout<<"processing "<<jpgName[i]<<endl;
cvSaveImage(save_dir.append(file_no_ext).c_str(),src);
cvReleaseImage(&src);
src=NULL;
}
system("PAUSE");
return EXIT_SUCCESS;
}
基础知识:
24位bmp是公认最好的图片存储格式,存储了图片所有的信息,每个像素用24位二进制来存储该像素点的图像信息,即3字节。(16位bmp 则是24位的2/3)。如我的图片1.jpg 为1280 pixels *800 pixels,则转换为bmp后,图像大小为1280*800*3 B = 2.92MB(win7下文件大小),原图大小为243KB;
使用上面转换程序,由1.bmp 转换为1.jpg时,图像大小变为327KB。
这中间所经历的变换,应该是由cvSaveImage() 时检测文件后缀时进行了编码器的自适应。(多好用的blackbox 啊)
原理类似于保存视频文件
cvWriteFrame( CvVideoWriter* writer, const IplImage* image )中的 CvVideoWriter
CVAPI(CvVideoWriter*) cvCreateVideoWriter( const char* filename, int fourcc,
double fps, CvSize frame_size,
int is_color CV_DEFAULT(1))
P.S. 当然,如果你仅仅是在windows下修改一下文件后缀,文件大小是不会变的。
dir 的目录范围
dir /b *jpg = dir *jpg /b
- 怪异的图像转换
- 怪异的SQL注入
- 怪异的SQL注入
- 怪异的SQL注入
- 怪异的SQL注入
- 怪异的感觉
- 怪异的问题
- gavinnn,怪异的名字
- 怪异的dhcp
- 删除怪异的表
- 怪异的系统自动关机
- 怪异的switch
- 怪异的insight
- 怪异的楼梯
- 怪异的洗牌
- 怪异的IE - 2
- 怪异的面试题
- 怪异的JavaScript
- C#中用XmlTextReader对象操作XML文件
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- RAII惯用法:C++资源管理的利器
- ARM Linux静态映射分析
- JavaScript验证上传文件格式及大小
- 怪异的图像转换
- ajax GET方式提交,中文参数乱码的问题
- VS 2008 OpenGL 配置
- 修改doc的打开方式重新为word
- QT静态编译
- WinCE中,环境变量的添加,删除和查询以及BSP的快速编译
- 嵌入式软件的开发测试要点
- 高校类网站占了21%
- C#获取显示器分辨率