Java,SWT,调整大小时图像透明度丢失

标签 java swt

我正在显示具有透明度的 .png 图像,默认情况下效果很好......直到我调整图像大小:

public Image resize(Image image, int width, int height)
{
    Image scaled = new Image(Display.getDefault(), width, height);
    scaled.getImageData().transparentPixel = image.getImageData().transparentPixel;
    GC gc = new GC(scaled);
    gc.setAntialias(SWT.ON);
    gc.setInterpolation(SWT.HIGH);
    gc.drawImage(image, 0, 0,image.getBounds().width, image.getBounds().height, 0, 0, width, height);
    gc.dispose();
    return scaled;
}

然后透明度消失了,我可以看到“白色”颜色

最佳答案

getImageData() 为您提供图像数据的副本,因此在其上设置透明像素不会更改原始图像。

相反,您需要使用透明像素集从缩放图像数据创建另一个图像。所以类似:

Image scaled = new Image(Display.getDefault(), width, height);
GC gc = new GC(scaled);
gc.setAntialias(SWT.ON);
gc.setInterpolation(SWT.HIGH);
gc.drawImage(image, 0, 0,image.getBounds().width, image.getBounds().height, 0, 0, width, height);
gc.dispose();

// Image data from scaled image and transparent pixel from original

ImageData imageData = scaled.getImageData();

imageData.transparentPixel = image.getImageData().transparentPixel;

// Final scaled transparent image

Image finalImage = new Image(Display.getDefault(), imageData);

scaled.dispose();

请注意,这仅在原始图像数据与缩放图像数据(特别是调色板数据)具有相同格式时才有效

如果数据采用不同的格式,请使用:

ImageData origData = image.getImageData();

imageData.transparentPixel = imageData.palette.getPixel(origData.palette.getRGB(origData.transparentPixel));

关于Java,SWT,调整大小时图像透明度丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39589814/

相关文章:

java - 用 Java 解析 MIME 发送方 (RFC 822)

java - SWT - 如何在向导中创建两个复合 Material

java - 如何访问标准 Eclipse 图标

java - 如何使用 Hibernate 检索类的成员对象?

java - 带数组字符串的缓冲读取器

java - 代码如何工作 - 应用于样式时为 "SWT.MULTI | SWT.SINGLE"

java - SWT:透明外壳也使小部件透明

java - 无法使用 SWT_GTK3 自定义 Eclipse 透视图

java - 如何通过处理java来减慢 Sprite 动画的速度

java - Whitespace Surround Android 相机预览