Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.awt.image.*;
- import java.awt.Color;
- import java.awt.*;
- import java.io.*;
- import javax.imageio.*;
- import javax.swing.SwingUtilities;
- import javax.swing.filechooser.*;
- import javax.swing.*;
- /*
- * This class takes a cropped screen grab
- * of an electron cutout outline and
- * reformats it for conversion into
- * an STL file.
- * */
- public class ImageEditor {
- public static final int COLOR_BLACK = -16777216;
- public static final int COLOR_WHITE = -1;
- public static final int COLOR_PURPLE = -14242211;
- public BufferedImage img;
- public int w, h;
- public int[] center;
- public float pxcm;
- public int colorScan(int x, int y) {
- Color col = new Color(img.getRGB(x, y), true);
- int r = col.getRed();
- int g = col.getGreen();
- int b = col.getBlue();
- if (r == 255 && g == 255 && b == 255) {
- return 0;
- } else if (r == 0 && g == 0 && b == 0) {
- return 3;
- } else if (r == b && b < g) { //green
- return 1;
- } else if (b > r && r > g) { //purple
- return 2;
- } else {
- return -1;
- }
- }
- public boolean calibrateImg(BufferedImage bi) {
- if (bi == null) {
- return false;
- }
- w = bi.getWidth();
- h = bi.getHeight();
- img = bi;
- center = new int[2];
- int c = 0;
- while (img.getRGB(c, 1) == -1){
- c++;
- }
- if (img.getRGB(c + 3, 1) != -1) {
- while (img.getRGB(c, 3) == -1){
- c++;
- }
- }
- c--;
- center[0] = c;
- c = 0;
- while (img.getRGB(w-1, c) == -1){
- c++;
- }
- if (img.getRGB(w-1, c + 3) != -1) {
- while (img.getRGB(w-3, c) == -1){
- c++;
- }
- }
- c--;
- center[1] = c;
- c = 0;
- int d = 0;
- int[] avg = new int[10];
- int index = 0;
- while (center[0] - c > 0) {
- d = 0;
- while(colorScan(center[0]-c, center[1]) != 1) {
- c++;
- d++;
- if (center[0] - c == 0) {
- break;
- }
- }
- if (center[0] - c == 0) {
- break;
- }
- c+=2;
- d+=2;
- avg[index] = d;
- index++;
- }
- int t = 0;
- int n = 0;
- for (int i = 0; i < 10; i++) {
- if (avg[i] != 0) {
- t += avg[i];
- System.out.println(avg[i]);
- n++;
- }
- }
- pxcm = 1f*t/n;
- return true;
- }
- public float[] getImgInfo() {
- return new float[] {center[0]+2, center[1]+2, pxcm};
- }
- public void removeRods() {
- for (int y = 0; y < h; y++) {
- for (int x = 0; x < w; x++) {
- if (colorScan(x, y) == 1) {
- img.setRGB(x, y, COLOR_WHITE);
- if (x > 0 && colorScan(x-1, y) == 2) {
- img.setRGB(x, y, COLOR_BLACK);
- }
- if (y > 0 && colorScan(x, y-1) == 2) {
- img.setRGB(x, y, COLOR_BLACK);
- }
- if (x < w-1 && colorScan(x+1, y) == 2) {
- img.setRGB(x, y, COLOR_BLACK);
- }
- if (y < h-1 && colorScan(x, y+1) == 2) {
- img.setRGB(x, y, COLOR_BLACK);
- }
- }
- }
- }
- }
- public float clearChunks() {
- for (int y = 0; y < h; y++) {
- for (int x = 0; x < w; x++) {
- int c = img.getRGB(x, y);
- if (c != -1 && c != COLOR_BLACK) {
- Color col = new Color(img.getRGB(x, y), true);
- int r = col.getRed();
- int g = col.getGreen();
- int b = col.getBlue();
- if (r == g && g == b) {
- img.setRGB(x, y, -1);
- } else if (r != b && !(b > r && r > g)) {
- img.setRGB(x, y, -1);
- }
- }
- }
- }
- for (int y = 0; y < h; y++) {
- for (int x = 0; x < w; x++) {
- int c = img.getRGB(x, y);
- if (c != -1 && c != COLOR_BLACK) {
- if (getSurroundingNum(x, y) == 0) {
- img.setRGB(x, y, -1);
- }
- }
- }
- }
- return pxcm;
- }
- private int getSurroundingNum(int x, int y) {
- int c = 0;
- if (x > 0 && img.getRGB(x-1, y) != -1) {
- c++;
- }
- if (x < w-1 && img.getRGB(x+1, y) != -1) {
- c++;
- }
- if (y > 0 && img.getRGB(x, y-1) != -1) {
- c++;
- }
- if (y < h-1 && img.getRGB(x, y+1) != -1) {
- c++;
- }
- return c;
- }
- public void threshold() {
- for (int y = 0; y < img.getHeight(); y++) {
- for (int x = 0; x < img.getWidth(); x++) {
- int color = img.getRGB(x, y);
- if (color < -1) {
- img.setRGB(x, y, COLOR_BLACK);
- }
- }
- }
- }
- public void thickenMargin(int t) {
- for (int y = 0; y < h; y++) {
- int start = w;
- int end = 0;
- for (int x = 0; x < w; x++) {
- if (img.getRGB(x, y) == COLOR_BLACK) {
- start = x;
- break;
- }
- }
- for (int x = w-1; x >= 0; x--) {
- if (img.getRGB(x, y) == COLOR_BLACK) {
- end = x;
- break;
- }
- }
- if (start + t*2 < end) {
- for (int i = start; i < start + t; i++) {
- img.setRGB(i, y, COLOR_BLACK);
- }
- for (int i = end; i > end - t; i--) {
- img.setRGB(i, y, COLOR_BLACK);
- }
- }
- }
- for (int x = 0; x < w; x++) {
- int start = h;
- int end = 0;
- for (int y = 0; y < h; y++) {
- if (img.getRGB(x, y) == COLOR_BLACK) {
- start = y;
- break;
- }
- }
- for (int y = h-1; y >= 0; y--) {
- if (img.getRGB(x, y) == COLOR_BLACK) {
- end = y;
- break;
- }
- }
- if (start < end + t*2) {
- for (int i = start; i < start + t; i++) {
- img.setRGB(x, i, COLOR_BLACK);
- }
- for (int i = end; i > end - t; i--) {
- img.setRGB(x, i, COLOR_BLACK);
- }
- }
- }
- }
- public void thickenCrosshairs() {
- int start = -1;
- int finish = -1;
- for (int i = 0; i < w; i++) {
- if (img.getRGB(i, center[1]) != -1) {
- start = i;
- }
- if (img.getRGB(w-i-1, center[1]) != -1) {
- finish = w-i-1;
- }
- if (start != -1 && finish != -1) {
- break;
- }
- }
- for (int i = start; i <= finish; i++) {
- img.setRGB(i, center[1], COLOR_BLACK);
- }
- start = -1;
- finish = -1;
- for (int i = 0; i < w; i++) {
- if (img.getRGB(i, center[1] + 3) != -1) {
- start = i;
- }
- if (img.getRGB(w-i-1, center[1] + 3) != -1) {
- finish = w-i-1;
- }
- if (start != -1 && finish != -1) {
- break;
- }
- }
- for (int i = start; i <= finish; i++) {
- img.setRGB(i, center[1] + 3, COLOR_BLACK);
- }
- start = -1;
- finish = -1;
- for (int i = 0; i < h; i++) {
- if (img.getRGB(center[0], i) != -1) {
- start = i;
- }
- if (img.getRGB(center[0], h-i-1) != -1) {
- finish = h-i-1;
- }
- if (start != -1 && finish != -1) {
- break;
- }
- }
- for (int i = start; i <= finish; i++) {
- img.setRGB(center[0], i, COLOR_BLACK);
- }
- start = -1;
- finish = -1;
- for (int i = 0; i < h; i++) {
- if (img.getRGB(center[0] + 3, i) != -1) {
- start = i;
- }
- if (img.getRGB(center[0] + 3, h-i-1) != -1) {
- finish = h-i-1;
- }
- if (start != -1 && finish != -1) {
- break;
- }
- }
- for (int i = start; i <= finish; i++) {
- img.setRGB(center[0] + 3, i, COLOR_BLACK);
- }
- }
- public int[][] getCrossPoints() {
- int offset = 0;
- int[][] cp = new int[8][2];
- int c = 1;
- while (img.getRGB(center[0]-2, center[1]-c) == -1) { //0
- c++;
- }
- cp[0] = new int[] {center[0]-2, center[1]-c+1-offset};
- c = 1;
- while (img.getRGB(center[0]+1, center[1]-c) == -1) { //1
- c++;
- }
- cp[1] = new int[] {center[0]+2, center[1]-c+1-offset};
- c = 1;
- while (img.getRGB(center[0]-2, center[1]+c) == -1) { //2
- c++;
- }
- cp[2] = new int[] {center[0]-2, center[1]+c+offset};
- c = 1;
- while (img.getRGB(center[0]+1, center[1]+c) == -1) { //3
- c++;
- }
- cp[3] = new int[] {center[0]+2, center[1]+c+offset};
- c = 1;
- while (img.getRGB(center[0]-c, center[1]-2) == -1) { //4
- c++;
- }
- cp[4] = new int[] {center[0]-c+1-offset, center[1]-2};
- c = 1;
- while (img.getRGB(center[0]-c, center[1]+1) == -1) { //5
- c++;
- }
- cp[5] = new int[] {center[0]-c+1-offset, center[1]+2};
- c = 1;
- while (img.getRGB(center[0]+c, center[1]-2) == -1) { //6
- c++;
- }
- cp[6] = new int[] {center[0]+c+offset, center[1]-2};
- c = 1;
- while (img.getRGB(center[0]+c, center[1]+1) == -1) { //7
- c++;
- }
- cp[7] = new int[] {center[0]+c+offset, center[1]+2};
- return cp;
- }
- public ImageEditor() {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement