jpeg转bmp

原创 2016年08月31日 12:08:16
解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
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(1001) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
版权声明:本文为博主原创文章,转载请注明出处。

jpeg转bmp实现c代码

#include #include #include #pragma pack(1) #define M_SOF0 0xc0 #define M_DHT 0xc4 #define M_E...
  • oHanTanYanYing
  • oHanTanYanYing
  • 2015年03月30日 18:48
  • 2282

RGB数据转bmp、jpeg格式

最近在做身份证读头读取数据,但疼的第三方只给了个so
  • lushengchu2003
  • lushengchu2003
  • 2014年09月09日 14:09
  • 3610

MFC中将bmp格式图片改为Jpeg格式图片的简单方法

这是从最近写的一个图像采集软件中取出来的代码片段:     CString fnBmp = FileName + ".bmp";                            //指定了bmp...
  • hailongchang
  • hailongchang
  • 2008年04月02日 12:22
  • 2556

BMP转JPG(法一)使用jpeglib库实现bmp转jpg

一、vc编译jpeglib库 1、下载源代码 下载地址:http://www.ijg.org/。注意:一定要下载win32 版本 2、编译源代码.     A、解压源代码,修改源代码中jcon...
  • chenyujing1234
  • chenyujing1234
  • 2012年07月11日 15:03
  • 9212

GDI+ BMP转JPG

自己封装的一个函数: /** @name Bmp2Jpg @brief BMP转JPG @param[in] PBYTE pbBmp @param[in] ...
  • friendan
  • friendan
  • 2014年12月26日 13:54
  • 2385

使用libjpeg库将bmp图片压缩成jpg

在进行图片压缩编程之前必须先移植第三方库libjpeg
  • cjj717938588
  • cjj717938588
  • 2014年07月03日 18:03
  • 3032

libjpeg-turbo使用实例(编解码jpeg、jpg转bmp、bmp转jpg代码)

libjpeg-turbo库用于jpeg图像编解码,上一节说了编译过程:编译libjpeg-turbo 。现在说说jpeg的编码、解码使用方法。 Windows上GDI接口支持的都是位图格式(DDB\...
  • mfcing
  • mfcing
  • 2016年09月23日 22:12
  • 5997

在C#中将.bmp转为.jpg格式的方法

在C#中将.bmp转为.jpg格式的函数或类是什么,以及jpg文件的压缩函数--------------------------------------------------------------...
  • HenryGo
  • HenryGo
  • 2006年10月19日 23:06
  • 1133

一个非常简单的opencv实现bmp,jpeg格式转化的代码

一个简单的利用opencv实现bmp,jpeg格式相互转化的代码。非常的简单,仅供参考:#include #include #include #include #include using names...
  • zhxin999
  • zhxin999
  • 2010年04月30日 17:27
  • 6309

delphi中Bmp转Jpeg JPG转BMP

;----Bmp转Jpeg----- uses Jpeg;procedure TForm1.Button1Click(Sender: TObject);VarJpg : TJpegImage;BMP ...
  • xjq2003
  • xjq2003
  • 2007年07月21日 03:25
  • 16033
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jpeg转bmp
举报原因:
原因补充:

(最多只允许输入30个字)