Я не уверен, что моя проблема связана с платформой, но я думаю, что это не так.
Поскольку мой опыт основан на специфических для Windows java.awt.Toolkit
и Windows-Clipboard.
Следующий примерный класс показывает проблему, с которой я столкнулся.
ПРИМЕЧАНИЕ. Перед запуском программы убедитесь, что у вас нет изображения в системном буфере обмена.
Если в системном буфере обмена нет изображения, программа добавит к нему новый снимок экрана.
Затем я получаю данные Clipboard два раза!
Все 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;
}
}
}