⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpegapp.c

📁 非常不错的jpeg压缩/解压代码,可以实现常用的JPEG压缩/解
💻 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 + -