#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;
}
libjpeg样例
最新推荐文章于 2024-05-26 23:10:11 发布