package T; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Vector; import javax.imageio.ImageIO; public class Main { public static void main(String[] args) { String[] cmd = { "C:/Program Files/POV-Ray for Windows v3.6/bin/pvengine.exe", "/exit", "/render", "-V", "-D", "+W" + 392, "+H" + 241, "+SC" + 1, "+EC" + 392, "+SR" + 1, "+ER" + 241, "+FP", "+O" + "c:/hello.jpg", "E:/wq/JAVAGrid/demos/povray/plants/jcgrid.ini" }; ConsoleCmd cc = new ConsoleCmd(cmd, null, "E:/wq/JAVAGrid/demos/povray/plants"); try { cc.run(); File tmpFile = new File("c:/hello.jpg");// 临时文件 FileInputStream fis = new FileInputStream(tmpFile); byte[] ppmData = ByteVector.readAll(fis); tmpFile.deleteOnExit(); BufferedImage renderingFrameBuffer = new BufferedImage(392, 241, BufferedImage.TYPE_3BYTE_BGR); Graphics2D renderingFrameBufferG2D = renderingFrameBuffer .createGraphics(); for (int y = 0; y < renderingFrameBuffer.getHeight(); y += 10) { for (int x = 0; x < renderingFrameBuffer.getWidth(); x += 10) { if (((x / 10 + y / 10) % 2) == 0) renderingFrameBufferG2D.setColor(Color.BLACK); else renderingFrameBufferG2D.setColor(Color.WHITE); renderingFrameBufferG2D.fillRect(x, y, 10, 10); } } int ppmIdx = 0; for (int j = 0; j < 3; ppmIdx++) { if (ppmData[ppmIdx] == '/n') j++; } for (int y = 1; y <= 241; y++) { for (int x = 0; x < 392; x++) { int r = ppmData[ppmIdx++] & 0xff; int g = ppmData[ppmIdx++] & 0xff; int b = ppmData[ppmIdx++] & 0xff; if ((x >= 1) && (x <= 392)) { renderingFrameBufferG2D.setColor(new Color(r, g, b)); renderingFrameBufferG2D.fillRect(x, y, 1, 1); } } } ImageIO.write(renderingFrameBuffer, "JPEG", new File("c:/h.jpeg")); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } private static class ConsoleCmd extends Object { private class WritterThread extends Thread { private OutputStream os; private byte[] data; public WritterThread(OutputStream osVal, byte[] dataVal) { os = osVal; data = dataVal; } public void run() { try { if (data != null) { os.write(data); os.flush(); } os.close(); } catch (Throwable ex) { ex.printStackTrace(); } } } private class ReaderThread extends Thread { private InputStream is; private byte[] data; public ReaderThread(InputStream isVal) { is = new BufferedInputStream(isVal); } public void run() { try { data = ByteVector.readAll(is); } catch (Throwable ex) { ex.printStackTrace(); } } public byte[] getData() { return data; } } // -------------------------------------------------------------------------- private String[] cmd; private Process proc; private byte[] stdin; private byte[] stdout; private byte[] stderr; private File curDir; public ConsoleCmd(String[] cmdVal, byte[] stdinVal, String dir) { stdin = stdinVal; cmd = cmdVal; proc = null; if (dir == null) curDir = null; else curDir = new File(dir); } public ConsoleCmd(String[] cmdVal, byte[] stdinVal) { this(cmdVal, stdinVal, null); } public ConsoleCmd(String[] cmdVal) { this(cmdVal, null, null); } public String getCmdLine() { StringBuffer sb = new StringBuffer(); boolean first = true; for (int i = 0; i < cmd.length; i++) { if (first) first = false; else sb.append(" "); sb.append(cmd[i]); } return sb.toString(); } public byte[] getStdOut() { return stdout; } public byte[] getStdErr() { return stderr; } public int run() throws IOException, InterruptedException { if (curDir == null) proc = Runtime.getRuntime().exec(cmd); else proc = Runtime.getRuntime().exec(cmd, null, curDir); OutputStream si = proc.getOutputStream(); InputStream so = proc.getInputStream(); InputStream se = proc.getErrorStream(); // Thread stdin WritterThread it = new WritterThread(si, stdin); it.start(); // Thread stdout ReaderThread ot = new ReaderThread(so); ot.start(); // Thread stderr ReaderThread et = new ReaderThread(se); et.start(); // Wait execution end int exitVal = proc.waitFor(); it.join(); ot.join(); et.join(); stdout = ot.getData(); stderr = et.getData(); return exitVal; } } private static class ByteVector extends Object { public static byte[] readAll(InputStream is) throws Exception { ByteVector bv = new ByteVector(); byte[] buf = new byte[32 * 1024]; for (;;) { int len = is.read(buf); if (len < 1) break; bv.add(buf, len); } is.close(); return bv.getData(); } private class Packet { private byte[] data = null; Packet(byte[] d) { data = d; } public byte[] getData() { return data; } } private Vector<Packet> vPacket = null; private int sizeInByte = 0; public ByteVector() { vPacket = new Vector<Packet>(); sizeInByte = 0; } public int size() { return sizeInByte; } public void add(byte[] d) { vPacket.add(new Packet(d)); sizeInByte += d.length; } public void add(byte[] d, int len) { byte[] buf = new byte[len]; System.arraycopy(d, 0, buf, 0, len); vPacket.add(new Packet(buf)); sizeInByte += len; } public byte[] getData() { byte[] data = new byte[sizeInByte]; int idx = 0; for (int i = 0; i < vPacket.size(); i++) { Packet p = (Packet) vPacket.elementAt(i); byte[] pData = p.getData(); System.arraycopy(pData, 0, data, idx, pData.length); idx += pData.length; } return data; } } }