diff options
Diffstat (limited to 'j2kviewer/src/PgmImage.java')
| -rw-r--r-- | j2kviewer/src/PgmImage.java | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/j2kviewer/src/PgmImage.java b/j2kviewer/src/PgmImage.java new file mode 100644 index 00000000..324fbfab --- /dev/null +++ b/j2kviewer/src/PgmImage.java @@ -0,0 +1,93 @@ +import java.awt.*; +import java.awt.image.*; +import java.net.*; +import java.io.*; +import java.util.regex.*; + +class PgmImage extends Component +{ + private Socket s; + private BufferedReader in; + private int x, y; + + PgmImage() + { + } + + private String read() + { + try { return in.readLine(); } + catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public Image open(String filename) + { + String str; + Pattern pat; + Matcher mat; + int bytes, width, height, depth; + FileInputStream fis; + + try { + in = new BufferedReader( + new InputStreamReader( + fis = new FileInputStream( + new File(filename)))); + + pat = Pattern.compile("^P5$"); + mat = pat.matcher(str = read()); + mat.matches(); + pat = Pattern.compile("^(\\d+) (\\d+)$"); + mat = pat.matcher(str = read()); + mat.matches(); + x = new Integer(mat.group(1)).intValue(); + y = new Integer(mat.group(2)).intValue(); + width = x; + height = y; + depth = 1; + pat = Pattern.compile("^255$"); + mat = pat.matcher(str = read()); + mat.matches(); + bytes = x*y; + char[] buf = new char[bytes]; + int r, offset = 0; + while (bytes > 0) { + try { r = in.read(buf, offset, bytes); offset += r; bytes -= r; } + catch (IOException e) { e.printStackTrace(); } + } + int[] buf2 = new int[buf.length]; + if (depth == 3) { + for (int i = 0; i < buf.length/3; ++i) + buf2[i] = 0xFF << 24 | buf[3*i] << 16 | buf[3*i+1] << 8 | buf[3*i+2]; + } else { + for (int i = 0; i < buf.length; ++i) + buf2[i] = 0xFF << 24 | buf[i] << 16 | buf[i] << 8 | buf[i]; + } + fis.close(); + return createImage(new MemoryImageSource(width, height, buf2, 0, width)); + } catch (IOException e) { e.printStackTrace(); } + return null; + } + + public void close() + { + } + + public boolean bye() + { + return true; + } + + public int getXOffset() + { + return x; + } + + public int getYOffset() + { + return y; + } +} |
