📄 jpegapp.c
字号:
#include "jpegdec.h"
#include <conio.h>
#include <time.h>
char *FileName="image.jpg";
extern char error_string[90];
typedef struct s_BM_header {
WORD BMP_id ; // 'B''M'
DWORD size; // size in bytes of the BMP file
DWORD zero_res; // 0
DWORD offbits; // 54
DWORD biSize; // 0x28
DWORD Width; // X
DWORD Height; // Y
WORD biPlanes; // 1
WORD biBitCount ; // 24
DWORD biCompression; // 0 = BI_RGB
DWORD biSizeImage; // 0
DWORD biXPelsPerMeter; // 0xB40
DWORD biYPelsPerMeter; // 0xB40
DWORD biClrUsed; //0
DWORD biClrImportant; //0
} BM_header;
typedef struct s_RGB {
BYTE B;
BYTE G;
BYTE R;
} RGB;
void exitmessage(char *message)
{
printf("%s\n",message);exit(0);
}
void write_buf_to_BMP(BYTE *im_buffer, WORD X_bitmap, WORD Y_bitmap, char *BMPname)
{
SWORD x,y;
RGB *pixel;
BM_header BH;
FILE *fp_bitmap;
DWORD im_loc_bytes;
BYTE nr_fillingbytes, i;
BYTE zero_byte=0;
fp_bitmap=fopen(BMPname,"wb");
if (fp_bitmap==NULL) exitmessage("File cannot be created");
if (X_bitmap%4!=0) nr_fillingbytes=4-((X_bitmap*3L)%4);
else nr_fillingbytes=0;
BH.BMP_id = 'M'*256+'B'; fwrite(&BH.BMP_id,2,1,fp_bitmap);
BH.size=54+Y_bitmap*(X_bitmap*3+nr_fillingbytes);fwrite(&BH.size,4,1,fp_bitmap);
BH.zero_res = 0; fwrite(&BH.zero_res,4,1,fp_bitmap);
BH.offbits = 54; fwrite(&BH.offbits,4,1,fp_bitmap);
BH.biSize = 0x28; fwrite(&BH.biSize,4,1,fp_bitmap);
BH.Width = X_bitmap; fwrite(&BH.Width,4,1,fp_bitmap);
BH.Height = Y_bitmap; fwrite(&BH.Height,4,1,fp_bitmap);
BH.biPlanes = 1; fwrite(&BH.biPlanes,2,1,fp_bitmap);
BH.biBitCount = 24; fwrite(&BH.biBitCount,2,1,fp_bitmap);
BH.biCompression = 0; fwrite(&BH.biCompression,4,1,fp_bitmap);
BH.biSizeImage = 0; fwrite(&BH.biSizeImage,4,1,fp_bitmap);
BH.biXPelsPerMeter = 0xB40; fwrite(&BH.biXPelsPerMeter,4,1,fp_bitmap);
BH.biYPelsPerMeter = 0xB40; fwrite(&BH.biYPelsPerMeter,4,1,fp_bitmap);
BH.biClrUsed = 0; fwrite(&BH.biClrUsed,4,1,fp_bitmap);
BH.biClrImportant = 0; fwrite(&BH.biClrImportant,4,1,fp_bitmap);
printf("Writing bitmap ...\n");
im_loc_bytes=(DWORD)im_buffer+((DWORD)Y_bitmap-1)*X_bitmap*4;
for (y=0;y<Y_bitmap;y++)
{
for (x=0;x<X_bitmap;x++)
{
pixel=(RGB *)im_loc_bytes;
fwrite(pixel, 3, 1, fp_bitmap);
im_loc_bytes+=4;
}
for (i=0;i<nr_fillingbytes;i++)
fwrite(&zero_byte,1,1,fp_bitmap);
im_loc_bytes-=2L*X_bitmap*4;
}
printf("Done.\n");
fclose(fp_bitmap);
}
void main(int argc, char *argv[])
{
FILE *fp;
DWORD X_image, Y_image;
BYTE *our_image_buffer;
clock_t start_time, finish_time;
float duration;
if (argc<=1) fp=fopen(FileName,"rb");
else fp=fopen(argv[1],"rb");
if (fp==NULL) exitmessage("File not found ?");
if (!load_JPEG_header(fp,&X_image,&Y_image)) {exitmessage(error_string);return;}
fclose(fp);
printf(" X_image = %d\n",X_image);
printf(" Y_image = %d\n",Y_image);
/*
printf("Sampling factors: \n");
printf("Y : H=%d,V=%d\n", YH,YV);
printf("Cb : H=%d,V=%d\n", CbH,CbV);
printf("Cr : H=%d,V=%d\n", CrH,CrV);
printf("Restart markers = %d\n", Restart_markers);
printf("MCU restart = %d\n", MCU_restart);
getch();
*/
printf("Decoding JPEG image...\n");
// main decoder
start_time = clock();
decode_JPEG_image();
printf("Decoding finished.\n");
finish_time = clock();
duration = (double)(finish_time - start_time) / CLK_TCK;
printf( "Time elapsed: %2.1f seconds\n", duration );
if (!get_JPEG_buffer(X_image,Y_image,&our_image_buffer)) {exitmessage(error_string);return;}
write_buf_to_BMP(our_image_buffer,X_image,Y_image, "image.bmp");
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -