Как правильно получить изображение из буфера обмена в JavaFX; В чем разница между приложениями, которые борются, и теми, которые не борются?
Эта проблема
JavaFX способ получения изображения по умолчанию из буфера обмена Windows,
Clipboard.getSystemClipboard().getImage();
кажется сломанным.
Кажется, что-то пошло не так с прозрачностью изображения. При установке на черном фоне изображение выглядит нормально, но при установке на белом фоне ничего не отображается.
Вы можете проверить буфер обмена, используя этот пример Minimal, Complete, Verifiable.
Среда: Windows 7, Java 8, обновление 202
Что я знаю
Ниже я опишу вещи, которые я уже знаю.
Есть другие люди, которые задавали подобные вопросы:
- Получение изображения из буфера обмена Awt vs FX
- Изображение из буфера обмена неправильно отображается в приложении JavaFX 8
Тем не менее, никто не получил в центре проблемы или получил ответ.
Нет официальной ошибки
Я не могу найти ошибку по этой проблеме в базе данных ошибок Java.
Нет проблем для AWT
Эта проблема с изображениями не возникает в буфере обмена AWT, но я хочу решение, которое использует буфер обмена JavaFX.
Буфер обмена содержит несколько форматов
Я знаю, что буфер обмена Windows содержит несколько версий одного и того же, только в разных форматах. Это легко увидеть, используя InsideClipboard или Free Clipboard Viewer.
Буфер обмена JavaFX распознает определенные форматы; иногда это имеет разные названия для них. application/x-java-rawimage
- это то, что Java считает изображением; в коде вы называете это DataFormat.IMAGE
.
Я подозреваю, что формат буфера обмена DIB
в Windows совпадает с Java application/x-java-rawimage
, но не могу найти доказательства этого в исходном коде.
Проблема широко распространена
Проблемные приложения
JavaFX, похоже, имеет ту же проблему прозрачности с различными приложениями, которые копируют изображение в буфер обмена:
- Adobe Reader (из PDF с изображениями)
- Foxit Reader (из PDF с изображениями)
- Microsoft Word 365 (из файла
.docx
с изображениями) - Windows 7 Paint (
.png
,.jpg
,.gif
,.bmp
) - Greenshot (расширенная утилита для создания скриншотов)
- Firefox 65.0.2 (копирование логотипа Google.com)
Приложения без проблем
Я также обнаружил, что некоторые приложения копируют изображение в буфер обмена, и 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.
- Если не представляется возможным изменить реализацию JDK, адекватный ответ предоставит пример Minimal, Complete и Verifiable, показывающий код JavaFX, который создает
Если вы не можете помочь, но думаете, что это хорошо изученный вопрос, подумайте о голосовании или поделитесь им с другом.