Я не уверен, что моя проблема зависит от платформы, но я думаю, что это не так.
Потому что мой опыт основан на специфике 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;
}
}
}