Как уже упоминался в комментариях, код, который вы должны должен работал, если не что-то особенное о вашем AdobeRGB1998 профиле ICC ...
Ниже код работает для меня, преобразования изображения из SRGB к профилю AdobeRGB1998 , Полученный TIFF-файл имеет правильный профиль ICC и содержит неактивный альфа-канал (258/BitsPerSample: [8, 8, 8, 8], 277/SamplesPerPixels: 4, 34675/ICCProfile: [...]
). Единственные незначительные проблемы, которые я вижу, - это то, что сжатие изменяется от LZW до без сжатия, а DPI изменяется от 300 до 72 (метаданные метаданных XMP теряются).
BufferedImage image = ImageIO.read(new File("C:\\Downloads\\sandal.tif"));
ICC_ColorSpace ics = (ICC_ColorSpace) ColorSpaces.getColorSpace(ColorSpaces.CS_ADOBE_RGB_1998);
ColorConvertOp cco = new ColorConvertOp(ics, null);
BufferedImage result = cco.filter(image, null);
File tempFile = File.createTempFile("test-", ".tif");
System.out.println("tempFile: " + tempFile); // Just to know where to look
ImageIO.write(result, "TIFF", tempFile);
Как вы можете видеть, единственная реальная разница в том, как получить профиль/цветовое пространство ICC.
Если вы хотите сохранить метаданные и/или контроль сжатия, это тоже возможно. Ниже код делает в основном то же самое (но сохраняет сжатие LZW и 300dpi), к сожалению, это немного более многословен:
try (ImageInputStream input = ImageIO.createImageInputStream(new File("C:\\Downloads\\sandal.tif"))) {
ImageReader reader = ImageIO.getImageReaders(input).next();
reader.setInput(input);
IIOImage imageAndMeta = reader.readAll(0, reader.getDefaultReadParam());
reader.dispose();
ICC_ColorSpace ics = (ICC_ColorSpace) ColorSpaces.getColorSpace(ColorSpaces.CS_ADOBE_RGB_1998);
ColorConvertOp cco = new ColorConvertOp(ics, null);
BufferedImage result = cco.filter((BufferedImage) imageAndMeta.getRenderedImage(), null);
imageAndMeta.setRenderedImage(result);
File tempFile = File.createTempFile("test-", ".tif");
System.err.println("tempFile: " + tempFile);
ImageWriter tiffWriter = ImageIO.getImageWritersByFormatName("TIFF").next();
try (ImageOutputStream stream = ImageIO.createImageOutputStream(tempFile)) {
tiffWriter.setOutput(stream);
ImageWriteParam writeParam = tiffWriter.getDefaultWriteParam();
// If you want a specific compression, uncommment these lines
// The default setting is to copy from metadata
// writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// Allowed compression type values are:
// "None", "CCITT RLE", "CCITT T.4", "CCITT T.6","LZW", "JPEG", "ZLib", "PackBits" and "Deflate"
// writeParam.setCompressionType("PackBits");
tiffWriter.write(null, imageAndMeta, writeParam);
}
tiffWriter.dispose();
}
(по какой-то причине метаданные XMP еще отделенной от выхода, я считаю, что это ошибка).
Плитка в настоящее время не поддерживается писателем, но в будущем она может управляться writeParam
(используя стандартный API для этого). Ваше оригинальное изображение не выложено, поэтому я думаю, что это меньше беспокоит.
Возможный дубликат [Как установить цветной профиль icc в Java и изменить цветовое пространство] (http://stackoverflow.com/questions/380678/how-to-set-icc-color-profile-in-java-and- change-colorspace) –
Я пробовал это, и он не работал. Либо потому, что он неполный, либо он не работает с Tiffs. – jonD02
@ jonD02 В настоящее время TwisterMonkeys 'TIFFImageWriter' будет писать профиль ICC, если профиль не является профилем sRGB (как в' ColorSpace.isCS_sRGB() '). Предполагается, что цветовое пространство TIFF по умолчанию - sRGB, что может быть неправильным предположением. Но он должен работать для AdobeRGB1998. Можете ли вы связать файл 'sandal.tif' с вашим примером кода? Если это так, я попытаюсь воспроизвести проблему и придумать решение. – haraldK