ImageJ - 转换图像格式而无需保存文件

4

我正在使用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,其中包含图像的字节内容,因此我根本不需要将它们存储。

2个回答

2
您可以从ImagePlus类中获取原始缓冲图像,如下所示:
BufferedImage rawImage = img.getBufferedImage();

理论上,您可以使用API从那里获取字节,而不是写入磁盘。

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

希望这能够奏效。


1
你不能在ImageIO.write()中使用Image,因为它是一个抽象类,你需要使用像@ sorifiend建议的BufferedImage bufferedImage = img.getBufferedImage()这样的实现。顺便说一句,这可以工作,我之前没想到的是ImageIO可以写入ByteArrayOutputStream而不是File,非常感谢。 - kennyFF92

0

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

使用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

public java.awt.image.BufferedImage getBufferedImage()

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


这不是我需要的,因为它仍然缺少转换为jpg的部分,还是谢谢。 - kennyFF92

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接