基本上我的问题分为两部分。
>
我想知道将要操纵像素并将特定颜色转换为透明像素的首选/快速方法。
我想知道我是否能够使用这个“BuffereImage”,而不必将其保存为支持“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..."
为什么要在“BuffereImage”中使用“WritableRaster”的“setpixel”,而不是“setRGB”
我也很好奇如何访问“int[]”以及这是否是实现这一点的首选方法?
有没有一种方法可以搜索特定的彩色像素,而不是亲自检查每个像素来找到正确的颜色?
只是好奇首选/最快的方法是什么。
int[]的方法声称它不会使用“硬件加速”,所以我很好奇这是否也很重要?
我想一旦它被缓冲了,我可以对它做任何事情,但我很好奇其他人怎么想?
想法?
非常感谢你的帮助!
关于你的第二个问题:你只需要将文件加载到一个支持透明的正确格式的BufferedImage中,例如:BufferedImage。TYPE_INT_ARGB
。ARGB
表示"Alpha,Red,Green,Blue",其中alpha代表透明。你可以操纵,但你想要的BufferedImage,文件格式只是你打算写在最后。
至于你的第一个问题,我不确定你将如何优化它,因为你将不得不访问每个像素(无论你使用哪种方法),并更改值。我会选择缓慢的方法,因为(对我来说)似乎不可避免。
编辑:int[]方法基本上是将可写光栅中的值放入数组中。因此,您不需要调用setRGB()
而只需调用array[i][j]=someValue
。这在理论上会提高性能,因为您将执行低级操作(访问某个数组中的值),而不是像setRGB()
这样的高级方法调用。但您仍然需要将该阵列转换回光栅,然后再转换回BuffereImage。老实说,这样做的好处似乎是可以忽略的,因为你没有在做一个高性能的游戏。我刚刚在4K图片上尝试了“慢速”方法,这是你通常会遇到的最高分辨率,程序在10秒内完成(知道我在最坏的情况下使所有像素都透明)。一张普通的高清照片所需的时间大约要少4倍。
问题内容: 所以我有两个图像,我想显示在彼此的顶部。这个 上面的图像应该是透明的,这样底部的图像是透明的 可见。 Here is my code so far: With the face in the bottom and the eyes on top. 问题答案: Try this 我没有你的两个源图像,所以我不能确定它将与工作 他们。如有任何问题,请提供两者的原件。
我正在处理位图图像的透明部分用洋红色着色(在一些语言中,可以将颜色设置为透明)。我试图在原始位图图像中透明洋红色的像素。 我从SD卡加载位图: 将其复制到另一个位图以使其可变: 然后逐像素扫描,找到洋红色的像素,并尝试改变它们的透明度。 但是那些我希望变成透明的像素被转换成黑色。通过更改alpha,我发现最终颜色从中提到的颜色(不提及alpha)变为黑色。例如,变为白色,为灰色,而变黑。 我不知道
问题内容: 但是我需要一个Java等效项。我需要一个图像类型(如,,…),该图像类型可以完全透明(alpha = 0)保留此颜色。当然还有一种将其保存为文件的方法。 问题答案: import java.awt.; import java.awt.image. ; 修改代码以使每个像素透明 来源:http://www.rgagnon.com/javadetails/java-0265.html
我试图从眼动跟踪结果创建一个热图(显示用户在屏幕上最频繁查看的位置)。 对于用户经常查看的像素,我想设置不透明的红色,对于不太频繁的橙色,等等...我使用红色到绿色的色阶。但是对于频率最低的像素,我希望它们不仅显示绿色,而且是透明的。 问题是,当我尝试改变颜色时,例如使用它实际上并没有根据新旧颜色将像素作为平均值着色,它只是显示一些新的、看起来奇怪的颜色。 图像与alpha RGBA值设置为50:
我有一个透明的PNG图像。我使用这种格式是因为只有PNG可以支持透明度和alpha遮罩。 我的目标是用这个图像绘制一个JPanel,让透明区域具有底层面板的颜色,并最终用图像制作一些动画。 无论我遇到什么问题,当加载并在JPanel上绘制时,透明区域都变成了纯白。 所以java不支持透明图像? 因此,我将透明的“图像”画到不透明的“背景图像”上
#klem1,#klem2 { opacity:0.4; filter:alpha(opacity=40); /* For IE8 and earlier */ } #klem1:hover,#klem2:hover { opacity:1.0; filter:alpha(opacity=100); /* For IE8 and earlier */ } div.background { widt