Я использую замечательную библиотеку двенадцати обезьян для создания файлов TIFF, но у меня проблема с установкой единиц измерения разрешения в дюймах.Я потратил 2 дня, изучая и Google, и исходный код двенадцати обезьян, но безуспешно.Я надеюсь, что кто-то еще знает, как решить эту проблему.Это упрощенный код:
final BufferedImage bufferedImage = someImage;
final int dpi = 300;
final String filePath = someFilePath;
final ImageWriter writer = ImageIO.getImageWritersByFormatName("TIFF").next();
final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
final ImageOutputStream output = ImageIO.createImageOutputStream(buffer);
writer.setOutput(output);
final double resolution = dpi / 10.0; // --- This is a hack (possibly a MM/CM conversion)
final String standardFormat = IIOMetadataFormatImpl.standardMetadataFormatName;
final IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromRenderedImage(bufferedImage),null);
final IIOMetadataNode customMetadata = new IIOMetadataNode(standardFormat);
final IIOMetadataNode dimensionMetadataNode = new IIOMetadataNode("Dimension");
customMetadata.appendChild(dimensionMetadataNode);
final IIOMetadataNode horizontalMetadataNode = new IIOMetadataNode("HorizontalPixelSize");
dimensionMetadataNode.appendChild(horizontalMetadataNode);
horizontalMetadataNode.setAttribute("value",String.valueOf(resolution));
final IIOMetadataNode verticalMetadataNode = new IIOMetadataNode("VerticalPixelSize");
dimensionMetadataNode.appendChild(verticalMetadataNode);
verticalMetadataNode.setAttribute("value",String.valueOf(resolution));
metadata.mergeTree(standardFormat,customMetadata);
final IIOImage iioImage = new IIOImage(bufferedImage,null,metadata);
writer.write(null,iioImage,params);
final File file = new File(filePath);
final FileOutputStream fos = new FileOutputStream(file);
buffer.writeTo( fos );
Этот код создает файл TIFF, который ImageMagick сообщает как:
Resolution: 300x300
Print size: 8.26667x11.6933
Units: PixelsPerCentimeter
И все же com.twelvemonkeys.imageio.plugins.tiff.TIFFBaseline заявляет:
int RESOLUTION_UNIT_NONE = 1;
int RESOLUTION_UNIT_DPI = 2; // Default
int RESOLUTION_UNIT_CENTIMETER = 3;
Я знаю, что мог бы запустить ImageMagick из Java, чтобы установить необходимые единицы разрешения, но это что-то вроде хака, и было бы гораздо лучше просто сгенерировать данные файла Tiff с правильной единицей разрешения измой код Java.
Если мой вопрос глуп (или я был глуп), я заранее прошу прощения.Буду рад любой помощи.Спасибо вам.