繁体   English   中英

具有透明度的BufferedImage和像素操作

[英]BufferedImage and pixel manipulation with transparency

基本上我的问题是2部分。

  1. 我想知道用于操纵像素并将某种颜色转换为透明像素的首选/快速方法。

  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 []”并在那里处理像素。


  1. 本质上,我想拍摄图像,除去某种颜色的透明度,然后再使用该图像。

我注意到我可以在bufferedImage中用“ setRGB”设置每个像素,但是在“ WritableRaster ...”中有一个“ setpixel”。

为什么要确切地使用“ WritableRaster的”“ setpixel”而不是“ BufferedImage”中的“ setRGB”?

我也很好奇我将如何访问“ int []”,如果这是首选的方式呢?

有没有一种方法可以搜索某些彩色像素,而不是自己遍历每个像素来找到合适的颜色?

只是想知道首选/最快的方法是什么。

带有int []的方法声称它不会使用“硬件加速”,所以我很好奇这是否也很重要?


  1. 我想问一下这个图片。 我知道要使用透明图像,您需要一种特殊的文件格式,例如“ gif”,“ png”或“ tga”,但是我很好奇我是否可以仅使用我创建的这个新bufferedImage而不是保存它,然后重新读回去? 我不确定是否可以对它进行任何缓冲,并且是否可以显示它,或者是否必须使用某种格式?

我认为一旦缓冲它,我就可以做任何事情,但是我很好奇其他人的想法吗?


思考?

非常感谢您的帮助!

关于第二个问题:您只需将文件加载到具有支持透明性的正确格式的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM