![](/img/trans.png)
[英]How to read pixel color in a java BufferedImage with transparency
[英]BufferedImage and pixel manipulation with transparency
基本上我的问题是2部分。
我想知道用于操纵像素并将某种颜色转换为透明像素的首选/快速方法。
我想知道是否能够使用此“ BufferedImage”而不必将其保存为支持诸如“ png”之类的透明度的文件格式。
我找到了一种设置单个像素的方法
这里
BufferedImage layer = ImageIO.read(new File(file));
System.out.println(layer.getWidth());
BufferedImage image = new BufferedImage(layer.getWidth(), layer.getHeight(), BufferedImage.TYPE_INT_ARGB);
WritableRaster raster = image.getRaster();
int width = layer.getWidth();
int height = layer.getHeight();
// Slow method: scan all input (layer) image pixels, plotting only those which are not the transparency color
int lPixel,red,green,blue;
for(int w=0;w<width;w++)
for(int h=0;h<height;h++)
{
lPixel = layer.getRGB(w,h);
if ((lPixel&0x00FFFFFF) != trans) //transparent color
{
red = (int)((lPixel&0x00FF0000)>>>16); // Red level
green = (int)((lPixel&0x0000FF00)>>>8); // Green level
blue = (int) (lPixel&0x000000FF); // Blue level
// Set the pixel on the output image's raster.
raster.setPixel(w,h,new int[]{red,green,blue,255});
}
}
它提到的是“慢速方法”。
我发现了该线程Java:用透明像素填充BufferedImage
哪一条评论谈到“ int []”并在那里处理像素。
我注意到我可以在bufferedImage中用“ setRGB”设置每个像素,但是在“ WritableRaster ...”中有一个“ setpixel”。
为什么要确切地使用“ WritableRaster的”“ setpixel”而不是“ BufferedImage”中的“ setRGB”?
我也很好奇我将如何访问“ int []”,如果这是首选的方式呢?
有没有一种方法可以搜索某些彩色像素,而不是自己遍历每个像素来找到合适的颜色?
只是想知道首选/最快的方法是什么。
带有int []的方法声称它不会使用“硬件加速”,所以我很好奇这是否也很重要?
我认为一旦缓冲它,我就可以做任何事情,但是我很好奇其他人的想法吗?
思考?
非常感谢您的帮助!
关于第二个问题:您只需将文件加载到具有支持透明性的正确格式的BufferedImage中,例如: BufferedImage.TYPE_INT_ARGB
。 ARGB
表示“ Alpha,Red,Green,Blue”,其中alpha表示透明度。 您可以根据需要操纵该BufferedImage,文件格式只是您打算最终编写它的方式。
关于第一个问题,我不确定如何优化它,因为您将不得不访问每个像素(无论使用哪种方法)并更改值。我会选择慢速方法,因为(对我而言)似乎是不可避免的。
编辑:int []方法是您基本上将WritableRaster中的值,并将它们放在数组中。 因此,您不必调用setRGB()
,而只需调用array[i][j]=someValue
。 从理论上讲,这将提高性能,因为您将执行低级操作(访问某个数组中的值),而不是执行诸如setRGB()
高级方法调用。但是您仍然必须将该数组转换回Raster然后再转换成Raster BufferedImage。 老实说,这样做的好处似乎微不足道,因为您没有在制作高性能游戏。我只是在4K图片上尝试了“慢速”方法,这是您通常会遇到的最高分辨率,并且程序在10秒内完成(知道在最坏的情况下我会透明所有像素)。一张普通的高清图片所花的时间大约少4倍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.