关于将处理图像保存为JPEG格式的问题

richiessh 2012-09-14 06:43:17
我在网上看了一篇关于将图像保存为JPEG格式的文章具体如下:
IJG JPEG Library就是jpeg压缩库,是以源码的形式提供给软件开发人员的,当然在软件包里也有编译好的库文件,我们这里就只用到其中的libjpeg.lib,jconfig.h,jmorecfg.h,jpeglib.h这几个文件

一、建立编译环境

  所谓建立编译环境,其实非常简单,就是把上面提到的4个文件拷贝到你的项目文件夹下,把libjpeg.lib添加到你的项目中,然后在你完成压缩功能的那个文件里加入#include "jpeglib.h",需要注意的是,libjpeg.lib是用c语言开发的,如果要用在你的C++程序里,需要用到extern "C",如下:

// TestLibjpeg.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "memory.h"
extern "C" {
#include "jpeglib.h"
}

  二、压缩步骤

  1、申请并初始化jpeg压缩对象,同时要指定错误处理器

struct jpeg_compress_struct jcs;

// 声明错误处理器,并赋值给jcs.err域
struct jpeg_error_mgr jem;
jcs.err = jpeg_std_error(&jem);

jpeg_create_compress(&jcs);

  2、指定压缩后的图像所存放的目标文件,注意,目标文件应以二进制模式打开

f=fopen("03.jpg","wb");
if (f==NULL)
{
delete [] data;
delete [] pDataConv;
return 0;
}
jpeg_stdio_dest(&jcs, f);

  3、设置压缩参数,主要参数有图像宽、高、色彩通道数(1:索引图像,3:其他),色彩空间(JCS_GRAYSCALE表示灰度图,JCS_RGB表示彩色图像),压缩质量等,如下:

jcs.image_width = nWidth; // 为图的宽和高,单位为像素
jcs.image_height = nHeight;
jcs.input_components = 1; // 在此为1,表示灰度图, 如果是彩色位图,则为3
jcs.in_color_space = JCS_GRAYSCALE; //JCS_GRAYSCALE表示灰度图,JCS_RGB表示彩色图像

jpeg_set_defaults(&jcs);
jpeg_set_quality (&jcs, 80, true);

需要注意的是,jpeg_set_defaults函数一定要等设置好图像宽、高、色彩通道数计色彩空间四个参数后才能调用,因为这个函数要用到这四个值,调用jpeg_set_defaults函数后,jpeglib库采用默认的设置对图像进行压缩,如果需要改变设置,如压缩质量,调用这个函数后,可以调用其它设置函数,如jpeg_set_quality函数。其实图像压缩时有好多参数可以设置,但大部分我们都用不着设置,只需调用jpeg_set_defaults函数值为默认值即可。

  4、上面的工作准备完成后,就可以压缩了,压缩过程非常简单,首先调用jpeg_start_compress,然后可以对每一行进行压缩,也可以对若干行进行压缩,甚至可以对整个的图像进行一次压缩,压缩完成后,记得要调用jpeg_finish_compress函数,如下:

jpeg_start_compress(&jcs, TRUE);

JSAMPROW row_pointer[1]; // 一行位图
int row_stride; // 每一行的字节数

row_stride = jcs.image_width; // 如果不是索引图,此处需要乘以3

// 对每一行进行压缩
while (jcs.next_scanline < jcs.image_height) {
row_pointer[0] = & pDataConv[jcs.next_scanline * row_stride];
jpeg_write_scanlines(&jcs, row_pointer, 1);
}

jpeg_finish_compress(&jcs);

  5、最后就是释放压缩工作过程中所申请的资源了,主要就是jpeg压缩对象,由于在本例中我是直接用的局部变量,所以只需调用jpeg_destroy_compress这个函数即可,如下:

jpeg_destroy_compress(&jcs);

我将其嵌入到我的程序中,编译的时候会报错,提示找不到LIBC.lib文件,但是我在网上搜过也找不到该文件。现在不知道该怎么办。想问一下有没有别的方法使用C++完成对图像JPEG格式的保存,或者哪位能给我提供个LIBC.lib的文件,万分感谢!!!
...全文
332 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
richiessh 2012-09-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

我之前刚做过jpeg压缩的程序,你要的话我给你
[/Quote]

能发给我嘛?谢谢了 我的邮箱是305368722@sina.com
辰岡墨竹 2012-09-17
  • 打赏
  • 举报
回复
CImage是相对简单的,一般情况下足够了,因为它用的是Windows的GDI+功能,所以无需额外的库。如果你对JPEG的额外信息或者压缩率有需求,去下载那个ZIP版本的完整LIBJPEG,http://www.ijg.org/,应该是可以在VS下用的。
miliggate 2012-09-16
  • 打赏
  • 举报
回复
一楼说的对啊
CImage img;
img.load(图片文档)
img.save()直接保存成jpeg
如果你的图片是动态生成的
img.attach(这个图片的HBITMAP,或者用CDC的BitBlt把图片画到Img里面)
img.save
Eleven 2012-09-16
  • 打赏
  • 举报
回复
Cximage也可以~
a1875566250 2012-09-16
  • 打赏
  • 举报
回复
用gdi+把。。。
j-k 2012-09-16
  • 打赏
  • 举报
回复
我之前刚做过jpeg压缩的程序,你要的话我给你
傻X 2012-09-14
  • 打赏
  • 举报
回复
有了这个
只要Load图片,然后Save就结束了,转化好了
傻X 2012-09-14
  • 打赏
  • 举报
回复
#include <atlimage.h>
这里面就有CImage
有个Save的方法

看MSDN
Save
richiessh 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

CImage不能转化么??
前任CXImage就可以哎
[/Quote]

能说得详细点嘛? 我也是初次弄这个,网上找了个算法,但是用2010编译就是说找不到LIBC.lib,你说的这个具体怎么使用啊
傻X 2012-09-14
  • 打赏
  • 举报
回复
CImage不能转化么??
前任CXImage就可以哎
richiessh 2012-09-14
  • 打赏
  • 举报
回复
忘记说了,我用的是Visual Studio 2010~~

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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