【发布时间】:2017-12-08 17:15:43
【问题描述】:
我在将我的 PNG 图像更改为灰度时遇到了问题。我想创建一个方法,它可以接受 byte[] 图像作为参数,并将新修改的灰度图像作为 byte[] 返回。
我发现了一些使用下面的 sn-p 使图像与 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 格式?
如有任何问题,请告诉我。谢谢!
【问题讨论】:
-
手动打开图片是什么意思,怎么知道是透明的?
-
只是为了检查图像是否为灰度,我手动打开它并显示透明??因为我的应用程序没有错误,并且每当我的程序对图像 (png) 发出 GET 请求时,它都会用 base64 数据填充
标记。但是,没有图像,就像透明的一样。
标签: java image-processing png grayscale