gpt4 book ai didi

Java透明PNG到剪贴板

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:35 25 4
gpt4 key购买 nike

我正在尝试将 png 文件复制到程序中的剪贴板,并在粘贴到另一个程序(例如 ms office、paint、photoshop)时保持其 alpha channel 。问题是,在大多数程序中,alpha channel 变黑了。我已经在网上搜索了几个小时,但找不到解决方案。我正在使用的代码:

setClipboard(Toolkit.getDefaultToolkit().getImage(parent.getSelectedPicturePath()));

public static void setClipboard(Image image) {
ImageSelection imgSel;
if (OSDetector.isWindows()) {
imgSel = new ImageSelection(image);
} else {
imgSel = new ImageSelection(getBufferedImage(image));
}
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(imgSel, null);
}

有什么方法可以在 Java 中维护 alpha channel 吗?我试过将 png 转换为 BufferedImage、Image 等并将其粘贴到剪贴板,但没有任何效果。

最佳答案

假设 OSDetector 正常工作,我能够让 OP 的代码在运行 Oracle JDK 1.8.0_131 的 Windows Server 2008R2 64 位上开箱即用。 OP 省略了 getBufferedImage() 的代码,但我怀疑它是来自 this blog 的版本的某些变体。 .

当我在 Windows 上使用博客版本的 getBufferedImage() 测试代码时(忽略 OSDetector 检查),我能够重现问题的变体,其中整个图像都是黑色的,这证明是异步调用 Image.getWidth()Image.getHeight()Graphics 的时间问题.drawImage(),所有这些都立即返回并接受异步更新的观察者。博客代码为所有这些调用传递了 null(无观察者),并期望结果立即返回,但我测试时并非如此。

修改 getBufferedImage() 以使用回调后,我重现了确切的问题:alpha channel 显示为黑色。此行为的原因是具有透明度的图像被绘制到默认为黑色 Canvas 的图形上下文中。如果您在黑色背景的网页上查看图像,您所看到的正是您所看到的。

为了改变这一点,我使用了来自 this StackOverflow answer 的提示并将背景涂成白色。

我使用了 this site 中的 ImageSelection 实现,它使用 DataFlavor.imageFlavor 简单地将 Image 实例包装在 Transferrable 中。

最终,对于我的测试,原始图像和缓冲图像变体都可以在 Windows 上运行。下面是代码:

public static void getBufferedImage(Image image, Consumer<Image> imageConsumer) {

image.getWidth((img, info, x, y, w, h) -> {
if (info == ImageObserver.ALLBITS) {
BufferedImage buffered = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = buffered.createGraphics();
g2.setColor(Color.WHITE); // You choose the background color
g2.fillRect(0, 0, w, h);
if (g2.drawImage(img, 0, 0, w, h, (img2, info2, x2, y2, w2, h2) -> {
if (info2 == ImageObserver.ALLBITS) {
g2.dispose();
imageConsumer.accept(img2);
return false;
}
return true;
})) {
g2.dispose();
imageConsumer.accept(buffered);
}
return false;
}
return true;
});
}

public static void setClipboard(Image image) {
boolean testBuffered = true; // Both buffered and non-buffered worked for me
if (!testBuffered) {
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new ImageSelection(image), null);
} else {
getBufferedImage(image, (buffered) -> {
ImageSelection imgSel = new ImageSelection(buffered);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(imgSel, null);
});
}
}

希望对您有所帮助。祝你好运。

关于Java透明PNG到剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14489194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com