title: Read / Write Image in java
body: <p>I want to use java to read / write an image and I have got some codes. But I donno how to use the codes, especially in the argument <em>String...</em></p>
  
  <p>Actually in the sample demo that comes together with these codes, the usage is like this:</p>
  
  <pre><code>double[] data = Image.load("src/chap08_romsrams/common/lena256.ppm", "../common/lena256.ppm");
  </code></pre>
  
  <p>and this:</p>
  
  <pre><code>Image.write(l, "P3", 256, "src/chap08_romsrams/ex1_roms/lena_processed.ppm", "lena_processed.ppm");
  </code></pre>
  
  <p>Let's say that I have an 256*256 image called lena.ppm, which lies in the same folder as the java file, how can I use these functions to read / write the image ...?</p>
  
  <p>Many Thanks ! </p>
  
  <pre><code>import java.io.BufferedReader;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.io.OutputStream;
  import java.io.PrintStream;
  import java.util.List;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  public class Image {
  public static double[] load(String... fn) {
      InputStream in = null;
  
      for (String string : fn) {
          try {
              in = new FileInputStream(string);
          } catch (IOException e) {
              /* Empty */
          }
          if (in != null) break;
      }
  
      if (in == null) {
          throw new RuntimeException("Failed to load input image in Image.load(String...), tried to load image from " + fn);
      }
  
      BufferedReader reader = new BufferedReader( new InputStreamReader(in) );
  
      try {
          String type = reader.readLine(); // Type
          reader.readLine(); // Comment
          String res = reader.readLine(); // Dimensions
          reader.readLine(); // Intensity range
  
          Pattern p = Pattern.compile("(\\d+) (\\d+)");
          Matcher m = p.matcher(res);
          m.matches();
          Integer width = Integer.parseInt(m.group(1));
          Integer height = Integer.parseInt(m.group(2));
  
          System.err.println(width + "x" + height);
  
          double[] data = new double[width * height * ((type.equals("P3")) ? 3 : 1)];
          String line;
          int i = 0;
          while((line = reader.readLine()) != null)
              data[i++] = Integer.parseInt(line);
  
          reader.close();
  
          return data;
  
      } catch(IOException e) {
          throw new RuntimeException(e);
      }
  }
  
  public static void write(List&lt;Double&gt; data, String... fn) {
      write(data, "P2", 1024, fn);
  }
  
  public static void write(List&lt;Double&gt; data, String type, int width, String... fn) {
      OutputStream out = null;
  
      for (String string : fn) {
          try {
              out = new FileOutputStream(string);
          } catch (IOException e) {
              /* Empty */
          }
          if (out != null) break;
      }
  
      if (out == null) {
          throw new RuntimeException("Failed to file for output in Image.write(List&lt;Double&gt;, String, int, String...), tried to open " + fn);
      }
  
      PrintStream ps = new PrintStream(out);
  
      ps.println(type);
      int height = data.size() / (width * ((type.equals("P3") ? 3 : 1))); //1024;
      ps.println("#generated");
      ps.println("" + width + " " + height);
      ps.println("255");
      for(Double d : data)
          ps.println((int)(d.doubleValue()));
  }
  </code></pre>
  
  <p>}</p>