【问题标题】:Using SWT's ImageData, how to tell if a png, gif, bmp files have transparency?使用 SWT 的 ImageData,如何判断 png、gif、bmp 文件是否具有透明度?
【发布时间】:2016-07-04 14:25:18
【问题描述】:

正如标题所说。

我尝试确定给定的图像文件是否具有透明度(非不透明)。

这是正确的方法吗:

public static boolean hasAlpha(ImageData imageData) {
    if (imageData.alpha != -1 || imageData.transparentPixel != -1)
        return true;
    if (imageData.alphaData == null && imageData.maskData == null)
        return false;
    if (imageData.alphaData != null)
        for (int i = 0; i < imageData.alphaData.length; ++i) {
            byte alpha = imageData.alphaData[i];
            if (alpha !=0xFF)
                return true;
        }
    if (imageData.maskData != null)
        for (int i = 0; i < imageData.maskData.length; ++i)
            if (imageData.maskData[i] != 0xFF)
                return true;
    return false;
}

?

有没有比遍历整个 alpha 通道更好的方法(使用我制作的循环)?也许一种甚至不需要将整个图像文件解码为解码的大位图的方法?

【问题讨论】:

  • 您可能还需要查看maskData 中的透明度掩码数据。
  • @greg-449 它是如何使用的?无论如何,如果它不为空,是否意味着它具有 alpha?我认为这只是图像的附加元数据,显示它的一个小版本,不是吗?所以我认为不需要检查。
  • 不,它似乎是一个位掩码,主图像中每像素一个位,其中 1 位表示 alpha 为 255,0 表示 alpha 0。通常通过调用 ImageData.getTransparencyMask 使用跨度>
  • @greg-449 你确定吗?根据这个:help.eclipse.org/juno/…,它说它是一个图标:“一个包含来自图标掩码的数据的特定于图标的字段。” .另外,如果它是主图像,“alphaData”是什么?好像是alpha像素的确切含义,每个alpha对应一个像素……
  • @greg-449 也许“图标”适用于特定的文件格式?但是为什么要这样做呢?为了节省比特?每个位都有一个像素:不透明/透明?

标签: java image swt transparency alpha


【解决方案1】:

我发现了一些问题。

ImageData.alpha 可以设置为 255,这意味着完全不透明,只有 0-254 透明。

ImageData.alphaData 对于每个字节,只有值 255 是完全不透明的。

ImageData.maskData 每个字节的所有位都必须为 1 才能使掩码不透明。

您可能还想知道“透明”是什么意思。 alpha 值为 254 意味着图像只是非常透明,值为 0 意味着图像根本不可见。

【讨论】:

  • “透明”是指它不是 100% 不透明的,就像玻璃一样,即使它有点脏,也是透明的,你可以看穿它。你能显示正确的代码吗?我已经修改了代码,因为我认为我是按照相反的逻辑编写的。现在可以了吗?
  • 说,如果我添加一个检查 imageData.type==SWT.IMAGE_JPEG ,这也可以确定图像是否没有透明度(因为 jpg 不支持它),但对于某些原因,我得到 -1 的类型。怎么可能?
猜你喜欢
  • 2015-09-25
  • 2021-08-07
  • 2018-07-07
  • 2010-12-22
  • 1970-01-01
  • 2018-12-27
  • 2015-01-26
  • 2011-10-20
  • 1970-01-01
相关资源
最近更新 更多