#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
#include "bmp.h"
#include "jpeg-8b/jpeglib.h"
#include <setjmp.h>
#pragma comment( lib , "jpeg-8b/libjpeg.lib" )
char * jpgFileName = "input.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;
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';
return result;
}
//=====================================================================
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: %d ; Height: %d ; 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");
{ //构建bmp头
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];
}
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);
//printf("\nfileSize: %d \n",fileSize);
}
fclose(f1);
return 0;
}