首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAI Tiff to JPEG转换问题

JAI Tiff to JPEG转换问题
EN

Stack Overflow用户
提问于 2020-07-20 07:22:49
回答 1查看 361关注 0票数 1

我有一个问题,将Tiff文件转换成JAI的JPEG文件。这是我的守则:

代码语言:javascript
复制
ByteArrayOutputStream baos = new ByteArrayOutputStream();
        
TIFFDecodeParam param = null;
ImageDecoder dec = ImageCodec.createImageDecoder("tiff", new FileSeekableStream(inPath), param);
RenderedImage op = dec.decodeAsRenderedImage(0);
        
JPEGEncodeParam jpgparam = new JPEGEncodeParam();
jpgparam.setQuality(67);
ImageEncoder en = ImageCodec.createImageEncoder("jpeg", baos, jpgparam);
en.encode(op);

大多数情况下,这段代码工作得很好,但是对于一些图像,我得到了以下错误:

代码语言:javascript
复制
java.lang.RuntimeException: Only 1, or 3-band byte data may be written.
at com.sun.media.jai.codecimpl.JPEGImageEncoder.encode(JPEGImageEncoder.java:142)

我在这里找不到任何相关的问题,我不知道如何解决。抛出此错误的图像具有较高的分辨率(9000 x 7000或更多),并且大多是对旧图片的扫描。

使用此ColorModel生成的图像如下:

代码语言:javascript
复制
ColorModel: 
#pixelBits = 24 
numComponents = 3 
color space = java.awt.color.ICC_ColorSpace@21981a50 
transparency = 1 has alpha = false 
isAlphaPre = false

这不是:

代码语言:javascript
复制
ColorModel: 
#pixelBits = 16 
numComponents = 1 
color space = java.awt.color.ICC_ColorSpace@88a30ad 
transparency = 1 has alpha = false 
isAlphaPre = false
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-20 16:51:09

我试着阅读JPEG标准,目前还不清楚这是JPEG格式的限制还是仅仅是编码器。

编码器只提供java编码的1或3字节波段,因此在您的示例中有16位灰度图像。解决这一问题的一种方法是使用PNG编码器保存图像,就像您所做的那样。它不支持压缩质量参数。

处理此问题的另一种方法是将图像保存为8位灰度图像。

我做了一个简单的例子来测试这个w/out JAI。

代码语言:javascript
复制
public static void main(String[] args) throws Exception{
        BufferedImage img = new BufferedImage(256, 256, BufferedImage.TYPE_USHORT_GRAY);
        Iterator<ImageWriter> writers = ImageIO.getImageWritersBySuffix("jpg");
        while( writers.hasNext() ){
            ImageWriter writer = writers.next();
            ImageOutputStream ios = ImageIO.createImageOutputStream( new File("junk.jpg") );
            writer.setOutput(ios);
            writer.write(img);
        }     
    }

我能看到转换它的最简单的方法是创建一个新的图像并用一个图形来绘制它。

代码语言:javascript
复制
BufferedImage img2 = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
Graphics g = img2.getGraphics();
g.drawImage(img, 0, 0);
g.dispose();

然后可以将img2保存为JPG。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62990428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档