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

📄 decolor.c

📁 JPEG解压软件,包含PC端的测试程序,程序结构比较清晰
💻 C
字号:

#include "decolor.h"


#ifndef OUTPUT_ORDER_BGR
#define ColorChange(addrS,addrT) {\
		Y				= pYBuf[addrS] ;\
		pCbCoe			= COE_Cb + (pCbBuf[addrS] << 1);\
		pCrCoe			= COE_Cr + (pCrBuf[addrS] << 1);\
		pRGB[addrT+0]	= ColorLimitTable[Y + pCrCoe[0]] ;\
		pRGB[addrT+2]	= ColorLimitTable[Y + pCbCoe[0]] ;\
		pRGB[addrT+1]	= ColorLimitTable[Y + pCbCoe[1] + pCrCoe[1]] ;\
}
#else
#define ColorChange(addrS,addrT) {\
		Y				= pYBuf[addrS] ;\
		pCbCoe			= COE_Cb + (pCbBuf[addrS] << 1);\
		pCrCoe			= COE_Cr + (pCrBuf[addrS] << 1);\
		pRGB[addrT+0]	= ColorLimitTable[Y + pCbCoe[0]] ;\
		pRGB[addrT+2]	= ColorLimitTable[Y + pCrCoe[0]] ;\
		pRGB[addrT+1]	= ColorLimitTable[Y + pCbCoe[1] + pCrCoe[1]] ;\
}
#endif


MVoid JPG_YCMK_DeColor( int size, LPDECOLOR_PARAM pDecolorParam, int offset) {
	register MByte *pYBuf	= pDecolorParam -> pY ;
	register MByte *pCBuf	= pDecolorParam -> pCb ;
	register MByte *pMBuf	= pDecolorParam -> pCr ;
	register MByte *pRGB	= pDecolorParam -> outRGB + offset ;

#ifdef __WIN32__

	register int nWidth		= pDecolorParam -> OutWidth ;
	register int nBackBytes	= pDecolorParam -> BackBytes ;
	register int i, j ;

	i		= pDecolorParam->OutLineCount;
	while (--i >= 0) {
		j	= nWidth;
		while(--j >= 0) {
			*pRGB++ = *pYBuf++;
			*pRGB++ = *pCBuf++;
			*pRGB++ = *pMBuf++;
		}
		pRGB -= nBackBytes;
	}

#else

	while  ( --size >= 0 ) {
		pRGB[0]		= *pYBuf ++ ;
		pRGB[1]		= *pCBuf ++ ;
		pRGB[2]		= *pMBuf ++ ;
		pRGB		+= 3 ;
	}

#endif
}


MVoid JPG_TrueColor_DeColor( register MByte *ColorLimitTable, int size, LPDECOLOR_PARAM pDecolorParam, int offset) {	

	register MByte *pYBuf	= pDecolorParam -> pY ;
	register MByte *pCbBuf	= pDecolorParam -> pCb ;
	register MByte *pCrBuf	= pDecolorParam -> pCr ;
	register MByte *pRGB	= pDecolorParam -> outRGB + offset ;

	register int *COE_Cr	= pDecolorParam -> COE_Cr ;
	register int *COE_Cb	= pDecolorParam -> COE_Cb ;
	register int Y ;
	register int *pCbCoe ;
	register int *pCrCoe ;

#ifdef __WIN32__

	int nWidth		= pDecolorParam -> OutWidth ;
	int rem			= nWidth & 3 ;
	int nBackBytes	= pDecolorParam -> BackBytes-rem*3 ;
	int i, j ;
	
	nWidth	>>= 2 ; 
	
	i		= pDecolorParam->OutLineCount;
	while (--i >= 0) {
		j	= nWidth;
		while(--j >= 0) {
			ColorChange(0, 0);
			ColorChange(1, 3);
			ColorChange(2, 6);
			ColorChange(3, 9);

			pRGB		+= 12 ;
			pYBuf		+= 4 ;
			pCbBuf		+= 4 ;
			pCrBuf		+= 4 ;
		}
		
		if ( rem == 1 ) {
			ColorChange(0, 0);
		}
		else if ( rem == 2 ) {
			ColorChange(0, 0);
			ColorChange(1, 3);
		}
		else if ( rem == 3 ) {
			ColorChange(0, 0);
			ColorChange(1, 3);
			ColorChange(2, 6);
		}		
		pYBuf	+= rem ;
		pCbBuf	+= rem ;
		pCrBuf	+= rem ;

		pRGB -= nBackBytes;
	}

#else	

	int rem	= size & 3 ;
	size	>>= 2 ;
	
	while  ( --size >= 0 ) {
		ColorChange(0,0);
		ColorChange(1,3);
		ColorChange(2,6);
		ColorChange(3,9);

		pRGB		+= 12 ;
		pYBuf		+= 4 ;
		pCrBuf		+= 4 ;
		pCbBuf		+= 4 ;
	}

	if ( rem == 1 ) {
		ColorChange(0,0);
	}
	else if ( rem == 2 ) {
		ColorChange(0,0);
		ColorChange(1,3);
	}
	else if ( rem == 3 ) {
		ColorChange(0,0);
		ColorChange(1,3);
		ColorChange(2,6);
	}

#endif
}


MVoid JPG_GrayScale_DeColor(int size, LPDECOLOR_PARAM pDecolorParam, int offset) 
{	
	register MByte *pYBuf	= pDecolorParam -> pY ;
	register MByte *pRGB    = pDecolorParam -> outRGB + offset ;

#ifdef __WIN32__

	register int nWidth		= pDecolorParam -> OutWidth ;
	register int nBackBytes	= pDecolorParam -> BackBytes ;
	register int i, j ;

	i		= pDecolorParam->OutLineCount;
	while (--i >= 0) {
		j	= nWidth;
		while(--j >= 0) {
			*pRGB++ = *pYBuf;
			*pRGB++ = *pYBuf;
			*pRGB++ = *pYBuf++;
		}
		pRGB -= nBackBytes; 
	}

#else

	while  ( --size >= 0 ) {
		pRGB[0]		= *pYBuf ;
		pRGB[1]		= *pYBuf ;
		pRGB[2]		= *pYBuf ++ ;
		pRGB		+= 3 ;
	}

#endif
}




⌨️ 快捷键说明

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