首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中更改png的非透明部分的颜色

在Java中更改png的非透明部分的颜色
EN

Stack Overflow用户
提问于 2013-04-17 15:58:48
回答 4查看 16.8K关注 0票数 19

我正在尝试自动更改一组图标的颜色。每个图标都有一个白色的填充层,另一部分是透明的。下面是一个示例:(在本例中,它是绿色的,只是为了让它可见)

我试着做了以下事情:

private static BufferedImage colorImage(BufferedImage image) {
        int width = image.getWidth();
        int height = image.getHeight();

        for (int xx = 0; xx < width; xx++) {
            for (int yy = 0; yy < height; yy++) {
                Color originalColor = new Color(image.getRGB(xx, yy));
                System.out.println(xx + "|" + yy + " color: " + originalColor.toString() + "alpha: "
                        + originalColor.getAlpha());
                if (originalColor.equals(Color.WHITE) && originalColor.getAlpha() == 255) {
                    image.setRGB(xx, yy, Color.BLUE.getRGB());
                }
            }
        }
        return image;
    }

我的问题是,我得到的每个像素都有相同的值:

32|18 color: java.awt.Color[r=255,g=255,b=255]alpha: 255

所以我的结果就是一个彩色正方形。如何实现只改变非透明部分的颜色?为什么所有的像素都有相同的alpha值?我想这就是我的主要问题:alpha值没有被正确读取。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-17 16:12:13

问题是,

Color originalColor = new Color(image.getRGB(xx, yy));

丢弃所有alpha值。相反,您必须使用

 Color originalColor = new Color(image.getRGB(xx, yy), true);

以保持alpha值可用。

票数 15
EN

Stack Overflow用户

发布于 2013-04-17 16:16:03

为什么它不能工作,我不知道,这个可以。

这会将所有像素更改为蓝色,并保持其alpha值不变。

import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class TestColorReplace {

    public static void main(String[] args) {
        try {
            BufferedImage img = colorImage(ImageIO.read(new File("NWvnS.png")));
            ImageIO.write(img, "png", new File("Test.png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private static BufferedImage colorImage(BufferedImage image) {
        int width = image.getWidth();
        int height = image.getHeight();
        WritableRaster raster = image.getRaster();

        for (int xx = 0; xx < width; xx++) {
            for (int yy = 0; yy < height; yy++) {
                int[] pixels = raster.getPixel(xx, yy, (int[]) null);
                pixels[0] = 0;
                pixels[1] = 0;
                pixels[2] = 255;
                raster.setPixel(xx, yy, pixels);
            }
        }
        return image;
    }
}
票数 20
EN

Stack Overflow用户

发布于 2020-12-03 02:58:27

如果已经在ImageView中设置了位图,只需执行以下操作:

imageView.setColorFilter(Color.RED);

若要将所有非透明像素设置为红色,请执行以下操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16054596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档