'Run Length'에 해당되는 글 1건

  1. 2008/02/24 귀차니스트 RLE8 - Run Length Encoding

RLE8 - Run Length Encoding

Programming 2008/02/24 00:27 귀차니스트

  다양한 압축방법중 하나. 짝 수개의 커맨드로 이루어져 있으며, 첫 번째 커맨드는 데이터 길이, 두 번째 커맨드는 데이터로 구성된다. 예로써 8 D 3 A 가 되면 DDDDDDDDAAA 이 데이터가 된다. BMP 파일에서 RLE8 압축을 사용하나 가변적인 형태의 RLE8 압축방식을 지니게 된다.

Iterator 는 unsigned char 형을 Data 형으로 가지는 Container, 이면 가능, unsigned char array 가능.

RLE8.cpp (Language : cpp)
  1. #include <vector>
  2. template< typename DataIterator >
  3. void RLE8Decompress( DataIterator CompressData, unsigned int CompressDataLength, std::vector< unsigned char > &DecompressData )
  4. {
  5.     unsigned char Length;
  6.     unsigned char Data;
  7.     if( CompressDataLength == 0 )
  8.         return;
  9.     for( unsigned int i = 0; i < CompressDataLength; i += 2 )   {
  10.         Length  = *CompressData;
  11.         ++CompressData;
  12.         Data    = *CompressData;
  13.         ++CompressData;
  14.         for( unsigned char len = 0; len < Length; ++len )   {
  15.             DecompressData.push_back( Data );
  16.         }
  17.     }
  18. }
  19. template< typename DataIterator >
  20. void RLE8Compress( DataIterator DecompressData, unsigned int DecompressDataLength, std::vector< unsigned char > &CompressData )
  21. {
  22.     unsigned char Data;
  23.     unsigned char LastData;
  24.     if( DecompressDataLength == 0 )
  25.         return;
  26.     LastData = *DecompressData;
  27.     for( unsigned int i = 0; i < DecompressDataLength; )    {
  28.         for( unsigned char len = 0; true; ++len, ++DecompressData ) {
  29.             Data = *DecompressData;
  30.             if( LastData != Data || len >= 255 )    {
  31.                 CompressData.push_back( len );
  32.                 CompressData.push_back( LastData );
  33.                 LastData = Data;
  34.                 i += len;
  35.                 break;
  36.             }
  37.             if( ( i + len ) >= ( DecompressDataLength - 1 ) )   {
  38.                 CompressData.push_back( len + 1 );
  39.                 CompressData.push_back( LastData );
  40.                 i += ( len + 1 );
  41.                 break;
  42.             }
  43.         }
  44.     }
  45. }



크리에이티브 커먼즈 라이센스
Creative Commons License
2008/02/24 00:27 2008/02/24 00:27

댓글을 달아 주세요