Advertisement
CaptainSpaceCat

eBeam - ImageEditor

Jul 13th, 2016
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.80 KB | None | 0 0
  1. import java.awt.image.*;
  2. import java.awt.Color;
  3. import java.awt.*;
  4. import java.io.*;
  5. import javax.imageio.*;
  6. import javax.swing.SwingUtilities;
  7. import javax.swing.filechooser.*;
  8. import javax.swing.*;
  9.  
  10. /*
  11.  * This class takes a cropped screen grab
  12.  * of an electron cutout outline and
  13.  * reformats it for conversion into
  14.  * an STL file.
  15.  * */
  16.  
  17. public class ImageEditor {
  18.  
  19.   public static final int COLOR_BLACK = -16777216;
  20.   public static final int COLOR_WHITE = -1;
  21.   public static final int COLOR_PURPLE = -14242211;
  22.   public BufferedImage img;
  23.   public int w, h;
  24.   public int[] center;
  25.   public float pxcm;
  26.  
  27.   public int colorScan(int x, int y) {
  28.     Color col = new Color(img.getRGB(x, y), true);
  29.     int r = col.getRed();
  30.     int g = col.getGreen();
  31.     int b = col.getBlue();
  32.     if (r == 255 && g == 255 && b == 255) {
  33.       return 0;
  34.     } else if (r == 0 && g == 0 && b == 0) {
  35.       return 3;
  36.     } else if (r == b && b < g) {  //green
  37.       return 1;
  38.     } else if (b > r && r > g) {  //purple
  39.       return 2;
  40.     } else {
  41.       return -1;
  42.     }
  43.   }
  44.  
  45.   public boolean calibrateImg(BufferedImage bi) {
  46.     if (bi == null) {
  47.       return false;
  48.     }
  49.     w = bi.getWidth();
  50.     h = bi.getHeight();
  51.     img = bi;
  52.     center = new int[2];
  53.     int c = 0;
  54.     while (img.getRGB(c, 1) == -1){
  55.       c++;
  56.     }
  57.     if (img.getRGB(c + 3, 1) != -1) {
  58.       while (img.getRGB(c, 3) == -1){
  59.         c++;
  60.       }
  61.     }
  62.     c--;
  63.     center[0] = c;
  64.    
  65.     c = 0;
  66.     while (img.getRGB(w-1, c) == -1){
  67.       c++;
  68.     }
  69.     if (img.getRGB(w-1, c + 3) != -1) {
  70.       while (img.getRGB(w-3, c) == -1){
  71.         c++;
  72.       }
  73.     }
  74.     c--;
  75.     center[1] = c;
  76.    
  77.     c = 0;
  78.     int d = 0;
  79.     int[] avg = new int[10];
  80.     int index = 0;
  81.     while (center[0] - c > 0) {
  82.       d = 0;
  83.       while(colorScan(center[0]-c, center[1]) != 1) {
  84.         c++;
  85.         d++;
  86.         if (center[0] - c == 0) {
  87.           break;
  88.         }
  89.       }
  90.       if (center[0] - c == 0) {
  91.         break;
  92.       }
  93.       c+=2;
  94.       d+=2;
  95.       avg[index] = d;
  96.       index++;
  97.     }
  98.     int t = 0;
  99.     int n = 0;
  100.     for (int i = 0; i < 10; i++) {
  101.       if (avg[i] != 0) {
  102.         t += avg[i];
  103.         System.out.println(avg[i]);
  104.         n++;
  105.       }
  106.     }
  107.     pxcm = 1f*t/n;
  108.     return true;
  109.   }
  110.  
  111.   public float[] getImgInfo() {
  112.     return new float[] {center[0]+2, center[1]+2, pxcm};
  113.   }
  114.  
  115.   public void removeRods() {
  116.    
  117.     for (int y = 0; y < h; y++) {
  118.       for (int x = 0; x < w; x++) {
  119.         if (colorScan(x, y) == 1) {
  120.           img.setRGB(x, y, COLOR_WHITE);
  121.           if (x > 0 && colorScan(x-1, y) == 2) {
  122.             img.setRGB(x, y, COLOR_BLACK);
  123.           }
  124.           if (y > 0 && colorScan(x, y-1) == 2) {
  125.             img.setRGB(x, y, COLOR_BLACK);
  126.           }
  127.           if (x < w-1 && colorScan(x+1, y) == 2) {
  128.             img.setRGB(x, y, COLOR_BLACK);
  129.           }
  130.           if (y < h-1 && colorScan(x, y+1) == 2) {
  131.             img.setRGB(x, y, COLOR_BLACK);
  132.           }
  133.         }
  134.       }
  135.     }
  136.    
  137.   }
  138.  
  139.   public float clearChunks() {
  140.     for (int y = 0; y < h; y++) {
  141.       for (int x = 0; x < w; x++) {
  142.         int c = img.getRGB(x, y);
  143.         if (c != -1 && c != COLOR_BLACK) {
  144.           Color col = new Color(img.getRGB(x, y), true);
  145.           int r = col.getRed();
  146.           int g = col.getGreen();
  147.           int b = col.getBlue();
  148.           if (r == g && g == b) {
  149.             img.setRGB(x, y, -1);
  150.           } else if (r != b && !(b > r && r > g)) {
  151.             img.setRGB(x, y, -1);
  152.           }
  153.         }
  154.       }
  155.     }
  156.    
  157.     for (int y = 0; y < h; y++) {
  158.       for (int x = 0; x < w; x++) {
  159.         int c = img.getRGB(x, y);
  160.         if (c != -1 && c != COLOR_BLACK) {
  161.           if (getSurroundingNum(x, y) == 0) {
  162.             img.setRGB(x, y, -1);
  163.           }
  164.         }
  165.       }
  166.     }
  167.     return pxcm;
  168.   }
  169.  
  170.   private int getSurroundingNum(int x, int y) {
  171.     int c = 0;
  172.     if (x > 0 && img.getRGB(x-1, y) != -1) {
  173.       c++;
  174.     }
  175.     if (x < w-1 && img.getRGB(x+1, y) != -1) {
  176.       c++;
  177.     }
  178.     if (y > 0 && img.getRGB(x, y-1) != -1) {
  179.       c++;
  180.     }
  181.     if (y < h-1 && img.getRGB(x, y+1) != -1) {
  182.       c++;
  183.     }
  184.     return c;
  185.   }
  186.  
  187.   public void threshold() {
  188.     for (int y = 0; y < img.getHeight(); y++) {
  189.       for (int x = 0; x < img.getWidth(); x++) {
  190.         int color = img.getRGB(x, y);
  191.         if (color < -1) {
  192.           img.setRGB(x, y, COLOR_BLACK);
  193.         }
  194.       }
  195.     }
  196.   }
  197.  
  198.   public void thickenMargin(int t) {
  199.     for (int y = 0; y < h; y++) {
  200.       int start = w;
  201.       int end = 0;
  202.       for (int x = 0; x < w; x++) {
  203.         if (img.getRGB(x, y) == COLOR_BLACK) {
  204.           start = x;
  205.           break;
  206.         }
  207.       }
  208.       for (int x = w-1; x >= 0; x--) {
  209.         if (img.getRGB(x, y) == COLOR_BLACK) {
  210.           end = x;
  211.           break;
  212.         }
  213.       }
  214.       if (start + t*2 < end) {
  215.         for (int i = start; i < start + t; i++) {
  216.           img.setRGB(i, y, COLOR_BLACK);
  217.         }
  218.         for (int i = end; i > end - t; i--) {
  219.           img.setRGB(i, y, COLOR_BLACK);
  220.         }
  221.       }
  222.     }
  223.    
  224.     for (int x = 0; x < w; x++) {
  225.       int start = h;
  226.       int end = 0;
  227.       for (int y = 0; y < h; y++) {
  228.         if (img.getRGB(x, y) == COLOR_BLACK) {
  229.           start = y;
  230.           break;
  231.         }
  232.       }
  233.       for (int y = h-1; y >= 0; y--) {
  234.         if (img.getRGB(x, y) == COLOR_BLACK) {
  235.           end = y;
  236.           break;
  237.         }
  238.       }
  239.       if (start < end + t*2) {
  240.         for (int i = start; i < start + t; i++) {
  241.           img.setRGB(x, i, COLOR_BLACK);
  242.         }
  243.         for (int i = end; i > end - t; i--) {
  244.           img.setRGB(x, i, COLOR_BLACK);
  245.         }
  246.       }
  247.     }
  248.   }
  249.  
  250.   public void thickenCrosshairs() {
  251.     int start = -1;
  252.     int finish = -1;
  253.     for (int i = 0; i < w; i++) {
  254.       if (img.getRGB(i, center[1]) != -1) {
  255.         start = i;
  256.       }
  257.       if (img.getRGB(w-i-1, center[1]) != -1) {
  258.         finish = w-i-1;
  259.       }
  260.       if (start != -1 && finish != -1) {
  261.         break;
  262.       }
  263.     }
  264.     for (int i = start; i <= finish; i++) {
  265.       img.setRGB(i, center[1], COLOR_BLACK);
  266.     }
  267.     start = -1;
  268.     finish = -1;
  269.     for (int i = 0; i < w; i++) {
  270.       if (img.getRGB(i, center[1] + 3) != -1) {
  271.         start = i;
  272.       }
  273.       if (img.getRGB(w-i-1, center[1] + 3) != -1) {
  274.         finish = w-i-1;
  275.       }
  276.       if (start != -1 && finish != -1) {
  277.         break;
  278.       }
  279.     }
  280.     for (int i = start; i <= finish; i++) {
  281.       img.setRGB(i, center[1] + 3, COLOR_BLACK);
  282.     }
  283.    
  284.     start = -1;
  285.     finish = -1;
  286.     for (int i = 0; i < h; i++) {
  287.       if (img.getRGB(center[0], i) != -1) {
  288.         start = i;
  289.       }
  290.       if (img.getRGB(center[0], h-i-1) != -1) {
  291.         finish = h-i-1;
  292.       }
  293.       if (start != -1 && finish != -1) {
  294.         break;
  295.       }
  296.     }
  297.     for (int i = start; i <= finish; i++) {
  298.       img.setRGB(center[0], i, COLOR_BLACK);
  299.     }
  300.     start = -1;
  301.     finish = -1;
  302.     for (int i = 0; i < h; i++) {
  303.       if (img.getRGB(center[0] + 3, i) != -1) {
  304.         start = i;
  305.       }
  306.       if (img.getRGB(center[0] + 3, h-i-1) != -1) {
  307.         finish = h-i-1;
  308.       }
  309.       if (start != -1 && finish != -1) {
  310.         break;
  311.       }
  312.     }
  313.     for (int i = start; i <= finish; i++) {
  314.       img.setRGB(center[0] + 3, i, COLOR_BLACK);
  315.     }
  316.   }
  317.  
  318.   public int[][] getCrossPoints() {
  319.    
  320.     int offset = 0;
  321.     int[][] cp = new int[8][2];
  322.     int c = 1;
  323.     while (img.getRGB(center[0]-2, center[1]-c) == -1) { //0
  324.       c++;
  325.     }
  326.     cp[0] = new int[] {center[0]-2, center[1]-c+1-offset};
  327.    
  328.     c = 1;
  329.     while (img.getRGB(center[0]+1, center[1]-c) == -1) { //1
  330.       c++;
  331.     }
  332.     cp[1] = new int[] {center[0]+2, center[1]-c+1-offset};
  333.    
  334.     c = 1;
  335.     while (img.getRGB(center[0]-2, center[1]+c) == -1) { //2
  336.       c++;
  337.     }
  338.     cp[2] = new int[] {center[0]-2, center[1]+c+offset};
  339.    
  340.     c = 1;
  341.     while (img.getRGB(center[0]+1, center[1]+c) == -1) { //3
  342.       c++;
  343.     }
  344.     cp[3] = new int[] {center[0]+2, center[1]+c+offset};
  345.    
  346.     c = 1;
  347.     while (img.getRGB(center[0]-c, center[1]-2) == -1) { //4
  348.       c++;
  349.     }
  350.     cp[4] = new int[] {center[0]-c+1-offset, center[1]-2};
  351.    
  352.     c = 1;
  353.     while (img.getRGB(center[0]-c, center[1]+1) == -1) { //5
  354.       c++;
  355.     }
  356.     cp[5] = new int[] {center[0]-c+1-offset, center[1]+2};
  357.    
  358.     c = 1;
  359.     while (img.getRGB(center[0]+c, center[1]-2) == -1) { //6
  360.       c++;
  361.     }
  362.     cp[6] = new int[] {center[0]+c+offset, center[1]-2};
  363.    
  364.     c = 1;
  365.     while (img.getRGB(center[0]+c, center[1]+1) == -1) { //7
  366.       c++;
  367.     }
  368.     cp[7] = new int[] {center[0]+c+offset, center[1]+2};
  369.    
  370.     return cp;
  371.   }
  372.  
  373.   public ImageEditor() {
  374.   }
  375.  
  376. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement