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

📄 output.c

📁 jpeg快速算法,用于TI和philips的DSP开发
💻 C
字号:
/*
 *********************************************************************
 * File name: decode.c
 * Version: 5.0(release v1.0)    Date: Jan 12, 2006
 * Author:  xiezm                Email: xiezm@wxintech.cn
 * Company: Wuxi Intech co., ltd.
 *
 * Project: Jpeg Decoder for Trio
 *********************************************************************
 */
#define  OUTPUT_GLOBALS

#include "cf6_chess.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "djpg.h"

#define PUT_2B(array,offset,value)  \
	(array[offset] = (char) ((value) & 0xFF), \
	array[offset+1] = (char) (((value) >> 8) & 0xFF))

#define PUT_4B(array,offset,value)  \
	(array[offset] = (char) ((value) & 0xFF), \
	array[offset+1] = (char) (((value) >> 8) & 0xFF), \
	array[offset+2] = (char) (((value) >> 16) & 0xFF), \
	array[offset+3] = (char) (((value) >> 24) & 0xFF))

int XX, YY;
unsigned char *bmp_pool;
int mcu_in_row;
int mcu;

void output_header(void)
{
	unsigned char bmpfileheader[14];
	unsigned char bmpinfoheader[40];
	unsigned int headersize, bfSize;
	unsigned char bits_per_pixel;
	
	bits_per_pixel = 24;
	YY = (((Y-1)/8)+1)*8;
	XX = (((X-1)/8)+1)*8;
	mcu_in_row = XX / 8 / Hi[0];
	mcu = 0;

	if(NULL == (bmp_pool = (unsigned char *)malloc(YY*XX*3)))
	{
		fprintf(stderr, "can not allocate memory to bmp\n");
		exit(0);
	}

	/* File size */
	headersize = 14 + 40;					/* Header */
	bfSize = headersize + YY * XX * 3;

	/* Set unused fields of header to 0 */
	memset(bmpfileheader, 0, 14);
	memset(bmpinfoheader, 0, 40);

	/* Fill the file header */
	bmpfileheader[0] = 0x42;				/* first 2 bytes are ASCII 'B', 'M' */
	bmpfileheader[1] = 0x4D;

	PUT_4B(bmpfileheader, 2, bfSize);		/* bfSize */
	
	/* we leave bfReserved1 & bfReserved2 = 0 */
	PUT_4B(bmpfileheader, 10, headersize);	/* bfOffBits */

	/* Fill the info header (Microsoft calls this a BITMAPINFOHEADER) */
	PUT_2B(bmpinfoheader, 0, 40);			/* biSize */
	PUT_4B(bmpinfoheader, 4, XX);			/* biWidth */
	PUT_4B(bmpinfoheader, 8, YY);			/* biHeight */
	PUT_2B(bmpinfoheader, 12, 1);			/* biPlanes - must be 1 */
	PUT_2B(bmpinfoheader, 14, bits_per_pixel); /* biBitCount */
	
	/* we leave biCompression = 0, for none */
	/* we leave biSizeImage = 0; this is correct for uncompressed data */
	/* we leave biXPelsPerMeter = 0, for none */
	/* we leave biYPelsPerMeter = 0, for none */
	/* we leave biClrUsed = 0 */
	/* we leave biClrImportant = 0 */

	if (fwrite(bmpfileheader, 1, 14, BMP) != 14)
	{
		fprintf(stderr,"can not write bmp file header\n");
		exit(0);
	}
	if (fwrite(bmpinfoheader, 1, 40, BMP) != 40)
	{
		fprintf(stderr,"can not write bmp info header\n");
		exit(0);
	}
}

void output_mcu(void)
{
	unsigned int v,h,r;
	unsigned int i,j,k;

	unsigned char *mcu_ptr;
	unsigned char *du_ptr;

	//x = (mcu%mcu_in_row)*Hi[0]*8;
	//y = (mcu/mcu_in_row)*Vi[0]*8;
	mcu_ptr = bmp_pool + ((mcu/mcu_in_row)*Vi[0]*8*XX + (mcu%mcu_in_row)*Hi[0]*8)*3;

	for(v=0,r=0;v<Vi[0];v++)
	{
		for(h=0;h<Hi[0];h++,r++)
		{
			du_ptr = mcu_ptr + (v*8*XX + h*8)*3;
			for(k=0,i=0;i<8;i++)
			{
				for(j=0;j<8;j++,k++)
				{
					*du_ptr++ = (unsigned char)(((reconstruc_buffer[r][k]      ) & 0x001f)<<3);
					*du_ptr++ = (unsigned char)(((reconstruc_buffer[r][k] >>  5) & 0x003f)<<2);
					*du_ptr++ = (unsigned char)(((reconstruc_buffer[r][k] >> 11) & 0x001f)<<3);
				}
				du_ptr += ((XX-8)*3);
			}
		}
	}
	mcu++;
}


void write_to_bmp(void)
{
	int i, j;
	unsigned char *line;

	for(i=YY;i>0;)
	{
		line = bmp_pool + (--i)*XX*3;
		for(j=0;j<XX*3;j++)
		{
			fputc(line[j], BMP);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -