VC6.0 平台 JPEG 图片读写
- 实验目的
(1)编译 JPEG-8C 参考软件。
(2)学会使用 JPEG-8C 提供的可执行文件进行简单的 JPEG 解压缩。
(3)在 Microsoft Visual C++ 6.0 环境下进行读写 JPEG 格式文件实验,了解并熟悉基本
的 JPEG 文件解压缩和压缩处理方式。 - 实验环境
(1)Windows XP OS
(2)IJG 参考软件 JPEG-8C
(3)Microsoft Visual C++ 6.0 - 实验程序
(1)JPEG 图像的解压缩操作
int read_JPEG_file (char * filename)
{
//定义解压缩过程中使用的 JPEG 结构体对象 cinfo
struct jpeg_decompress_struct cinfo;
//定义一个用于错误处理的结构体对象 jerr
struct jpeg_error_mgr jerr;
FILE * infile;
JSAMPLE * p;
int i;
JSAMPARRAY buffer;
int row_stride;
if ((infile = fopen(filename, "rb")) == NULL) {
fprintf(stderr, "can't open %s\n", filename);
return 0;
}
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, infile);
(void) jpeg_read_header(&cinfo, TRUE);
(void) jpeg_start_decompress(&cinfo);
image_height = cinfo.output_height;
image_width = cinfo.output_width;
row_stride = cinfo.output_width * cinfo.output_components;
buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
image_buffer = (JSAMPLE *) malloc(row_stride*cinfo.output_height);
p=image_buffer;
//记录 image_buffer 的首地址
while (cinfo.output_scanline < cinfo.output_height) {
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
for(i=0;i<row_stride;i++) {p[i]= buffer[0][i];}
p += row_stride;
}
(void) jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 1;
}
(2)JPEG 图像的压缩操作
int write_JPEG_file (char * filename, int quality)
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE * outfile; //目标文件
JSAMPROW row_pointer[1];
int row_stride;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
if ((outfile = fopen(filename, "wb")) == NULL) {
fprintf(stderr, "can't open %s\n", filename);
return 0;
}
(3) 应用上述函数进行解压缩操作
#include <stdio.h>
#include <stdlib.h>
extern "C"
{
#include "jpeglib.h"
}
JSAMPLE * image_buffer;
//JSAMPLE==unsigned char
int image_height;
int image_width;
int read_JPEG_file (char * filename) ;
//声明读 JPG 文件函数
int write_JPEG_file (char * filename, int quality) ;
//声明写 JPG 文件函数
int main(int argc, char *argv[])
{
int flag;
int Q;
if (argc != 3)
{
printf("Command Error!\n");
return -1;
}
printf("Hello,this is a JPEG code and decode program!\n");
printf("The input file's name is %s \n",argv[1]);
printf("The output file's name is %s \n",argv[2]);
flag = read_JPEG_file (argv[1]);
if(flag==0)
{
printf("向内存中读入 jpg 文件失败!\n");
return -1;
}
printf("向内存中读入 jpg 文件成功!\n");
printf("输入图像压缩比 Q:");
scanf("%d",&Q);
flag = write_JPEG_file (argv[2], Q);
if(flag==0)
{
printf("向磁盘中写入 jpg 文件失败!\n");
return -1;
}
printf("向磁盘中写入 jpg 文件成功!\n");
free(image_buffer);
return 0;
}
4,实验结果
5,实验总结
通过这次实验,简单的了解并应用了JPEG-8C 参考软件,并且利用这个软件成功完成了实验。
学会使用 JPEG-8C 提供的可执行文件进行简单的 JPEG 解压缩,在 Microsoft Visual C++ 6.0 环境下进行读写 JPEG 格式文件实验。进一步加强了在不同环境与方式的图片读写能力。