Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用颜色填充复杂的图像_Java_Graphics_Png_Fill_Edge Detection - Fatal编程技术网

Java 用颜色填充复杂的图像

Java 用颜色填充复杂的图像,java,graphics,png,fill,edge-detection,Java,Graphics,Png,Fill,Edge Detection,假设我有一个透明的PNG图像,如下所示: 在Java中,我只想用黑色填充对象,如下所示: 这在Photoshop中是一个相当简单的过程,但这是一个我想经常重复的过程,理想情况下不需要为我想做的每个对象制作黑色填充图片。我尝试了几个边缘检测类,但没有成功 我将如何做到这一点 附加信息:这将是一个快速而肮脏的方法来创建阴影。如果你能想出更好的办法,那将彻底解决这个问题 在Photoshop中,你可以使用一种叫做动作的东西。因为每个PNG文件的主层都称为0层,所以这应该适用于每个文件。录制将图层0

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

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

这在Photoshop中是一个相当简单的过程,但这是一个我想经常重复的过程,理想情况下不需要为我想做的每个对象制作黑色填充图片。我尝试了几个边缘检测类,但没有成功

我将如何做到这一点


附加信息:这将是一个快速而肮脏的方法来创建阴影。如果你能想出更好的办法,那将彻底解决这个问题

在Photoshop中,你可以使用一种叫做动作的东西。因为每个PNG文件的主层都称为0层,所以这应该适用于每个文件。录制将图层0的图层样式设置为黑色的操作。然后保存文件并停止录制操作。使用文件>>自动>>批处理在许多文件上执行此操作。我建议您保存一份文件备份,以防出错。

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

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());
        }
    }
}
buffereImage图像=。。。
颜色填充颜色=新颜色(0,0,0);//黑色
对于(int y=0;y>24)&0xff;
如果(α=255){
setRGB(x,y,fillColor.getRGB());
}
}
}

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

在不透明像素上使用基本遮罩可以吗?而且,这在Photoshop中不是一个简单的过程;Photoshop让它看起来像一个琐碎的过程,这是真的。遮罩当然可以工作——我如何从图像生成遮罩?你能迭代每个像素并检查alpha值吗?如果它不是透明的,将像素设置为黑色?这似乎是可能的,但我感觉可能需要很长时间才能获得大图像或同时获得多个图像。我说的对吗?如果是的话,有没有提高效率的方法?这将是一个很好的方法,可以为我想要的每个图像创建一个.png文件。谢谢你的链接!但是,如果这些图像的数量太多,那么将它们打包到java项目中会导致文件太大。有没有一种方法可以通过Java操作来实现呢?通过一些编辑(alpha!=0,fillColor.getRGB()),它非常适合我!非常感谢。正如我问meepzh的那样,这会在处理大型图像时遇到效率问题还是同时处理多个图像?我编辑了代码以反映更改!最好的方法是尝试,但这几乎是用Java实现所需功能的最快方法,因此您不应该遇到任何性能问题。关于大图像的效率:使用