00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 package de.picana.converter;
00014
00015 import de.picana.control.*;
00016 import de.picana.logging.*;
00017
00018 import java.util.*;
00019 import java.io.*;
00020 import java.awt.image.*;
00021 import javax.imageio.*;
00022
00023
00030 public class PNG2ARFF extends Task {
00031
00032 private String in_filename;
00033 private String out_filename;
00034 private int upperLeftX;
00035 private int upperLeftY;
00036 private int lowerRightX;
00037 private int lowerRightY;
00038
00039
00041 public PNG2ARFF() {
00042 }
00043
00044 public void init(ParameterSet params, Logger logger) {
00045
00046 super.init(params, logger);
00047
00048 upperLeftX = 0;
00049 upperLeftY = 0;
00050 lowerRightX = -1;
00051 lowerRightY = -1;
00052 int width = 0;
00053 int height = 0;
00054
00055 in_filename = (String)params.getParameter("in");
00056 out_filename = (String)params.getParameter("out");
00057
00058 try {
00059 upperLeftX = Integer.parseInt((String)params.getParameter("upperLeftX"));
00060 } catch (NumberFormatException nfe) {}
00061
00062 try {
00063 upperLeftY = Integer.parseInt((String)params.getParameter("upperLeftY"));
00064 } catch (NumberFormatException nfe) {}
00065
00066 if ((String)params.getParameter("width") != null) {
00067 try {
00068 width = Integer.parseInt((String)params.getParameter("width"));
00069 } catch (NumberFormatException nfe) {}
00070 lowerRightX += width;
00071 }
00072
00073 if ((String)params.getParameter("height") != null) {
00074 try {
00075 height = Integer.parseInt((String)params.getParameter("height"));
00076 } catch (NumberFormatException nfe) {}
00077 lowerRightY += height;
00078 }
00079
00080 if (lowerRightX == -1) {
00081 try {
00082 lowerRightX = Integer.parseInt((String)params.getParameter("lowerRightX"));
00083 } catch (NumberFormatException nfe) {}
00084 }
00085
00086 if (lowerRightY == -1) {
00087 try {
00088 lowerRightY = Integer.parseInt((String)params.getParameter("lowerRightY"));
00089 } catch (NumberFormatException nfe) {}
00090 }
00091 }
00092
00093 public void start() throws TaskException {
00094
00095 try {
00096 File infile = new File(in_filename);
00097 File outfile = new File(out_filename);
00098
00099 if (!outfile.exists()
00100 || (outfile.exists() && (outfile.lastModified() <= infile.lastModified()))) {
00101
00102 logger.info(LOGSRC, "Started.");
00103
00104 FileInputStream input = new FileInputStream(infile);
00105 FileOutputStream output = new FileOutputStream(outfile);
00106 PrintWriter pw = new PrintWriter(output);
00107
00108 pw.println("% ARFF file for picture data from PNG files");
00109 pw.println("%");
00110 pw.println("@relation colour");
00111 pw.println();
00112 pw.println("@attribute red numeric");
00113 pw.println("@attribute green numeric");
00114 pw.println("@attribute blue numeric");
00115 pw.println();
00116 pw.println("@data");
00117 pw.println("%");
00118 pw.println("% x instances");
00119 pw.println("%");
00120
00121 BufferedImage image = ImageIO.read(input);
00122
00123 int x, y;
00124
00125 if ((upperLeftX < 0) || (upperLeftX >= image.getWidth()))
00126 upperLeftX = 0;
00127
00128 if ((upperLeftY < 0) || (upperLeftY >= image.getHeight()))
00129 upperLeftY = 0;
00130
00131 if ((lowerRightX < 0) || (lowerRightX >= image.getWidth()))
00132 lowerRightX = image.getWidth()-1;
00133
00134 if ((lowerRightY < 0) || (lowerRightY >= image.getHeight()))
00135 lowerRightY = image.getHeight()-1;
00136
00137
00138 for (y=upperLeftY; y <= lowerRightY; y++) {
00139
00140 for (x=upperLeftX; x <= lowerRightX; x++) {
00141
00142 int rgb = image.getRGB(x,y);
00143 int red = (rgb & 0x00ff0000) >> 16;
00144 int green = (rgb & 0x0000ff00) >> 8;
00145 int blue = (rgb & 0x000000ff);
00146
00147 pw.print((red / 256.0) + ", ");
00148 pw.print((green / 256.0) + ", ");
00149 pw.print((blue / 256.0));
00150 pw.println();
00151 }
00152 }
00153
00154 pw.close();
00155 input.close();
00156
00157 logger.info(LOGSRC, "Stopped.");
00158 }
00159
00160 } catch (Exception e) {
00161 throw new TaskException(e.toString());
00162 }
00163 }
00164
00165 public void stop() {
00166
00167 }
00168
00169 public void pause() {
00170
00171 }
00172
00173 public void resume() {
00174
00175 }
00176 }