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