2010-06-13 6 views
-1

내가 다음 코드에서이 오류 메시지가 얻을 양도 사용하여 이미지를 transfering :이 오류를 수정하는 데 필요한오류는 클립 보드, 툴킷 및

 
Exception in thread "main" java.lang.IllegalArgumentException: Width (-1) and height (-1) cannot be <= 0 
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:999) 
    at sun.awt.datatransfer.DataTransferer.imageToStandardBytes(DataTransferer.java:1994) 
    at sun.awt.windows.WDataTransferer.imageToPlatformBytes(WDataTransferer.java:267) 
    at sun.awt.datatransfer.DataTransferer.translateTransferable(DataTransferer.java:1123) 
    at sun.awt.windows.WDataTransferer.translateTransferable(WDataTransferer.java:163) 
    at sun.awt.windows.WClipboard.setContentsNative(WClipboard.java:73) 
    at sun.awt.datatransfer.SunClipboard.setContents(SunClipboard.java:93) 
    at automateSignature.LoadToClipboard.main(LoadToClipboard.java:8) 

어떤 코드를 변경하거나 이미지 파일을 변경? 이 code은 오스카 레이즈 (Oscar Reyes)가 기고했지만 모든 오류는 내 것이란 점에 유의하십시오.

import java.awt.*; 
import java.awt.datatransfer.*; 

public class LoadToClipboard { 

    public static void main(String[] args) { 
     Toolkit tolkit = Toolkit.getDefaultToolkit(); 
     Clipboard clip = tolkit.getSystemClipboard(); 
     clip.setContents(new ImageSelection(
      tolkit.getImage("MKSignature.jpg")), null); 
    } 
} 

class ImageSelection implements Transferable { 

    private Image image; 

    public ImageSelection(Image image) { 
     this.image = image; 
    } 

    // Returns supported flavors 
    public DataFlavor[] getTransferDataFlavors() { 
     return new DataFlavor[]{DataFlavor.imageFlavor}; 
    } 

    // Returns true if flavor is supported 
    public boolean isDataFlavorSupported(DataFlavor flavor) { 
     return DataFlavor.imageFlavor.equals(flavor); 
    } 

    // Returns image 
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { 
     if (!DataFlavor.imageFlavor.equals(flavor)) { 
      throw new UnsupportedFlavorException(flavor); 
     } 
     return image; 
    } 
} 

나는 폭과 높이가 지정 될 수있는 코드에서 장소를 찾을려고 노력했지만 성공하지 않았습니다. 또한 jpg 파일의 속성을 검사하고 w와 h가 지정되었습니다. enter code here

나는 지금 다음에 코드를 변경

NEW ATTEMPT : createImage()prepareImage()의 사용을합니다. 너비 및 높이 오류가 이제 으로 고정되었습니다. 지금 클립 보드에 배치되는 이미지는 JPG 파일의 이미지와 동일하지 않습니다 그러나

public static void main(String[] args) { 
    Toolkit tolkit = Toolkit.getDefaultToolkit(); 
    Clipboard clip = tolkit.getSystemClipboard(); 
    //File file = new File(
    // "C:\\aaaa\\Admin\\SIGNATUREForInsertionIntoDocs\\MKSignature.jpg"); 
    signatureImage = tolkit.createImage(
     "C:\\aaaa\\Admin\\SIGNATUREForInsertionIntoDocs\\MKSignature.jpg"); 
    tolkit.prepareImage(signatureImage, 108, 60, null); 
    // JOptionPane.showConfirmDialog(null, "Press to continue"); 
    ImageSelection i = new ImageSelection(signatureImage); 
    clip.setContents(i, null); 
} 

. 크기는 같지만 내용은 동일하지 않습니다.

합니다 (.jpg 파일로부터) GIMP에 표시된 화상 피아노이다.

위의 프로그램을 실행 한 후 클립 보드에서 붙여 넣은 이미지는 크기가 같지만 공백입니다.

어떻게 든 이미지의 내용이 삭제되었습니다. 내가 뭘 잘못하고 있니?

+0

