您的位置:首页 > 其它

利用jpeglib把bmp图片转为jpg

2011-12-07 10:33 507 查看
刚开始想不用第三方库写一个jpeg解码,方面以后往单片机或者嵌入式上移植,看起来就几个步骤,可研究了一个礼拜都算不出正常结果,可能自己写的算法损耗太大了,和原来的图像完全不一样。 还是改用jpeglib了,学嵌入式的时候再说。一个最简单的demo:

//开始需要配置一下jpeglib,并make一下生成一下库.

#include <stdio.h>

#include <stdlib.h>

#include <memory.h>

#include <math.h>

#include "bmp.h"

#include "jpeg-8b/jpeglib.h"

#pragma comment( lib , "jpeg-8b/libjpeg.lib" )

char * bmpFileName = "input.bmp";

char * jpgFileName = "output.jpg";

BITMAPFILEHEADER fileHeader;

BITMAPINFOHEADER infoHeader;

long width = 0;

long height = 0;

//=============================================================

unsigned char * RGB_Ptr = NULL;

//=============================================================

long getSize(int hByte,int lByte){

long result = (hByte/16)*(16*16*16);

result += (hByte%16)*(16*16);

result += (lByte/16)*(16);

result += (lByte%16)*(1);

return result;

}

//=====================================================================

int main(){

FILE * f1 = NULL;

FILE * f2 = NULL;

struct jpeg_compress_struct jcs;

struct jpeg_error_mgr jem;

jcs.err = jpeg_std_error(&jem);

jpeg_create_compress(&jcs);

//result.jpg

{

f1=fopen(jpgFileName,"wb");

jpeg_stdio_dest(&jcs, f1);

}

{//读取bmp信息

long biWidth = 0;

long biHeight = 0;

f2 = fopen(bmpFileName,"rb");

if(f2 == NULL){

printf("找不到文件\n");

return 0;

}

memset(&fileHeader, 0, sizeof(fileHeader));

fread(&fileHeader, sizeof(fileHeader), 1, f2);

memset(&infoHeader, 0, sizeof(infoHeader));

fread(&infoHeader, sizeof(infoHeader), 1, f2);

width = getSize(infoHeader.biWidth[1],infoHeader.biWidth[0]);

height = getSize(infoHeader.biHeight[1],infoHeader.biHeight[0]);

printf(" 图片宽度%ld ; 图片长度%ld ;\n",width,height);

fseek(f2, 54, SEEK_SET); //放置指针到像素第一个

//总字节数 = 宽 x 高 x 3 ;

RGB_Ptr = malloc(width*height*3+1);

fread(RGB_Ptr,width*height*3,1,f2);

fclose(f2);

}

{

jcs.image_width = width; //

jcs.image_height = height; //

jcs.input_components = 3; //

jcs.in_color_space = JCS_RGB; //JCS_GRAYSCALE

jpeg_set_defaults(&jcs);

jpeg_set_quality (&jcs, 80, 1);

}

jpeg_start_compress(&jcs, 1);

{

int i=0;

long rgb_index = height * width * 3 - 1;

//===========================================================

//逐行写入RGB_Ptr

JSAMPROW row_pointer[1];

for(i=0;i<height;i++){

int j=0;

unsigned char * lineData = NULL;

lineData = malloc(width*3);

for(j=0;j<width;j++){

lineData[(width-j-1)*3+0] = RGB_Ptr[rgb_index];

rgb_index --;

lineData[(width-j-1)*3+1] = RGB_Ptr[rgb_index];

rgb_index --;

lineData[(width-j-1)*3+2] = RGB_Ptr[rgb_index];

rgb_index --;

}

row_pointer[0] = lineData;

jpeg_write_scanlines(&jcs, row_pointer, 1);

}

/*

JSAMPROW * row_pointer;

rgb_index = 0;

//一次写入

row_pointer = malloc(height*width*3);

for(i=0;i<height;i++){

int j=0;

unsigned char * lineData = NULL;

lineData = malloc(width*3);

for(j=0;j<width;j++){

lineData[j*3+2] = RGB_Ptr[rgb_index];

rgb_index ++;

lineData[j*3+1] = RGB_Ptr[rgb_index];

rgb_index ++;

lineData[j*3+0] = RGB_Ptr[rgb_index];

rgb_index ++;

}

row_pointer[height-i-1] = lineData;

}

jpeg_write_scanlines(&jcs, row_pointer, height);

*/

}

jpeg_finish_compress(&jcs);

jpeg_destroy_compress(&jcs);

fclose(f1);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: