2012-03-02 58 views
1

我有一个java.awt.Image,需要添加CCITT T.6压缩并转换为TIFF字节数组。我已经看到了一些使用TIFFImageWriteParam和javax.imageio包中的其他类的示例,但是我无法找到一个从Image到byte数组的完整示例。将java.awt.Image转换为压缩的TIFF字节数组

这是我到目前为止从从扫描获得的java.awt.Image开始。这只是正常,生成TIFF的字节数组,但我需要找到一种方法,使用TIFFImageWriteParam或其他方式,来压缩TIFF之前处理它作为一个字节数组:

thisImage = ... a java.awt.Image from a scanner 
if(thisImage!=null){ 

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    BufferedImage bimg = new BufferedImage(thisImage.getWidth(null),thisImage.getHeight(null), BufferedImage.TYPE_BYTE_BINARY); 
    bimg.createGraphics().drawImage(thisImage, 0, 0, null); 

    try { 
    ImageIO.write(bimg, "tiff", baos);     
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 

    thisByteArray = baos.toByteArray(); 

    ... 

任何帮助将不胜感激。

回答

1

我找到了一个解决方案感谢:this thread.

以下是我最后做的是解决了我的问题:

thisImage = thisImage = ... a java.awt.Image from a scanner 
if(thisImage!=null){ 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ImageOutputStream ios = ImageIO.createImageOutputStream(baos); 
    boolean foundWriter = false; 
    BufferedImage bimg = new BufferedImage(thisImage.getWidth(null),thisImage.getHeight(null), BufferedImage.TYPE_BYTE_BINARY); 
    bimg.createGraphics().drawImage(thisImage, 0, 0, null); 
    for(Iterator<ImageWriter> writerIter = ImageIO.getImageWritersByFormatName("tif"); writerIter.hasNext() && !foundWriter;) { 
    foundWriter = true; 
    ImageWriter writer = (ImageWriter)writerIter.next(); 
    writer.setOutput(ios); 
    TIFFImageWriteParam writeParam = (TIFFImageWriteParam)writer.getDefaultWriteParam(); 
    writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
    writeParam.setCompressionType("CCITT T.6"); 
    writer.prepareWriteSequence(null); 
    ImageTypeSpecifier spec = ImageTypeSpecifier.createFromRenderedImage(bimg); 
    javax.imageio.metadata.IIOMetadata metadata = writer.getDefaultImageMetadata(spec, writeParam); 
    IIOImage iioImage = new IIOImage(bimg, null, metadata); 
    writer.writeToSequence(iioImage, writeParam); 
    bimg.flush(); 
    writer.endWriteSequence(); 
    ios.flush(); 
    writer.dispose(); 
    ios.close(); 
    thisByteArray = baos.toByteArray(); 
    baos.close(); 
    } 
} 
+0

OMG,它的工作原理。谢谢。 :) – 2013-03-04 09:11:27