gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:46:25 25 4
gpt4 key购买 nike

基本上我的问题分为两部分。

  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: Filling a BufferedImage with transparent pixels

哪一条评论讨论了“int[]”以及在那里操纵像素。

<小时/>
  1. 本质上我想拍摄一张图像,删除某种颜色的透明度,然后能够使用该图像。

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

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

我也很好奇如何访问“int[]”以及这是否是解决此问题的首选方法?

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

只是好奇首选/最快的方法是什么。

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

<小时/>
  • 我想询问一下这张图片的总体情况。我知道要使用透明图像,您需要特殊的文件格式,例如“gif”、“png”或“tga”,但我很好奇是否可以使用我创建的新 bufferedImage 而不是保存它,然后重新读回来?我不确定一旦它被缓冲,我是否可以用它做任何事情,并且它会显示,或者它是否必须是某种格式?
  • 我假设一旦它被缓冲,我就可以对其做任何事情,但我很好奇其他人怎么想?

    <小时/>

    想法?

    非常感谢您的帮助!

    最佳答案

    关于第二个问题:您只需将文件加载到支持透明度的正确格式的 BufferedImage 中,例如:BufferedImage.TYPE_INT_ARGBARGB 表示“阿尔法、红、绿、蓝”其中 alpha 代表透明度。您可以随心所欲地操作 BufferedImage,文件格式就是您最终打算如何编写它。

    关于你的第一个问题,我不确定你将如何优化它,因为你将必须访问每个像素(无论你使用哪种方法),并更改值。我会选择慢速方法,因为(对我来说)似乎是不可避免的。

    编辑: int[] 方法基本上是获取 WritableRaster 中的值并将它们放入数组中。因此,您不必调用 setRGB(),而只需调用 array[i][j]=someValue。理论上,这会提高性能,因为您将执行低级别的操作(访问某些数组中的值),而不是像 setRGB() 这样的更高级别的方法调用。但是您仍然需要将该数组转换回来转换为 Raster,然后返回 BufferedImage。说实话,这样做的利润似乎可以忽略不计,因为你不是在制作高性能游戏。我只是在 4K 图像(你通常会遇到的最高分辨率)上尝试了“慢速”方法,程序在 10 秒内完成(知道我在最坏的情况下将所有像素设置为透明)。通常的高清图片将花费大约 4 倍的时间。

    关于java - BufferedImage 和具有透明度的像素操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33877874/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com