2012-03-02 61 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