C语言实现BMP转换JPG的方法
本文实例讲述了C语言实现BMP转换JPG的方法。分享给大家供大家参考。具体实现方法如下:
/**************************************************************************** 名称:jpeg.c 功能:linux下bmp转化为jpeg程序源代码 日期:2010.01.26 注意:编译时加“-ljpeg”(gcc-obmp2jpgjpeg.c-ljpeg) *****************************************************************************/ #include<string.h> #include<sys/types.h> #include<sys/stat.h> #include<sys/ioctl.h> #include<sys/mman.h> #include<linux/videodev.h> #include<fcntl.h> #include<unistd.h> #include<stdio.h> #include<errno.h> #include<stdlib.h> #include<signal.h> #include<sys/timeb.h> #include<jpeglib.h> #defineJPEG_QUALITY95//图片质量 intBmp2Jpg(constchar*bmp_file,constchar*jeg_file,constintwidth,constintheight) { FILE*fd; intret; unsignedchar*data; longsizeImage; intdepth=3; JSAMPROW*row_pointer; longrgb_index=0; inti=0; structjpeg_compress_structcinfo; structjpeg_error_mgrjerr; FILE*outfile; ; //Readbmpimagedata sizeImage=width*height*3; data=(unsignedchar*)malloc(sizeImage); fd=fopen(bmp_file,"rb"); if(!fd) { printf("ERROR1:Cannotopentheimage.\n"); free(data); return-1; } fseek(fd,54,SEEK_SET); ret=fread(data,sizeof(unsignedchar)*sizeImage,1,fd); if(ret==0) { if(ferror(fd)) { printf("\nERROR2:Cannotreadthepixeldata.\n"); free(data); fclose(fd); return-1; } } //ConvertBMPtoJPG cinfo.err=jpeg_std_error(&jerr); //*NowwecaninitializetheJPEGcompressionobject. jpeg_create_compress(&cinfo); if((outfile=fopen(jeg_file,"wb"))==NULL) { fprintf(stderr,"can'topen%s\n",jeg_file); return-1; } jpeg_stdio_dest(&cinfo,outfile); cinfo.image_width=width; //*imagewidthandheight,inpixels cinfo.image_height=height; cinfo.input_components=depth; //*#ofcolorcomponentsperpixel cinfo.in_color_space=JCS_RGB; //*colorspaceofinputimage jpeg_set_defaults(&cinfo); //Nowyoucansetanynon-defaultparametersyouwishto. //Herewejustillustratetheuseofquality(quantizationtable)scaling: jpeg_set_quality(&cinfo,JPEG_QUALITY,TRUE); //*limittobaseline-JPEGvalues jpeg_start_compress(&cinfo,TRUE); //一次写入 intj=0; row_pointer=malloc(height*width*3); char*line[300]; for(i=0;i<height;i++) { unsignedchar*lineData=NULL; lineData=malloc(width*3); line[i]=lineData; for(j=0;j<width;j++) { lineData[j*3+2]=data[rgb_index]; rgb_index++; lineData[j*3+1]=data[rgb_index]; rgb_index++; lineData[j*3+0]=data[rgb_index]; rgb_index++; } row_pointer[height-i-1]=lineData; } jpeg_write_scanlines(&cinfo,row_pointer,height); jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); for(i=0;i<height;i++) { free(line[i]); } free(row_pointer); free(data); fclose(fd); fclose(outfile); return0; }
希望本文所述对大家的C语言程序设计有所帮助。