?? rle.h
字號:
//////////////////////////////////////////////////////////////////
// //
// 用途 : RLE 壓縮算法 (PCX, TGA圖像) //
// 創(chuàng)建 : [Foolish] / 2000-9-6 //
// 更新 : 2002-4-7 //
// 主頁 : //
// 郵箱 : crazybit@263.net //
// (c) 1999 - 2002 =USTC= 付黎 //
//////////////////////////////////////////////////////////////////
#ifndef __FOO_RLE_COMPRESS_H__
#define __FOO_RLE_COMPRESS_H__
#include <windows.h>
#pragma once
//====================================================================
// RLE - 壓縮算法
//====================================================================
//////////////////////////////////////////////////////////////////////
// 功 能 :RLE壓 / 解壓縮 ( PCX, TGA 圖像 ) //
// //
// 參 數(shù) :iColorBit 為像素顏色位數(shù) //
// PCX為 :1, 4, 8, 24 //
// TGA為 :8, 16, 24, 32 //
// iNumPixel 為寫入OutBuffer中的像素個數(shù) //
// //
// 返回值 :EncodeLine 返回編碼后 OutBuffer 的指針 //
// DecodeLine 返回解碼后 InBuffer 的指針 //
// //
// 說 明 :PCX圖像 :1,4,8位色位圖按字節(jié)處理,24位色分成3通道處理 //
// TGA圖像 :支持8, 16, 24, 32色, 不支持15位色 //
// 壓縮時OutBuffer至少兩倍InBuffer大小 //
//////////////////////////////////////////////////////////////////////
BYTE * RLE_PCX_EncodeLine (BYTE * InBuffer, int iColorBit,
int iNumPixel, // iNumPixel即為圖像寬
BYTE * OutBuffer) ;
BYTE * RLE_PCX_DecodeLine (BYTE * InBuffer, int iColorBit,
int iNumPixel, // iNumPixel即為圖像寬
BYTE * OutBuffer) ;
BYTE * RLE_TGA_EncodeLine (BYTE * InBuffer, int iColorBit,
int iNumPixel, // iNumPixel即為圖像寬
BYTE * OutBuffer) ;
BYTE * RLE_TGA_DecodeLine (BYTE * InBuffer, int iColorBit,
int iNumPixel, // iNumPixel即為圖像寬
BYTE * OutBuffer) ;
//===================================================================
// Implement
//===================================================================
inline BYTE * RLE_PCX_DecodeLine (BYTE * InBuffer, int iColorBit,
int iNumPixel, BYTE * OutBuffer) {
register BYTE Data, Num, Pack = 8 / iColorBit ;
if (iColorBit <= 8) // 1,4,8位色
while (iNumPixel > 0)
{
Data = *InBuffer++ ; // Next Byte
if ( (Data & 0xC0) == 0xC0 ) // Data >= 0xC0
{
Num = Data & 0x3F ; // 重復(fù)字節(jié)
memset (OutBuffer, *InBuffer++, Num) ;
OutBuffer += Num ; iNumPixel -= Num * Pack ;
}
else
{
*OutBuffer++ = Data ;
iNumPixel -= Pack ;
}
}
else // 24位色分Channel
for (int i = 2 ; i >= 0 ; i--) // RGB channel
{
int iCount = iNumPixel ;
BYTE * pChannel = OutBuffer + i ;
while (iCount-- > 0) // 一定會寫入一個像素(--)
{
Data = *InBuffer++ ; // Next Byte
if ( (Data & 0xC0) == 0xC0 ) // Data >= 0xC0
{
Num = Data & 0x3F ; // 重復(fù)像素
for (int x = 0 ; x < Num ; x++, pChannel += 3)
*pChannel = *InBuffer ;
InBuffer++ ;
iCount -= Num - 1 ;
}
else
{ *pChannel = Data ; pChannel += 3 ; }
}
}
return InBuffer ;
}
//===================================================================
inline BYTE * RLE_PCX_EncodeLine (BYTE * InBuffer, int iColorBit,
int iNumPixel, // iNumPixel即為圖像寬
BYTE * OutBuffer) {
register BYTE data, cCount ;
int PcxRow = 2 * ( (iNumPixel * (iColorBit % 16) + 15) / 16 ) ;
if (iColorBit <= 8) // 1,4,8位色
while (PcxRow > 0)
{
cCount = 1 ; data = *InBuffer++ ; PcxRow-- ;
while ( (cCount < 0x3F) && (PcxRow != 0) )
if (*InBuffer != data)// 統(tǒng)計重復(fù)字節(jié)個數(shù)
break ;
else
{
cCount++ ; InBuffer++ ; PcxRow-- ;
}
if (cCount == 1) // 無重復(fù)像素
if ( (data & 0xC0) == 0xC0 ) // Data >= 0xC0
{
*OutBuffer++ = 0xC1 ;
*OutBuffer++ = data ;
}
else
*OutBuffer++ = data ; // Data < 0xC0, 直接寫字節(jié)
else // 重復(fù)像素
{
*OutBuffer++ = 0xC0 | cCount ;
*OutBuffer++ = data ;
}
} // 1,4,8位色結(jié)束
else // 24位色分Channel
for (int i = 2 ; i >= 0 ; i--) // RGB channel
{
DWORD RowBak = PcxRow ; // 每Channel字節(jié)數(shù)
BYTE * pChannel = InBuffer + i ;
while (RowBak > 0)
{
cCount = 1 ; data = *pChannel ; pChannel += 3 ; RowBak-- ;
while ( (cCount < 0x3F) && (RowBak != 0) )
if (*pChannel != data) // 統(tǒng)計重復(fù)字節(jié)個數(shù)
break ;
else
{
cCount++ ; pChannel += 3 ; RowBak-- ;
}
if (cCount == 1) // 無重復(fù)像素
if ( (data & 0xC0) == 0xC0 ) // Data >= 0xC0
{
*OutBuffer++ = 0xC1 ;
*OutBuffer++ = data ;
}
else
*OutBuffer++ = data ;
else // 重復(fù)像素
{
*OutBuffer++ = 0xC0 | cCount ;
*OutBuffer++ = data ;
}
}
}
return OutBuffer ;
}
//===================================================================
inline BYTE * RLE_TGA_DecodeLine (BYTE * InBuffer, int iColorBit,
int iNumPixel, BYTE * OutBuffer) {
register BYTE Data ;
register int Num ;
iColorBit /= 8 ; // 轉(zhuǎn)換為字節(jié)數(shù)
while (iNumPixel > 0)
{
Data = *InBuffer++ ; // Next Byte
if (Data & 0x80) // Data >= 0x80
{
iNumPixel -= (Num = (Data & 0x7F) + 1) ;
for (int i = 0 ; i < Num ; i++, OutBuffer += iColorBit)
memcpy (OutBuffer, InBuffer, iColorBit) ;
InBuffer += iColorBit ;
}
else // 直接copy Num個像素
{
iNumPixel -= (Num = ++Data) ;
Num *= iColorBit ;
memcpy (OutBuffer, InBuffer, Num) ;
OutBuffer += Num ;
InBuffer += Num ;
}
} // End of while
return InBuffer ;
}
//===================================================================
inline BYTE * RLE_TGA_EncodeLine (BYTE * InBuffer, int iColorBit,
int iNumPixel, BYTE * OutBuffer) {
DWORD Data, Next ;
BYTE * pBak ;
register DWORD Count ;
iColorBit /= 8 ; // 轉(zhuǎn)換為字節(jié)數(shù)
while (iNumPixel > 0)
{
pBak = InBuffer ; // 記數(shù)指針
memcpy (&Data, InBuffer, iColorBit) ; // 第一個像素
InBuffer += iColorBit ; iNumPixel-- ; Count = 1 ;
while ((Count < 0x7F) && (iNumPixel > 0)) // 統(tǒng)計重復(fù)像素
{
memcpy (&Next, InBuffer, iColorBit) ; // 下一個像素
if (Next != Data)
break ;
InBuffer += iColorBit ; iNumPixel-- ; Count++ ;
}
if (Count == 1) // 無重復(fù)像素
{
while ((Count < 0x7F) && (iNumPixel > 0)) // 統(tǒng)計不重復(fù)像素
{
Count++ ; Data = Next ;
InBuffer += iColorBit ; iNumPixel-- ;
memcpy (&Next, InBuffer, iColorBit) ; // 下一個像素
if (Data == Next)
break ;
}
// 直接copy不重復(fù)像素
*OutBuffer++ = (BYTE)(Count - 1) ;
Count = InBuffer - pBak ; // Count->臨時變量
memcpy (OutBuffer, pBak, Count) ;
OutBuffer += Count ;
}
else // 重復(fù)像素
{
*OutBuffer++ = 0x80 | (BYTE)--Count ;
memcpy (OutBuffer, &Data, iColorBit) ;
OutBuffer += iColorBit ;
}
} // End of while
return OutBuffer ;
}
//===================================================================
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -