gpt4 book ai didi

java - 如何使用java将PNG图像转换为灰度图像?

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

我在将 PNG 图像更改为灰度时遇到问题。我想创建一个方法,它接受 byte[] 图像作为参数,并作为新修改的灰度图像作为 byte[] 返回。

我发现一些链接可以使用下面的代码片段将 JPEG 图像变成灰度图像。

private byte[] makeItGray(byte[] img, String contentType) throws IOException, Exception{


InputStream in = new ByteArrayInputStream(img);
BufferedImage bimg = ImageIO.read(in);

for(int y=0; y < bimg.getHeight(); y++){
for(int x=0; x < bimg.getWidth(); x++){
Color color = new Color(bimg.getRGB(x,y));
int graylevel = (color.getRed() + color.getGreen() + color.getBlue()) / 3;
int r = graylevel;
int g = graylevel;
int b = graylevel;
int rgb = ( r<<16 ) | ( g<<8 ) | b;
bimg.setRGB(x, y, rgb);
}
}

in.close();


ByteArrayOutputStream baos = new ByteArrayOutputStream();
if(contentType.equals(MediaType.IMAGE_PNG_VALUE)){
ImageIO.write(bimg, "png", baos);
System.out.println("PNG!!!");
}
else if(contentType.equals(MediaType.IMAGE_JPEG_VALUE)){
ImageIO.write(bimg, "jpg", baos);
}
else
throw new Exception();



baos.flush();
byte[] grayImage = baos.toByteArray();
baos.close();

return grayImage;
}

我的引用资料如下: How can I use ImageJ as a library for a separate Java application? https://www.mkyong.com/java/how-to-convert-byte-to-bufferedimage-in-java/

它适用于 JPEG 图像,但适用于 PNG,它会向我发送透明图像。

// converting orig image to grayscale in byte[] 
imageBytes = makeItGray(imageBytes, file.getContentType());
Path path = Paths.get("some path here that would overwrite existing image");
Files.write(path, imageBytes);

当我尝试手动打开图像以检查它是否是灰度时,它给我透明图像或没有显示图像但不为空,因为它返回 byte[] 数据。我想知道上述方法是否适用于 PNG 格式?

如有任何问题,请告诉我。谢谢!

最佳答案

实际上,getRGBsetRGB 方法尽管名称不同,但实际上返回并接受 32 位打包 ARGB 格式的像素。这意味着,如果 BufferedImage 的颜色模型实际上包含 Alpha channel ,则像您一样将像素的 Alpha 值保留为空 (0x00),将导致全部透明图像...

PNG 格式支持 Alpha,而 JPEG 通常不使用它,这就是为什么您会看到所做的结果,以及为什么它对于不同的格式似乎有不同的工作方式。

修复方法很简单,只需在像素值前面添加所有不透明的 alpha 即可:

int rgb = 0xff000000 | (r << 16) | (g << 8) | b;
bimg.setRGB(x, y, rgb);
<小时/>

如果你想保留原始的alpha,你也可以这样做(我稍微简化了代码):

int oldrgb = bimg.getRGB(x,y);
Color color = new Color(oldrgb);
int gray = (color.getRed() + color.getGreen() + color.getBlue()) / 3;
int rgb = (oldrgb & 0xff000000) | (gray << 16) | (gray << 8) | gray;
bimg.setRGB(x, y, rgb);
<小时/>

PS:请注意,通过平均计算灰度值的方法并不是将 RGB 转换为灰度的推荐方法,因此与其他工具相比,您的图像可能看起来不太好。例如,参见Converting color to grayscale .

关于java - 如何使用java将PNG图像转换为灰度图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44919399/

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