用颜色填充复杂图像

Fill complex image with color

假设我有一个透明的 PNG 图像,如下所示:

我想在 Java 中只用黑色填充对象,如下所示:

这在 Photoshop 中是一个相当微不足道的过程,但这是我想经常重复的过程,最好不要为每个我想为之做的对象制作黑色填充图片。我尝试了几种边缘检测 类 但没有成功。

我该如何完成?

附加信息:这将是一种创建阴影的快捷方式。如果你能想到更好的办法,那就彻底解决了这个问题。

在 Photoshop 中,您可以使用一种叫做“动作”的东西。 This can get you started。由于每个 PNG 文件的主要层都称为第 0 层,因此这应该适用于每个文件。记录您将图层 0 的图层样式设置为黑色的操作。然后保存文件并停止记录动作。使用 File >> Automate >> Batch 对许多文件执行此操作。我建议保存文件备份以防出错。

您可以制作一个循环遍历所有像素并用黑色填充它们的函数。

BufferedImage image = ...
Color fillColor = new Color(0, 0, 0); // Black

for (int y = 0; y < image.getHeight(); y++) {
    for (int x = 0; x < image.getWidth(); x++) {
        int color = image.getRGB(x, y);
        int alpha = (color >> 24) & 0xff;

        if (alpha == 255) {
            image.setRGB(x, y, fillColor.getRGB());
        }
    }
}

显然,这只适用于完全不透明的像素。如果顶部的图像包含一些透明度,您还可以将条件更改为更宽容:if (alpha > 127)。这将填充所有透明度低于 50% 的像素。