다양한 압축방법중 하나. 짝 수개의 커맨드로 이루어져 있으며, 첫 번째 커맨드는 데이터 길이, 두 번째 커맨드는 데이터로 구성된다. 예로써 8 D 3 A 가 되면 DDDDDDDDAAA 이 데이터가 된다. BMP 파일에서 RLE8 압축을 사용하나 가변적인 형태의 RLE8 압축방식을 지니게 된다. Iterator 는 unsigned char 형을 Data 형으로 가지는 Container, 이면 가능, unsigned char array 가능.
RLE8.cpp (Language : cpp)
#include <vector>
template< typename DataIterator >
void RLE8Decompress( DataIterator CompressData, unsigned int CompressDataLength, std::vector < unsigned char > &DecompressData )
{
unsigned char Length;
unsigned char Data;
if ( CompressDataLength == 0 )
return ;
for ( unsigned int i = 0 ; i < CompressDataLength; i += 2 ) {
Length = *CompressData;
++CompressData;
Data = *CompressData;
++CompressData;
for ( unsigned char len = 0 ; len < Length; ++len ) {
DecompressData.push_back ( Data ) ;
}
}
}
template< typename DataIterator >
void RLE8Compress( DataIterator DecompressData, unsigned int DecompressDataLength, std::vector < unsigned char > &CompressData )
{
unsigned char Data;
unsigned char LastData;
if ( DecompressDataLength == 0 )
return ;
LastData = *DecompressData;
for ( unsigned int i = 0 ; i < DecompressDataLength; ) {
for ( unsigned char len = 0 ; true ; ++len, ++DecompressData ) {
Data = *DecompressData;
if ( LastData != Data || len >= 255 ) {
CompressData.push_back ( len ) ;
CompressData.push_back ( LastData ) ;
LastData = Data;
i += len;
break ;
}
if ( ( i + len ) >= ( DecompressDataLength - 1 ) ) {
CompressData.push_back ( len + 1 ) ;
CompressData.push_back ( LastData ) ;
i += ( len + 1 ) ;
break ;
}
}
}
}
크리에이티브 커먼즈 라이센스
트랙백 주소 :: http://www.filewiki.net/tc/trackback/16
댓글을 달아 주세요