Ошибка при передаче изображения с использованием буфера обмена, инструментария и переносимого - PullRequest
0 голосов
/ 13 июня 2010

Я получаю это сообщение об ошибке из следующего кода:

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)

Какие изменения кода или изменения в файле изображения необходимы для исправления этой ошибки?Обратите внимание, что этот код предоставлен Оскаром Рейесом, но любые ошибки мои.

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

НОВАЯ ПОПЫТКА

Я СЕЙЧАС изменил код на следующий:Обратите внимание на использование createImage() и prepareImage(). Ошибки ширины и высоты теперь исправлены.

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 (из файла .jpg), представляет собой пианино.

Изображение, вставленное из буфера обмена после запуска вышеуказанной программы для установки содержимого буфера обмена, имеет тот же размер, но пусто!

Каким-то образом изображение было удалено из его содержимого.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 13 июня 2010

Я переписал программу, используя код из ExampleDepot.com:

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 просто для проверки того, что было прочитано из файла, и тогда что было положено в буфер обмена.

0 голосов
/ 13 июня 2010

. Внимательно посмотрите на метод инструментария, используемый для чтения на изображении.Скорее всего, вам нужен метод Synchroneus для чтения в виде значка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...