gpt4 book ai didi

java - 在 Java BufferedImage 中隔离红/绿/蓝 channel

转载 作者:行者123 更新时间:2023-12-04 04:56:27 29 4
gpt4 key购买 nike

如何在 BufferedImage 中隔离红/绿/蓝 channel :我有以下代码不起作用:`

public static BufferedImage isolateChannel(BufferedImage image,
EIsolateChannel channel)
{
BufferedImage result=new BufferedImage(image.getWidth(),
image.getHeight(),
image.getType());
int iAlpha=0;
int iRed=0;
int iGreen=0;
int iBlue=0;
int newPixel=0;

for(int i=0; i<image.getWidth(); i++)
{
for(int j=0; j<image.getHeight(); j++)
{
iAlpha=new Color(image.getRGB(i, j)).getAlpha();
iRed=new Color(image.getRGB(i, j)).getRed();
iGreen=new Color(image.getRGB(i, j)).getGreen();
iBlue=new Color(image.getRGB(i, j)).getBlue();

if(channel.equals(EIsolateChannel.ISOLATE_RED_CHANNEL))
{
newPixel=iRed;
}

if(channel.equals(EIsolateChannel.ISOLATE_GREEN_CHANNEL))
{
newPixel=iGreen;
}

if(channel.equals(EIsolateChannel.ISOLATE_BLUE_CHANNEL))
{
newPixel=iBlue;
}

result.setRGB(i,
j,
newPixel);
}
}

return result;
}`

隔离 channel 我的意思是,如果选择红色 channel 进行隔离,例如,只显示图片的红色部分!

最佳答案

Color在java中定义为压缩整数,即在32位整数中,前8位是alpha,接下来的8位是红色,接下来的8位是绿色,最后8位是蓝色。

假设下面是一个代表颜色的 32 位整数。那么,

AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
^Alpha ^Red ^Green ^Blue

也就是说,alpha、红色、绿色和蓝色中的每一个基本上都是 8 位,其值从 0 到 255(颜色范围)。因此,当您想将这些单独的组件组合回 32 位整数颜色时,您应该编写
color=alpha<<24 | red<<16 | green<<8 | blue
因此,根据规则将代码更改为以下内容
if(channel.equals(EIsolateChannel.ISOLATE_RED_CHANNEL))
{
newPixel = newPixel | iRed<<16;
//Can also write newPixel=iRed , since newPixel is always 0 before this
}

if(channel.equals(EIsolateChannel.ISOLATE_GREEN_CHANNEL))
{
newPixel = newPixel | iGreen<<8;
}

if(channel.equals(EIsolateChannel.ISOLATE_BLUE_CHANNEL))
{
newPixel = newPixel | iBlue;
}

备注 : 我已经 ORed 了 newPixel在每个组件之前允许同时显示多个 channel ,即您可以在蓝色关闭的情况下显示红色和绿色。

更新

您遇到的第二个错误是由于您没有重置 newPixel 的值。每次迭代后。所以要修复它添加行 newPixel=0循环内。
你的代码应该是
newPixel=0; //Add this line
iAlpha=new Color(img.getRGB(x, y)).getAlpha();
iRed=new Color(img.getRGB(x, y)).getRed();
iGreen=new Color(img.getRGB(x, y)).getGreen();
iBlue=new Color(img.getRGB(x, y)).getBlue();

为了提高效率,我建议使用 bitshifts用于获取红色、绿色、蓝色和 alpha。
int rgb = img.getRGB(x,y);
iAlpha = rgb>>24 & 0xff;
iRed = rgb >>16 & 0xff;
iGreen = rgb>>8 & 0xff;
iBlue = rgb & 0xff;

此代码运行速度更快,因为它不会创建 4 Color源图像中每个像素的对象

关于java - 在 Java BufferedImage 中隔离红/绿/蓝 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16698372/

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