Проблема
По умолчанию JavaFX получает изображение из буфера обмена Windows,
Clipboard.getSystemClipboard().getImage();
, похоже, не работает.
Кажется, что-то не так спрозрачность изображения.Если изображение установлено на черном фоне, изображение выглядит нормально, но на белом фоне ничего не отображается.
![Showing the JavaFX image transparency issue by changing the background of the application from dark to light.](https://i.stack.imgur.com/TgszF.gif)
Вы можете проверить буфер обмена, используя этот минимальный, полный, проверяемый пример .
Среда: Windows 7, обновление Java 8 202
Что я знаю
Ниже я опишувещи, которые я уже знаю.
Есть другие люди, которые задавали подобные вопросы:
Тем не менее, никто не получил в центре проблемы или не получил ответ.
Нет ОфициальныйОшибка
Кажется, я не могу найти ошибку, связанную с этой проблемой, в Java Bug Database .
Нет проблем для AWT
Эта проблема сизображения не появляются в буфере обмена AWT, но я хочу решение, которое использует буфер обмена JavaFX .
![On the right is the image from AWT's clipboard, on the left is the same image from JavaFX's clipboard.](https://i.stack.imgur.com/nzj9C.png)
Буфер обмена содержит несколько форматов
Я знаю, что буфер обмена Windows содержит несколько версий одной и той же вещи, только в разных форматах.Это легко увидеть, используя InsideClipboard или Free Clipboard Viewer .
![A screenshot of InsideClipboard, showing the CF_DIB format.](https://i.stack.imgur.com/utZhE.png)
Буфер обмена JavaFX распознает определенныеформаты;иногда это имеет разные названия для них.application/x-java-rawimage
- это то, что Java считает изображением;в коде вы упоминаете это как DataFormat.IMAGE
.
Я подозреваю, что формат буфера обмена DIB
в Windows совпадает с application/x-java-rawimage
в Java, но не может найти доказательства этого в исходном коде.
Проблема широко распространена
Проблемные приложения
JavaFX, похоже, имеет ту же проблему прозрачности с различными приложениями, которые копируют изображение в буфер обмена:
Приложения без проблем
Я также нашел некоторые приложения, которые копируют изображение в буфер обмена, и JavaFX может извлечь его, используя метод по умолчанию, без проблем:
- Paint.net
- Кнопка PrtScn
- Инструмент Windows Snipping Tool
- Google Chrome 72.0.3626.121 (копирование Google.com логотип)
Ответ
Адекватный ответ должен
- объяснить просто , конкретно и с примерами , почему проблема возникает с некоторыми приложениями, но не с другими, и
- выясняет, где что-то не так в реализации JDK, и показывает, как конкретноисправить упомянутую реализацию для большинства проблемных приложений, не нарушая ее для приложений, которые уже работают.
- Если невозможно изменить реализацию JDK, адекватный ответ предоставит Минимальный, Полный и Проверяемый пример , показывающий код JavaFX, который создает
Image
из буфера обмена JavaFX, когдаИзображение скопировано из Adobe Reader.
Если вы не можете помочь, но думаете, что это хорошо изученный вопрос, подумайте о голосовании или поделитесь имс другом.