어둠 속에서 그냥 쐈다 : 이미지를로드하고 코드 (현재 한 줄)를 실행하는 사이에 wait()를 추가하십시오. AFAIK java awt는 이미지를 완전히로드하기 전에 코드가 실행될 수 있다는 것을 의미하는 별도의 스레드에서 이미지를 비동기 적으로로드합니다. afaik 동기식 javax.imageio.ImageIO를 살펴볼 수 있습니다. – ZeissS

+0

감사합니다. 'JOptionPane.showConfirmDialog (null, "계속하려면 누르십시오"); wait() 대신에. 나는 그것을 잠시 동안 기다려 보았지만 그 실수는 똑같다. –

+0

코드를 변경 했으므로 높이와 너비 오류가 수정되었습니다. 이미지가 클립 보드에 붙여 넣어집니다. 그러나 jpg 이미지와 크기는 같지만 그림은 공백으로 바뀝니다. 본 부록에 대한 본래의 질문의 수정 된 버전을 확인하십시오. –

답변

0

툴킷 방법을 자세히 살펴보십시오. 이미지를 읽는 데 사용됩니다. 대부분의 경우 synchroneus 메서드를 아이콘으로 읽는 것이 좋습니다.

내가 ExampleDepot.com에서 코드를 사용하여 프로그램을 다시 한
0

:

package source; 

import java.awt.BorderLayout; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class ImageFromFileToClipboard { 

    public static void main(String[] args) { 
     Image image = null; 
     Image imageFromClipboard = null; 
     try { 
      File file = new File("C:\\Documents and Settings\\Mike King\\My Documents\\My Pictures\\PianoSmallThumbnail.jpg"); 
      image = ImageIO.read(file); 
     } 
     catch (IOException e) { 

     } 

     // Use a label to display the image 
     JFrame frame = new JFrame(); 
     JLabel label = new JLabel(new ImageIcon(image)); 
     frame.getContentPane().add(label, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 

     System.out.println(image.toString()); 

     setClipboard(image); 

     imageFromClipboard = getClipboard(); 
     // Use a label to display the image 
     JFrame frame2 = new JFrame(); 
     JLabel label2 = new JLabel(new ImageIcon(imageFromClipboard)); 

     frame2.getContentPane().add(label2, BorderLayout.CENTER); 
     frame2.pack(); 
     frame2.setVisible(true); 
    } 

    // If an image is on the system clipboard, this method returns it; 
    // otherwise it returns null. 
    public static Image getClipboard() { 
     Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); 
     try { 
      if (t != null && t.isDataFlavorSupported(DataFlavor.imageFlavor)) { 
       Image text = (Image) t.getTransferData(DataFlavor.imageFlavor); 
       return text; 
      } 
     } 
     catch (UnsupportedFlavorException e) { } 
     catch (IOException e) { } 

     return null; 
    } 

    // This method writes a image to the system clipboard 
    public static void setClipboard(Image image) { 
     ImageSelection imgSel = new ImageSelection(image); 
     Toolkit.getDefaultToolkit().getSystemClipboard().setContents(imgSel, null); 
    } 

    // This class is used to hold an image while on the clipboard.  
    public static class ImageSelection implements Transferable { 
     private Image image; 

     public ImageSelection(Image image) { 
      this.image = image; 
     } 

     public DataFlavor[] getTransferDataFlavors() { 
      return new DataFlavor[]{DataFlavor.imageFlavor}; 
     } 

     public boolean isDataFlavorSupported(DataFlavor flavor) { 
      return DataFlavor.imageFlavor.equals(flavor); 
     } 

     public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 
      if (!DataFlavor.imageFlavor.equals(flavor)) { 
       throw new UnsupportedFlavorException(flavor); 
      } 

      return image; 
     } 
    } 
} 

jpg이 파일의 이미지가 성공적으로 클립 보드에 배치 읽습니다. 클립 보드에서 임의의 문서에 수동으로 붙여 넣기가 올바르게 작동합니다. JFrame을 사용하면 파일에서 읽은 내용을 확인하고 클립 보드에 무엇을 넣었는지 확인할 수 있습니다.