Chinaunix首页 | 论坛 | 博客
  • 博客访问: 466758
  • 博文数量: 89
  • 博客积分: 1126
  • 博客等级: 少尉
  • 技术积分: 1432
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-11 23:37
文章分类

全部博文(89)

文章存档

2016年(6)

2015年(2)

2014年(1)

2013年(3)

2012年(23)

2011年(54)

分类:

2012-07-03 13:26:58

原文地址:jpeg转bmp 作者:教鱼斿泳

解jpeg压缩用到jpeglib.h库
ubuntu安装jpeglib.h命令为audo apt-get install libjpeg62-dev
 
bmp.h
typedef struct tagBITMAPFILEHEADER
{
 unsigned char bfType[2];
 unsigned char bfSize[4];
 unsigned char bfReserved1[2];
 unsigned char bfReserved2[2];
 unsigned char bfOffBits[4];
}BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
 unsigned char biSize[4];
 unsigned char biWidth[4];
 unsigned char biHeight[4];
 unsigned char biPlanes[2];
 unsigned char biBitCount[2];
 unsigned char biCompression[4];
 unsigned char biSizeImage[4];
 unsigned char biXPelsPerMeter[4];
 unsigned char biYPelsPerMeter[4];
 unsigned char biClrUsed[4];
 unsigned char biClrImportant[4];
}BITMAPINFOHEADER;
 
main.c
#include
#include
#include "bmp.h"
#include
#include
#include
#include
char * jpgFileName = "test.jpg";
char * bmpFileName = "output.bmp";
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;
}
unsigned char * LongToByte(unsigned long value)
{ //用法LongToByte(2359350)[i]);
 unsigned char result[5];
 unsigned long cacheVal = value;
 int i=0;
 char *p;
 for(i=0;i<4;i++)
 {
  result[i]=(unsigned char)(cacheVal%16);
  cacheVal = cacheVal/16;
  result[i]+=(unsigned char)(cacheVal%16)*16;
  cacheVal = cacheVal/16;
 }
  result[4] = '\0';
  p=result;
    return p;
}
int main()
{
  FILE * f1 = NULL;
  FILE * f2 = NULL;
 unsigned char * bmpDataBuffer = NULL;
 struct jpeg_decompress_struct cinfo;
 struct jpeg_error_mgr jerr;
 cinfo.err = jpeg_std_error(&jerr);
 jpeg_create_decompress(&cinfo);
 f1 = fopen(jpgFileName,"rb");
 if(f1 == NULL)
 {
  printf("输入文件未找到!!!\n");
  return 0;
 }
 jpeg_stdio_src(&cinfo,f1);
 jpeg_read_header(&cinfo,1);
 {
  width = cinfo.image_width;
  height = cinfo.image_height;
  if(cinfo.num_components != 3)
  {
   printf("不是彩色图\n");
   return 0;
  }
  printf(" Width: %ld ; Height: %ld ; Components: %d\n",width,height,cinfo.num_components);
 }
 unsigned char *lineData =NULL;
  JSAMPARRAY buffer;
  jpeg_start_decompress(&cinfo);
  bmpDataBuffer = malloc(width*height*3);
  lineData = malloc(width*3);
  buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE,(width*3),1);
  while(cinfo.output_scanline < cinfo.output_height)
  {
   int j=0;
   jpeg_read_scanlines(&cinfo,buffer,1);
   for(j=0;j<(width*3);j++)
   {
    bmpDataBuffer[(height - cinfo.output_scanline)*(width*3)+j] = buffer[0][j+2]; //R
   j++;
   bmpDataBuffer[(height - cinfo.output_scanline)*(width*3)+j] = buffer[0][j]; //G
   j++;
   bmpDataBuffer[(height - cinfo.output_scanline)*(width*3)+j] = buffer[0][j-2]; //B
  }
  }
 jpeg_finish_decompress(&cinfo);
 jpeg_destroy_decompress(&cinfo);
 f2=fopen(bmpFileName,"wb");
 int i=0;
 unsigned long fileSize=0;
 memset(&fileHeader,0,sizeof(fileHeader));
 fileHeader.bfType[0]=0x42;
 fileHeader.bfType[1]=0x4D;
 fileSize=width*height*3+54;
 for(i=0;i<4;i++)
 {
  fileHeader.bfSize[i] = LongToByte(fileSize)[i];
  //printf("%x ",fileHeader.bfSize[i]);
 }
 for(i=0;i<4;i++)
 {
  fileHeader.bfOffBits[i] = LongToByte(54)[i];
 }
 fwrite(&fileHeader,sizeof(fileHeader),1,f2);
 //构建bmp信息头
 for(i=0;i<4;i++)
 {
    infoHeader.biSize[i] = LongToByte(40)[i];
 }
 for(i=0;i<4;i++)
 {
  infoHeader.biWidth[i] = LongToByte(width)[i];
 }
 for(i=0;i<4;i++)
 {
  infoHeader.biHeight[i] = LongToByte(height)[i];
 }
 infoHeader.biPlanes[0] = 0x01;
 infoHeader.biPlanes[1] = 0x00;
 infoHeader.biBitCount[0] = 0x18;
 infoHeader.biBitCount[1] = 0x00;
 for(i=0;i<4;i++)
 {
  infoHeader.biCompression[i] = 0;
 }
 for(i=0;i<4;i++)
 {
  infoHeader.biSizeImage[i] = LongToByte((width*height))[i];
 }
 fwrite(&infoHeader,sizeof(infoHeader),1,f2);
 fwrite(bmpDataBuffer,width*height*3,1,f2);
 fclose(f2);
 
 fclose(f1);
 return 0;
}
编译 gcc main.c -o leaf -ljpeg
阅读(1928) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~