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语言程序设计有所帮助。