2011년 3월 10일 목요일

java tiff dpi setting

import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import javax.imageio.metadata.*;
import javax.imageio.stream.*;
import org.w3c.dom.*;
import com.sun.media.imageio.plugins.tiff.BaselineTIFFTagSet;
import com.sun.media.imageio.plugins.tiff.TIFFDirectory;
import com.sun.media.imageio.plugins.tiff.TIFFField;
import com.sun.media.imageio.plugins.tiff.TIFFTag;

/**
* Example class showing two ways to write DPI values to a TIFF image.
*/
public class TIFFWriteDPI {
private static String METADATA_NAME =
"com_sun_media_imageio_plugins_tiff_image_1.0";

private static int DPI_X = 42;
private static int DPI_Y = 24;

public static void main(String[] args) throws Throwable {
// Create sample image.
RenderedImage image = new BufferedImage(256, 256,
BufferedImage.TYPE_3BYTE_BGR);

// Get TIFF writer.
Iterator writers = ImageIO.getImageWritersByFormatName("TIFF");
if(writers == null || !writers.hasNext())
throw new IllegalStateException("No TIFF writers!");
ImageWriter writer = (ImageWriter)writers.next();

// Get the default image metadata.
ImageTypeSpecifier imageType =
ImageTypeSpecifier.createFromRenderedImage(image);
IIOMetadata imageMetadata =
writer.getDefaultImageMetadata(imageType, null);

// Set DPI.
String fileName;
String methodology;
if(args.length == 0 || args[0].equalsIgnoreCase("DOM")) {
fileName = "dpi_dom.tif";
setDPIViaDOM(imageMetadata);
methodology = "DOM";
} else {
fileName = "dpi_api.tif";
imageMetadata = setDPIViaAPI(imageMetadata);
methodology = "API";
}

System.out.println("\nWriting "+fileName+
" using "+methodology+" methodology\n");

// Write image.
writer.setOutput(new FileImageOutputStream(new File(fileName)));
writer.write(new IIOImage(image, null, imageMetadata));
}

/**
* Set DPI using DOM nodes.
*/
private static void setDPIViaDOM(IIOMetadata imageMetadata)
throws IIOInvalidTreeException {
// Get the DOM tree.
IIOMetadataNode root =
(IIOMetadataNode)imageMetadata.getAsTree(METADATA_NAME);

// Get the IFD.
IIOMetadataNode ifd =
(IIOMetadataNode)root.getElementsByTagName("TIFFIFD").item(0);

// Get {X,Y}Resolution tags.
BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance();
TIFFTag tagXRes = base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION);
TIFFTag tagYRes = base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION);

// Create {X,Y}Resolution nodes.
IIOMetadataNode nodeXRes = createRationalNode(tagXRes.getName(),
tagXRes.getNumber(),
DPI_X, 1);
IIOMetadataNode nodeYRes = createRationalNode(tagYRes.getName(),
tagYRes.getNumber(),
DPI_Y, 1);

// Append {X,Y}Resolution nodes to IFD node.
ifd.appendChild(nodeXRes);
ifd.appendChild(nodeYRes);

// Set metadata from tree.
imageMetadata.setFromTree(METADATA_NAME, root);
}

/**
* Creates a node of TIFF data type RATIONAL.
*/
private static IIOMetadataNode createRationalNode(String tagName,
int tagNumber,
int numerator,
int denominator) {
// Create the field node with tag name and number.
IIOMetadataNode field = new IIOMetadataNode("TIFFField");
field.setAttribute("name", tagName);
field.setAttribute("number", "" + tagNumber);

// Create the RATIONAL node.
IIOMetadataNode rational = new IIOMetadataNode("TIFFRational");
rational.setAttribute("value", numerator+"/"+denominator);

// Create the RATIONAL node and append RATIONAL node.
IIOMetadataNode rationals = new IIOMetadataNode("TIFFRationals");
rationals.appendChild(rational);

// Append RATIONALS node to field node.
field.appendChild(rationals);

return field;
}

/**
* Set DPI using API.
*/
private static IIOMetadata setDPIViaAPI(IIOMetadata imageMetadata)
throws IIOInvalidTreeException {
// Derive the TIFFDirectory from the metadata.
TIFFDirectory dir = TIFFDirectory.createFromMetadata(imageMetadata);

// Get {X,Y}Resolution tags.
BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance();
TIFFTag tagXRes = base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION);
TIFFTag tagYRes = base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION);

// Create {X,Y}Resolution fields.
TIFFField fieldXRes = new TIFFField(tagXRes, TIFFTag.TIFF_RATIONAL,
1, new long[][] {{DPI_X, 1}});
TIFFField fieldYRes = new TIFFField(tagYRes, TIFFTag.TIFF_RATIONAL,
1, new long[][] {{DPI_Y, 1}});

// Append {X,Y}Resolution fields to directory.
dir.addTIFFField(fieldXRes);
dir.addTIFFField(fieldYRes);

// Convert to metadata object and return.
return dir.getAsMetadata();
}
}

댓글 없음:

댓글 쓰기