利用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;
}
//开始需要配置一下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;
}
相关文章推荐
- php 将bmp图片转为jpg等其他任意格式的图片
- 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片
- php 将bmp图片转为jpg等其他任意格式的图片
- 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片的两个函数
- php 将bmp图片转为jpg等其他任意格式的图片
- 如何加载显示jpg ,png bmp等图片,利用CImage
- php 将bmp图片转为jpg等其他任意格式的图片
- 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片的两个函数
- 利用 GetModuleFileName获取exe文件路径,,以显示bmp, jpg, png图片
- 怎样在CSDN博客中使用程序结果的截图和win7自带的画图工具:可以将jpg图片转为bmp位图。win7的截图工具和绘图工具在哪?
- bmp 转为jpg
- C#将wbmp格式图片转为jpg的图片
- 利用FFmpeg将Jpeg图片转为任意视频容器格式
- 如何将jpg,bmp等普通图片转成层次分明的二值图片(非仅用阈值分割)
- WTL基础: 显示图片(JPG, BMP, PNG, TIF等)
- 获取图片宽度和高度的类,支持JPG,GIF,PNG,BMP
- 图片转换,把bmp图片转换为jpg图片
- gif、bmp、jpg、jpeg图片有什么区别
- 将 bmp 转为jpg
- VC实现打开BMP JPG或GIF图片(二)|VC/MFC/打开图片