VC6.0 平台 JPEG 图片读写实验

VC6.0 平台 JPEG 图片读写

  1. 实验目的
    (1)编译 JPEG-8C 参考软件。
    (2)学会使用 JPEG-8C 提供的可执行文件进行简单的 JPEG 解压缩。
    (3)在 Microsoft Visual C++ 6.0 环境下进行读写 JPEG 格式文件实验,了解并熟悉基本
    的 JPEG 文件解压缩和压缩处理方式。
  2. 实验环境
    (1)Windows XP OS
    (2)IJG 参考软件 JPEG-8C
    (3)Microsoft Visual C++ 6.0
  3. 实验程序
    (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 格式文件实验。进一步加强了在不同环境与方式的图片读写能力。

猜你喜欢

转载自blog.csdn.net/escFAJ/article/details/107697946