Ejemplo n.º 1
0
 /**
  * compress the source array. use rllchar as character to indicate repetition. if rllchar is 0x0,
  * the least frequent character from source will be used.
  *
  * @return a newly created array with the rll compressed data.
  */
 public static byte[] compress(byte rllchar, byte[] source) {
   if (rllchar == (byte) 0) {
     int[] freq = HuffmanTree.constructTable(source);
     int min = 100000;
     for (int i = 0; i < freq.length; i++) {
       if (freq[i] == 0) {
         rllchar = (byte) i;
         break;
       }
       if (freq[i] < min) {
         min = freq[i];
         rllchar = (byte) i;
       }
     }
   }
   ByteArrayOutputStream baos = new ByteArrayOutputStream(source.length);
   baos.write(rllchar);
   int i;
   for (i = 0; i < source.length - 3; i++) {
     if ((source[i] == source[i + 1]) && (source[i + 1] == source[i + 2])) {
       int rep = 3;
       while (((i + rep) < source.length) && source[i + rep] == source[i]) {
         if (rep == 254) break;
         rep++;
       }
       baos.write(rllchar);
       baos.write(rep);
       baos.write(source[i]);
       i += rep - 1;
     } else if (source[i] == rllchar) {
       baos.write(rllchar);
       baos.write(1);
     } else {
       baos.write(source[i]);
     }
   }
   while (i < source.length) {
     baos.write(source[i++]);
   }
   return baos.toByteArray();
 }