社区
游戏开发
帖子详情
请问哪里有JPEG图象压缩算法的C源码?
arlisto
2001-11-22 10:22:59
...全文
1566
44
打赏
收藏
请问哪里有JPEG图象压缩算法的C源码?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
44 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
supersusheng
2002-07-19
打赏
举报
回复
插入书签
atm2001
2002-07-18
打赏
举报
回复
在VC中编程显示一幅位图,下列步骤是不可缺少的: 装入位图、获得位图的大小信息、启用设备环境、位传输等,所需的程序代码一般比较冗长而且复杂。如果想将装入的位图另存为其他格式的图像文件,代码就更长了。这一切都是因为GDI本身的局限性造成的。
GDI+技术
随着Windows 2000的推出,上述情况有了极大的改观: 程序员不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序,这一切全都依赖于Windows 2000及后继版中所使用的GDI+技术。
和传统的GDI不同,GDI+中引入了对COM(组件对象模型)技术的支持,通过COM技术,GDI+简化了对图像文件的访问(打开、保存)。它是通过调用COM组件来实现的,GDI+扮演的只是指挥者,而非操作员。对于图像文件,GDI+所关心的不是图像文件的文件头信息,不论要打开的文件格式是什么类型,GDI+首先要做的是在注册表中查看该图像格式的编码(或解码)信息是否已经注册(HKEY_CLASSES_ROOT\MIME\Database\Content Type)。如果已经注册,就通过该编码信息调用COM组件,就这么简单。这种技术早就在微软的其他软件中使用了(如IE)。“体验”过Nimda病毒的朋友可能对“audio/wav”这段代码并不陌生,Nimda就是靠它来伪装自己的:让IE认为附件是WAV文件而自动打开可执行程序,这其实也是IE使用COM技术的一个突出表现。
配合GDI+的推出,微软也同时发布了相应的SDK,如果已经安装了最新的Microsoft PlatForm SDK或已经开始使用VS.NET,GDI+的SDK就已经在系统中了。如果没有的话,可以到http: //noner.top263.net/progtool上去下载GDI+的头文件和库文件。有了GDI+之后,只需简单地创建一个图形对象(Graphics object),然后直接调用该对象的方法(methods)进行绘图即可。图形对象是GDI+中的核心,正如DC之于GDI那样。图形对象和DC有许多相似的地方,在使用上遵循着相同的使用规则,但是两者在本质上已经有很大的区别。一个是基于句柄的GDI,一个是基于组件对象模型的GDI+。使用GDI+的SDK编程,必须按照下面的规范来进行:使用GDI+的命名空间(namespace Gdiplus),在使用GDI+函数时必须进行GDI+的初始化,使用完毕要销毁GDI+,这些规范在下面所列的程序中有详细的说明。
访问注册表编码信息
上面说到GDI+是通过在注册表中查看编码信息来访问图像文件的,在GDI+的SDK中,编码信息是存储在 ImageCodecInfo类中的,在这个类中,有编码的CLSID(COM组件的GUID标识码)、编码方式描述等。对于GDI,在注册表中访问编码信息通常使用以下两个函数来实现:
1. 查看系统中可用的图像编码信息(数量及大小)
Status GetImageEncodersSize(
UINT* numEncoders,
//存储编码器数量的地址
UINT* size //存储编码信息所需内存大小
);
2. 得到所有的编码信息
Status GetImageEncoders(
UINT numEncoders,//可用编码器数量
UINT size,//存储编码器信息所需内存(由ImageCodecInfo类组成的数组的大小)
ImageCodecInfo* encoders//编码器信息指针
);
在GetImageEncoders函数中,参数numEncoders和size都是由GetImageEncodersSize返回的。下面的代码在注册表中查找具体格式图像的编码方式:
int GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
{ //得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在pCLSID中
UINT num = 0;
UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return FALSE; // 编码信息不可用
//分配内存
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return FALSE; // 分配失败
//获得系统中可用的编码方式的所有信息
GetImageEncoders(num, size, pImageCodecInfo);
//在可用编码信息中查找format格式是否被支持
for(UINT i = 0; i < num; ++i)
{ //MimeType:编码方式的具体描述
if( wcscmp(pImageCodecInfo[i]
.MimeType, format) == 0 )
{
*pCLSID = pImageCodecInfo[i]
.Clsid;
free(pImageCodecInfo);
return TRUE;
}
}
free(pImageCodecInfo);
return FALSE;
}
实现多格式的图像浏览和转换
有了前面的知识,实现多格式的图像的浏览与转换就不是什么难事了。
1.在VC中创建一个SDI项目ImageShow,对GDI+声明和初始化及销毁进行代码编制,具体代码如下:
#include “Gdiplus.h”
using namespace Gdiplus;
CImageShowView::CImageShowView()
{
//初始化GDI+
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
}
CImageShowView::~CImageShowView()
{
//销毁GDI+
ULONG_PTR gdiplusToken;
GdiplusShutdown(gdiplusToken);
}
2. 通过类向导(Class Wizard),重载“文件”菜单中的“打开”和“另存为”两项。为了编程的简单,本程序只将当前打开的图像文件直接存为BMP文件(实际上保存为其他格式的文件也很简单,只不过是对文件名进行分析而已)。另外,为了在打开和保存文件时进行文件名的传递,还应在CImageShowView类中加入一全局变量“CString strOpenFileName”。“打开”和“另存为”两菜单的对应代码如下:
WCHAR* ToWChar(char * str)
{
//在GDI+中,有关字符的参数类型全部都是WCHAR类型
//该函数是将传统字符串进行转换
static WCHAR buffer[1024];
wcsset(buffer,0);
MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);
return buffer;
}
void CImageShowView::OnFileOpen()
{
//本程序能够打开各类常见格式的图像文件 static char szFilter[]=“常见格式图像文件(*.*)|*.*|”;
CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter);
if(dlgChoseImage.DoModal()==IDOK)
{
strOpenFileName=dlgChoseImage
.GetPathName();
//打开文件后立即在窗口中显示(重绘客户窗口)
this->Invalidate();
}
}
void CImageShowView::OnFileSaveAs()
{
if(strOpenFileName.IsEmpty())
{
AfxMessageBox(“当前没有打开图像文件,不能进行保存!”);
return;
}
//建立图形对象
Graphics graphics(GetDC()->m_hDC);
//装入当前已经打开的图像文件
Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())));
CString strFileSave;
//将其他格式的图像全部另存为BMP文件
static char szFilter[]=“位图(*.BMP)|*.BMP|”;
CFileDialog dlgChoseImage(0,“BMP”,NULL,NULL,szFilter);
if(dlgChoseImage.DoModal()==IDOK)
{
strFileSave=dlgChoseImage.GetPathName();
CLSID clsid;
if(GetImageCLSID(L“image/bmp”,&clsid))
{
image.Save(ToWChar(strFileSave.GetBuffer(strFileSave.GetLength())), &clsid, NULL);
//将保存后的图像进行显示
strOpenFileName=strFileSave;
this->Invalidate();
}
}
}
3.为了浏览图像转换前后的效果,还应该在窗口中分别绘制转换前后的图像,这需要在OnDraw函数中添加绘制代码,如下所示:
void CImageShowView::OnDraw(CDC* pDC)
{
CImageShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//如果没有选择显示图像文件,则不用重绘
if(strOpenFileName.IsEmpty())
return;
//显示当前打开的图像文件的全名
this->GetParent()->SetWindowText(strOpenFileName);
//建立图像对象
Graphics graphics(pDC->m_hDC);
//装入图形文件
Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())));
Point destPoints[3] =
{
Point(0, 0),
Point(image.GetWidth(), 0),
Point(0, image.GetHeight())
};
Point* pdestPoints = destPoints;
//在指定区域pdestPoints显示图像
graphics.DrawImage(&image, pdestPoints, 3);
}
在编译上面的程序之前,应该将Gdiplus.lib文件连编到项目中去,否则将会出现“LINK 2001”编译错误。上述程序在Visual Studio 6.0、Windows 2000/XP下调试通过,它能够显示或转换的图像格式有BMP、GIF、JPEG、Exif、PNG、TIFF、ICON、WMF、EMF等等。
星光依旧灿烂
2002-02-20
打赏
举报
回复
能否给我jpeg的c++原代码,谢谢
xing_star@sina.com
dluangel
2002-01-28
打赏
举报
回复
to:SaintNiya(来自远方)
可以给我一份吗?多谢!
lindamini@21cn.com
dluangel
2002-01-28
打赏
举报
回复
楼上的,我也要一份,多谢了!急盼,马上要交差了!
lindamini@21cn.com
SuYang1999
2002-01-27
打赏
举报
回复
楼上的,我也要一分
FENGER9991@SINA.COM
FaZeng
2002-01-26
打赏
举报
回复
樓上的兄弟, 可否也給小弟來一份....先謝了
FaZeng@ms8.url.com.tw
xuweixxxx
2002-01-24
打赏
举报
回复
hate_cry(孤鸿):
JPEG2000的源码给我一份,谢谢!
麻烦你给我一些关于图象格式以及处理的相关资料,我的毕业设计要用!
谢谢你了!
我的e_mail flyxu1980@263.net
sungirlzhx
2002-01-24
打赏
举报
回复
楼上的,大家都是好朋友,jpg的原码请给我一份。
annie1231@263x.com或sungirlzhx@sohu.com
雷欧海特
2002-01-23
打赏
举报
回复
我已经把J2K源码放在网上了,你们可以到
http://go7.163.com/andylee/c++prog/src.zip下载!!!
jixixiaofeng
2002-01-23
打赏
举报
回复
234
wqyuwss
2002-01-23
打赏
举报
回复
ququshb(忘求了),可是Intel jpeg Library做不了jpeg2000
ringphone(临风) ,校园网不是可以用代理的么?
SaintNiya(来自远方) ,你知道那个人的联系方法么?
SaintNiya
2002-01-23
打赏
举报
回复
jpeg主页上有他的email
ququshb
2002-01-22
打赏
举报
回复
同意楼上,使用Intel jpeg Library..方便实用。
ringphone
2002-01-21
打赏
举报
回复
wangqiqi(Venom):
你提供的那个站点在国外,我是教育网,上不去,能给我发一份吗?
ringphone@sina.com
wzpx2001
2002-01-20
打赏
举报
回复
能不能给俺发一个,本人正在研究
wzpx@263.net
sphinxly
2002-01-18
打赏
举报
回复
谢谢,我也要一份吧
email sphinxly@sohu.com
SaintNiya
2002-01-18
打赏
举报
回复
jpeg2k看不懂得说,现在工作了琐事天天作不完.没有时间再去看wavelet之类的东东给自己充电.
(在政府机关工作就是好,看看报纸喝喝茶,看到老爷大人磕磕头,做事一点都不用动脑子,爽啊)
图形学的东东只是大学时的个人爱好罢了.我学的也不是计算机.
还有一点,jpeg2k目前还仅仅只是一个标准,工程应用中的东西名堂还多着呢.国内现在好像
有很多人在搞应用,现在连后缀名都没有统一的说.听说t大就有几个教研室在搞.
另外,jpeg在p大有一个联络人,想要标准或想加入jpeg,找他看看.
一大梨
2002-01-17
打赏
举报
回复
楼上的兄弟,也给我一分吧,我很感兴趣。
honlin2000@21cn.com
wuy
2002-01-17
打赏
举报
回复
hate_cry(孤鸿):
JPEG2000的源码给我一份,谢谢!
ywugy@sina.com
加载更多回复(24)
MATLAB实现
JPEG
压缩算法
程序
源码
.zip
MATLAB实现
JPEG
压缩算法
程序
源码
。MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
MATLAB实现
JPEG
压缩算法
程序
源码
图像
压缩算法
JPEG
源代码实现(C语言)
用C/C++语言实现了
JPEG
图像
压缩算法
有关图像
jpeg
压缩算法
介绍及其
源码
有关图像
jpeg
压缩算法
介绍及其
源码
有关图像
jpeg
压缩算法
介绍及其
源码
JPEG
图像压缩c语言算法
JPEG
图像
压缩算法
.rar\有关图像
jpeg
压缩算法
介绍及其
源码
jbig图像
压缩算法
源码
JBIG是一种无损图像的压缩标准, JBIG(Joint Bi-level Image Experts Group,联合二值图像专家组)是发布二值图像编码标准的专家组。在官方来说,JBIG是ISO/IEC JTC1 SC29工作组1,这个工作组也负责
JPEG
标准,它是一套
压缩算法
,用来产生Web浏览器支持的以及典型地用于复杂图像(例如照片)的图像文件。
游戏开发
8,303
社区成员
23,682
社区内容
发帖
与我相关
我的任务
游戏开发
游戏开发相关内容讨论专区
复制链接
扫一扫
分享
社区描述
游戏开发相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章