Advertisement
Guest User

Untitled

a guest
Oct 3rd, 2014
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.01 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3. import java.awt.image.*;
  4. import javax.imageio.*;
  5.  
  6. public class Encoder {
  7.    
  8.     static int pattern(int x, int y, int width, BufferedImage i) {
  9.         int ret = 0;
  10.         for(int offset = 0; offset < width; offset++) {
  11.             boolean color = (i.getRGB(x + offset, y) & 0xFF000000) != 0;
  12.             ret = (ret << 1) | (color ? 1 : 0);
  13.         }
  14.         return ret;
  15.     }
  16.  
  17.     static void evaluate(List<Integer> data, BufferedImage i, String algo, boolean dump) {
  18.         int score = (i.getWidth()*i.getHeight()/8)-data.size();
  19.         System.out.format("%s:\t%d bytes\t(%+d)%n",
  20.             algo, data.size(), -score
  21.         );
  22.         if (!dump) { return; }
  23.         for(int index = 0; index < data.size(); index++) {
  24.             System.out.format((index % 8 == 7) ? "0x%02X%n\t" : "0x%02X ",
  25.                 data.get(index)
  26.             );
  27.         }
  28.     }
  29.  
  30.     public static void main(String[] args) throws IOException {
  31.         BufferedImage image = ImageIO.read(new File(args[0]));
  32.  
  33.         // this compression scheme uses nybble fields-
  34.         // the high half of each byte is the "pattern" and the low half is the "count"
  35.         {
  36.             List<Integer> data = new ArrayList<>();
  37.             for(int y = 0; y < image.getHeight(); y++) {
  38.                 for(int x = 0; x < image.getWidth(); x += 4) {
  39.                     int p = pattern(x, y, 4, image);
  40.                     int n = 0;
  41.                     while(x+4 < image.getWidth() && n < 15) {
  42.                         if (p != pattern(x+4, y, 4, image)) { break; }
  43.                         n += 1;
  44.                         x += 4;
  45.                     }
  46.                     data.add((p << 4) | n);
  47.                 }
  48.             }
  49.             evaluate(data, image, "horiz-pattern", false);
  50.         }
  51.  
  52.         // same deal but in vertical strips instead of horizontal
  53.         {
  54.             List<Integer> data = new ArrayList<>();
  55.             for(int x = 0; x < image.getWidth(); x += 4) {
  56.                 for(int y = 0; y < image.getHeight(); y++) {
  57.                     int p = pattern(x, y, 4, image);
  58.                     int n = 0;
  59.                     while(y+1 < image.getHeight() && n < 15) {
  60.                         if (p != pattern(x, y+1, 4, image)) { break; }
  61.                         n += 1;
  62.                         y += 1;
  63.                     }
  64.                     data.add((p << 4) | n);
  65.                 }
  66.             }
  67.             evaluate(data, image, "verti-pattern", false);
  68.         }
  69.  
  70.         System.out.println();
  71.         System.exit(0);
  72.     }
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement