Как правильно получить изображение из буфера обмена в JavaFX; В чем разница между приложениями, которые борются, и теми, которые не борются?

Эта проблема

JavaFX способ получения изображения по умолчанию из буфера обмена Windows,

Clipboard.getSystemClipboard().getImage();

кажется сломанным.

Кажется, что-то пошло не так с прозрачностью изображения. При установке на черном фоне изображение выглядит нормально, но при установке на белом фоне ничего не отображается.

Showing the JavaFX image transparency issue by changing the background of the application from dark to light.

Вы можете проверить буфер обмена, используя этот пример Minimal, Complete, Verifiable.

Среда: Windows 7, Java 8, обновление 202

Что я знаю

Ниже я опишу вещи, которые я уже знаю.

Есть другие люди, которые задавали подобные вопросы:

Тем не менее, никто не получил в центре проблемы или получил ответ.

Нет официальной ошибки

Я не могу найти ошибку по этой проблеме в базе данных ошибок Java.

Нет проблем для AWT

Эта проблема с изображениями не возникает в буфере обмена AWT, но я хочу решение, которое использует буфер обмена JavaFX.

On the right is the image from AWT's clipboard, on the left is the same image from JavaFX's clipboard.

Буфер обмена содержит несколько форматов

Я знаю, что буфер обмена Windows содержит несколько версий одного и того же, только в разных форматах. Это легко увидеть, используя InsideClipboard или Free Clipboard Viewer.

A screenshot of InsideClipboard, showing the CF_DIB format.

Буфер обмена JavaFX распознает определенные форматы; иногда это имеет разные названия для них. application/x-java-rawimage - это то, что Java считает изображением; в коде вы называете это DataFormat.IMAGE.

Я подозреваю, что формат буфера обмена DIB в Windows совпадает с Java application/x-java-rawimage, но не могу найти доказательства этого в исходном коде.

Проблема широко распространена

Проблемные приложения

JavaFX, похоже, имеет ту же проблему прозрачности с различными приложениями, которые копируют изображение в буфер обмена:

Приложения без проблем

Я также обнаружил, что некоторые приложения копируют изображение в буфер обмена, и JavaFX может без проблем извлечь его, используя метод по умолчанию:

  • Paint.net
  • Кнопка PrtScn
  • Windows Snipping Tool
  • Google Chrome 72.0.3626.121 (копирование логотипа Google.com)

Ответ

Адекватный ответ должен

  • объяснить просто, конкретно и с примерами, почему проблема возникает с некоторыми приложениями, но не с другими, и
  • Выясните, где что-то идет не так в реализации JDK, и покажите, как исправить эту реализацию для большинства проблемных приложений, не нарушая ее для приложений, которые уже работают.
    • Если не представляется возможным изменить реализацию JDK, адекватный ответ предоставит пример Minimal, Complete и Verifiable, показывающий код JavaFX, который создает Image из буфера обмена JavaFX при копировании изображения из Adobe Reader.

Если вы не можете помочь, но думаете, что это хорошо изученный вопрос, подумайте о голосовании или поделитесь им с другом.

Ответы