2016-06-27 44 views
1

比方说,我有一个PNG图像具有透明度,就像这样: sword with transparent background填写复杂的图像色彩

我想,在Java中,只填充有黑色的物体,像这样: sword filled with black

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

我该如何做到这一点?

附加信息:这将是一个快速和肮脏的方式来创建阴影。如果你能想到更好的方法,那将完全解决这个问题。

+2

非透明像素上的基本遮罩会起作用吗?另外,在Photoshop中它不是一个简单的过程; Photoshop使它看起来像一个*微不足道的过程。 –

+0

的确如此。面具肯定可以工作 - 我将如何从图像生成蒙版? –

+0

你可以遍历每个像素并检查alpha值吗?如果它不透明,请将像素设置为黑色? – meepzh

回答

2

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

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%的所有像素。

+0

通过几次编辑(_alpha!= 0_,_fillColor.getRGB()_),它对我来说非常合适!谢谢。当我问meepzh,这会遇到效率问题与大图像或一次做几个? –

+0

Oups,我编辑了代码以反映更改!最好的方法是尝试一下,但它是用Java实现你想要的最快的方法,所以你不应该遇到任何性能问题。 – Simon

+0

太好了,谢谢! –

0

在Photoshop中,您可以使用一些名为Actions的东西。 This can get you started。由于每个PNG文件的主图层都称为图层0,因此每个文件都适用。记录一个动作,您将图层0的图层样式设置为黑色。然后保存文件并停止录制动作。使用文件>>自动化>>批处理在许多文件上执行此操作。我建议保存文件的备份以防万一你犯了错误。

+0

这将是一个伟大的方式来创建一个.png文件,我打算这样做的每个图像。谢谢你的链接! 但是,如果我有大量的这些图像,将它们打包在一个java项目中会导致大的文件大小。有没有办法通过Java操作来完成它? –