我尝试了以下代码来完成读写tiff图像的任务:
// Define the source and destination file names.
String inputFile = /images/FarmHouse.tif
String outputFile = /images/FarmHouse.bmp
// Load the input image.
RenderedOp src = JAI.create("fileload", inputFile);
// Encode the file as a BMP image.
FileOutputStream stream =
new FileOutputStream(outputFile);
JAI.create("encode", src, stream, BMP, null);
// Store the image in the BMP format.
JAI.create("filestore", src, outputFile, BMP, null);
但是,当我运行代码时,我收到以下错误消息:
Caused by: java.lang.IllegalArgumentException: Only images with either 1 or 3 bands
can be written out as BMP files.
at com.sun.media.jai.codecimpl.BMPImageEncoder.encode(BMPImageEncoder.java:123)
at com.sun.media.jai.opimage.EncodeRIF.create(EncodeRIF.java:79)
知道如何解决这个问题吗?
答案 0 :(得分:22)
读取TIFF并输出BMP的最简单方法是使用ImageIO类:
BufferedImage image = ImageIO.read(inputFile);
ImageIO.write(image, "bmp", new File(outputFile));
要使其工作,唯一需要做的就是确保已将JAI ImageIO JAR添加到类路径中,因为没有此库中的插件,JRE不会处理BMP和TIFF。 / p>
如果由于某种原因无法使用JAI ImageIO,您可以使用现有代码,但是您还需要做一些额外的工作。为正在加载的TIFF创建的颜色模型可能是BMP不支持的索引颜色模型。您可以通过提供带有JAI.KEY_REPLACE_INDEX_COLOR_MODEL键的呈现提示来将其替换为JAI.create(“format”,...)操作。
您可能有幸将从文件中读取的图像写入临时图像,然后写出临时图像:
BufferedImage image = ImageIO.read(inputFile);
BufferedImage convertedImage = new BufferedImage(image.getWidth(),
image.getHeight(), BufferedImage.TYPE_INT_RGB);
convertedImage.createGraphics().drawRenderedImage(image, null);
ImageIO.write(convertedImage, "bmp", new File(outputFile));
我想知道你是否遇到了与普通JAI相同的索引颜色模型问题。理想情况下,除了最简单的情况之外,您应该使用ImageIO类来获取ImageReader和ImageWriter实例,以便您可以相应地调整读写参数,但ImageIO.read()和.write()可以很精细地为您提供你想要什么。
答案 1 :(得分:-2)
FileInputStream in = new FileInputStream(imgFullPath);
FileChannel channel = in.getChannel();
ByteBuffer buffer = ByteBuffer.allocate((int)channel.size());
channel.read(buffer);
tiffEncodedImg = Base64.encode(buffer.array());
使用此内容(即“tiffEncodedImg”的值)作为HTML中img标记的src值