【问题标题】:ImageJ - Convert image format without saving fileImageJ - 转换图像格式而不保存文件
【发布时间】:2017-05-04 08:58:42
【问题描述】:

我正在使用 ImageJ API 将一些 24 位 TIFF 图像转换为 8 位 JPG。 转换后我需要对这些图像进行其他处理。 我做了这个:

ImagePlus img = IJ.openImage(f.getAbsolutePath()); // Open image
new ImageConverter(img).convertToGray8(); // Convert image to 8-bit grayscale
IJ.saveAs(img, "jpg", newPath); // Export image to jpg
// Read the same image again
// Process it

我的问题是转换必须将图像保存到磁盘并且我必须立即再次读取它,而且我正在处理大量图像。 有没有办法创建 jpg 图像并将其放入对象而不将其存储在磁盘上?

具体来说,我的目标是使用图像的字节内容创建一个 Hadoop SequenceFile,因此我根本不需要存储它们。

【问题讨论】:

    标签: java image imagej


    【解决方案1】:

    您可以像这样从 ImagePlus 类中获取原始缓冲图像:

    BufferedImage rawImage = img.getBufferedImage();
    

    所以理论上你可以从那里使用 API 来获取字节而不是写入磁盘

    ByteArrayOutputStream baos=new ByteArrayOutputStream();
    ImageIO.write(rawImage, "jpg", baos);
    byte[] imageInByte=baos.toByteArray();
    

    希望这会奏效

    【讨论】:

    • 您不能在 ImageIO.write() 中使用 Image 因为它是一个 Abstract 类,而是使用像 @sorifiend 在另一个答案中建议的 BufferedImage bufferedImage = img.getBufferedImage() 之类的实现。顺便说一句,我缺少的是 ImageIO 可以写入 ByteArrayOutputStream 而不是 File,非常感谢。
    【解决方案2】:

    我认为您最好的方法是获取缓冲图像而不是保存它:

    使用ImagePlus myImage = IJ.getImage(); 返回ImagePlus 对象,然后您可以使用myImage.getBufferedImage() 返回标准java.awt.image.BufferedImage,现在您可以继续使用缓冲图像而无需ImagePlus 库。

    ImagePlus img = IJ.openImage(f.getAbsolutePath()); // Open image
    new ImageConverter(img).convertToGray8(); // Convert image to 8-bit grayscale
    ImagePlus myImage = IJ.getImage();
    BufferedImage bufferedImage = myImage.getBufferedImage();
    // Process bufferedImage
    

    来自 ImagePlus 方法:https://imagej.nih.gov/ij/developer/api/ij/ImagePlus.html

    公共 java.awt.image.BufferedImage getBufferedImage()

    将此图像的副本作为 8 位或 RGB BufferedImage 返回。

    【讨论】:

    • 这不是我需要的,因为它仍然无法转换为 jpg 部分,仍然感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多