jpeg转为bmp

#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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值