java - TYPE_4BYTE_ABGR 到 TYPE_3BYTE_BGR 的转换

标签 java awt bufferedimage graphics2d

我有一个带有透明度的 TYPE_4BYTE_ABGR 图像类型的 BufferedImage,我想将它转换成 TYPE_3BYTE_BGR BufferedImage。我尝试在 TYPE_3BYTE_BGR 图像上绘制 TYPE_4BYTE_ABGR 图像,但它改变了颜色。

目的是在白色背景上放置透明图像,因为如果将TYPE_4BYTE_AGBR图像写入.jpg,他得到的是黑色ob透明区域。

最佳答案

这是您需要的代码,您必须将具有 100% alpha 的相同颜色放入具有 alpha channel 的新图像中。

// bufferedImage is your image.
if (bufferedImage.getType() == BufferedImage.TYPE_3BYTE_BGR) {
    BufferedImage bff = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
    for (int y = 0; y < bufferedImage.getHeight(); ++y) {
        for (int x = 0; x < bufferedImage.getWidth(); ++x) {
        int argb = bufferedImage.getRGB(x, y);
        bff.setRGB(x, y, argb & 0xFF000000); // same color alpha 100%
        }
    }
    return bff;
} else {
    return bufferedImage;
}

如果你想在白色背景上放置一个透明图像,你确实应该使用不同类型的新 BufferedImage。这样做的代码是这样的:

// bufferedImage is your image.
if (bufferedImage.getType() == BufferedImage.TYPE_4BYTE_ABGR) {
    for (int y = 0; y < bufferedImage.getHeight(); ++y) {
        for (int x = 0; x < bufferedImage.getWidth(); ++x) {
            int argb = bufferedImage.getRGB(x, y);
            if((argb & 0x00FFFFFF) == 0x00FFFFFF){ //if the pixel is transparent
                bufferedImage.setRGB(x, y, 0xFFFFFFFF); // white color.
            }
        }
    }
    return bufferedImage;
}

关于java - TYPE_4BYTE_ABGR 到 TYPE_3BYTE_BGR 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347303/

相关文章:

java - Java 中的启动窗口

java - 设置 JFrame 的背景颜色

java - GridBagLayout:如何设置固定列宽?

java - 在jsp中显示多个BufferedImage

java - Jersey : How to get POST parameters on server side?

java - 慢速双缓冲方法

java - 公共(public)接口(interface) BaseRepository 扩展 JpaRepository<Category, Long>{ }

java - 用透明像素填充 BufferedImage

java - 从 ARGB BufferedImage 获取 RGBA 像素?

java - 从 JTextField 到 JFormattedTextField