Rotating pages in TIFF files
Hi there,
After some effort and reading of this forum (thanks!) I've got some code together that will read a byte array containing a two page TIFF file and output it as an ArrayList, while maintaining the metadata and ended-ness of it (important for my application).
The big problem I now face is this. I need to read a certain metadata tag (orientation) and if it is a certain value, rotate that image by a certain amount of degrees. I've read quite a lot of stuff about rotating images in Java, but I can't figure out how to get it working with ImageIO.
Any help would be greatly appreciated!
publicstatic ArrayList getTiffPages(byte[] argFileBytes,int imageNumber)throws Exception{
ArrayList<byte[]> tiffList =new ArrayList<byte[]>();
ByteArraySeekableStream bArrSeekStream =new ByteArraySeekableStream(argFileBytes);
ImageReadParam param =new ImageReadParam();
Iterator readers = ImageIO.getImageReadersByFormatName("tiff");
ImageReader reader = (ImageReader)readers.next();
ImageInputStream iis = ImageIO.createImageInputStream(bArrSeekStream);
reader.setInput(iis);
int noOfPages = reader.getNumImages(true);
for (int pageNbr = 0; pageNbr < noOfPages; pageNbr++){
ByteArrayOutputStream baos =new ByteArrayOutputStream();
IIOImage currentImage = reader.readAll(pageNbr, param);
ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
Iterator writers = ImageIO.getImageWritersByFormatName("tiff");
ImageWriter writer = (ImageWriter)writers.next();
writer.setOutput(ios);
IIOMetadata streamMetadata = writer.getDefaultStreamMetadata(null);
String tiffMetadataFormatName = streamMetadata.getNativeMetadataFormatName();
IIOMetadataNode newTree =new IIOMetadataNode(tiffMetadataFormatName);
IIOMetadataNode byteOrderNode =new IIOMetadataNode("ByteOrder");
byteOrderNode.setAttribute("value","LITTLE_ENDIAN");
newTree.appendChild(byteOrderNode);
streamMetadata.setFromTree(tiffMetadataFormatName, newTree);
writer.write(streamMetadata, currentImage,null);
writer.dispose();
ios.close();
if (pageNbr == 0){
SAXContentHandler.setFrontPageSize(String.valueOf(baos.size()));
}elseif (pageNbr == 1){
SAXContentHandler.setBackPageSize(String.valueOf(baos.size()));
}
//System.out.println("BAOS Size: " + baos.size());
tiffList.add(baos.toByteArray());
baos.flush();
baos.close();
}
return tiffList;

