Конвертировать java.awt.Image в массив байтов TIFF со сжатием - PullRequest
2 голосов
/ 02 марта 2012

У меня есть файл java.awt. Мне нужно добавить сжатие CCITT T.6 и преобразовать его в байтовый массив TIFF.Я видел несколько примеров использования TIFFImageWriteParam и других классов из пакета javax.imageio, но я не могу найти полный пример, идущий от образа к массиву байтов.с java.awt. Изображение, полученное от сканирования.Это прекрасно работает для генерации байтового массива TIFF, но мне нужно найти способ, используя TIFFImageWriteParam или каким-либо другим способом, сжать TIFF до его обработки в виде байтового массива:Любая помощь будет оценена.

1 Ответ

2 голосов
/ 08 марта 2012

Я нашел решение благодаря: этой теме.

Вот что я решил сделать, чтобы решить мою проблему:

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();
  }
}
...