Определите, равны ли образы системного буфера обмена

Я не уверен, связана ли моя проблема с платформой, но я думаю, что это не так.
Поскольку мой опыт основан на специфическом для Windows java.awt.Toolkit и буфере обмена Windows.

В следующем примере класса показана проблема, с которой я столкнулся.
ПРИМЕЧАНИЕ: До запуская программу, убедитесь, что у вас нет изображения в системном буфере обмена.

Если в системном буфере обмена нет изображения, программа помещает в него новый снимок экрана.

Затем я получаю данные буфера обмена два раза!

Все 3 изображения равны! - исходный снимок экрана и каждое изображение, которое я получаю из буфера обмена.
что нормально.

Но теперь программа запускается во второй раз. ПРИМЕЧАНИЕ: В буфере обмена есть старый снимок экрана!

Программа генерирует новый снимок экрана и дважды получает старый из буфера обмена.

Нет изображений, равных любому! - Первый (новый снимок экрана) не должен быть одинаковым, это нормально

Но каждое следующее изображение, которое я получаю, не равнозначно.

Q1: Если каждое следующее изображение, которое я получаю, не равноценно, почему оно было одинаковым в первый раз?
Q2: Главный вопрос: как я могу сравнить java.awt.Image чтобы все следующие изображения были равны.

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

public class Example {

    public static void main( String[] args ) throws Exception {

        final Toolkit   toolkit   = Toolkit.getDefaultToolkit();
        final Clipboard clipboard = toolkit.getSystemClipboard();
        final Image     origImage = new Robot().createScreenCapture( new Rectangle( toolkit.getScreenSize() ) );

        if( !clipboard.isDataFlavorAvailable( DataFlavor.imageFlavor )
            || clipboard.getData( DataFlavor.imageFlavor ) == null ) {
            clipboard.setContents( new ImageSelection( origImage ), null );
        }

        Image clipImage1 = (Image)clipboard.getData( DataFlavor.imageFlavor );
        Image clipImage2 = (Image)clipboard.getData( DataFlavor.imageFlavor );

        System.out.println(origImage.hashCode());
        System.out.println(clipImage1.hashCode());
        System.out.println(clipImage2.hashCode());
        System.out.println(clipImage1.equals( clipImage2 ));


    }

    public static class ImageSelection implements Transferable {
        private Image image;
        public ImageSelection(Image image) {
            this.image = image;
        }
        @Override
        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[]{DataFlavor.imageFlavor};
        }
        @Override
        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return DataFlavor.imageFlavor.equals(flavor);
        }
        @Override
        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
            if (!DataFlavor.imageFlavor.equals(flavor)) {
                throw new UnsupportedFlavorException(flavor);
            }
            return image;
        }
    }    
}
10
задан oliholz 26 August 2011 в 12:56
поделиться