2012-03-17 82 views
3

我想複製一個圖像(保存在一個BufferedImage對象)到剪貼板。我使用this answer的代碼。Java BufferedImage剪貼板給IIOException

當試圖將圖像粘貼到程序中時,根本沒有任何反應。 GIMP顯示一條消息,指出在剪貼板中找不到圖像數據。


我也嘗試了從this article的解決方法。實際上,我改變了構造這樣:

 Robot robot = new Robot(); 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     Rectangle screen = new Rectangle(screenSize); 
     BufferedImage i = robot.createScreenCapture(screen); 

     // ----- start of changes from workaround ----- 
     // Work around a Sun bug that causes a hang in "sun.awt.image.ImageRepresentation.reconstruct". 
     new javax.swing.ImageIcon(i); // Force load. 
     BufferedImage newImage = new BufferedImage(i.getWidth(null), i.getHeight(null), BufferedImage.TYPE_INT_ARGB); 
     newImage.createGraphics().drawImage(i, 0, 0, null); 
     i = newImage; 
     // ----- end of changes from workaround ----- 

     TransferableImage trans = new TransferableImage(i); 
     Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); 
     c.setContents(trans, this); 

這並不能使它的工作,但它改變的行爲:每當我,我的程序會顯示在控制檯以下異常:

javax.imageio.IIOException: Invalid argument to native writeImage 
     at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeImage(Native Method) 
     at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeOnThread(JPEGImageWriter.java:1055) 
     at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:357) 
     at javax.imageio.ImageWriter.write(ImageWriter.java:615) 
     at sun.awt.datatransfer.DataTransferer.imageToStandardBytesImpl(DataTransferer.java:2107) 
     at sun.awt.datatransfer.DataTransferer.imageToStandardBytes(DataTransferer.java:2037) 
     at sun.awt.X11.XDataTransferer.imageToPlatformBytes(XDataTransferer.java:165) 
     at sun.awt.datatransfer.DataTransferer.translateTransferable(DataTransferer.java:1277) 
     at sun.awt.datatransfer.DataTransferer$6.run(DataTransferer.java:2208) 
     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226) 
     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:647) 
     at java.awt.EventQueue.access$000(EventQueue.java:96) 
     at java.awt.EventQueue$1.run(EventQueue.java:608) 
     at java.awt.EventQueue$1.run(EventQueue.java:606) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:617) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:138) 

我在Ubuntu 11.10 64位,並試圖粘貼到各種方案,其中包括LibreOffice的繪製,LibreOffice的作家,GIMP,Inkscape中。

[email protected]:~$ java -version 
java version "1.6.0_23" 
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.2) 
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode) 

是否有人遇到同樣的麻煩嗎?我做錯了什麼,它是一個Java錯誤,是否有解決方法?


編輯:我使用的時刻相當骯髒的解決方法。我拿了一個我在stackoverflow上找到的小Python腳本,從Java將Image寫入文件,並將該文件提供給此腳本,該腳本將其複製到剪貼板。 當然,這只是平臺獨立的一切。所以我仍然希望在Java中有一個解決方案。



你的,馬克斯·韋勒

+0

drawImage()的簽名是什麼 - 您的參數與我在javadocs中快速瀏覽的任何特徵都不匹配。你是否縮小了哪一行代碼失敗? - 你的堆棧跟蹤不夠你的代碼告訴我們。 – John3136 2012-03-17 23:57:25

+0

1.它是['公共抽象布爾drawImage(圖像圖像,int i,int i1,ImageObserver io)'](http://docs.oracle.com/javase/6/docs/api/java/awt/Graphics。 html#drawImage%28java.awt.Image,%20int,%20int,%20java.awt.image.ImageObserver%29) – 2012-03-18 10:03:24

+0

2.這是我的問題 - 我附加的堆棧跟蹤是Java告訴我的全部內容。所以顯然它不直接*在我的代碼中。它*不*發生在我*複製*它( - >當我執行代碼時)。但是,當我粘貼*時會發生。這個例外完全在Java VM的代碼中。要麼我在某個地方給錯了參數,要麼虛擬機有bug。 – 2012-03-18 10:04:55

回答

0

你可能運行的OpenJDK,它不支持寫入JPEG圖像。您可以嘗試切換到Sun/Oracle Java。