2016-10-01 10 views
1

Я искал в Интернете высоко и низко, и я не могу найти решение о том, как добавить цветной профиль sRGB или Abobe (1998) в Tiff Image с Java , Там есть несколько примеров для jpg и png, но они не применяются к tiffs. Я пытался сделать это с помощью Commons Imaging и java.awt, но не повезло. Является ли это возможным?Добавить Tiff Image Color Profile (sRGB или Adobe 1998) с Java

Благодаря

Обновление:

Я сделал некоторый прогресс с помощью TwelveMonkeys библиотеки ImageIO-Tiff и следующий код:

File file = new File("/Users/user/Desktop/demo/sandal.tif"); 
BufferedImage image = ImageIO.read(file); 

ICC_Profile ip = ICC_Profile.getInstance("/Users/user/Documents/icc/AdobeRGB1998.icc"); 
ICC_ColorSpace ics = new ICC_ColorSpace(ip); 
ColorConvertOp cco = new ColorConvertOp(ics, null); 
BufferedImage result = cco.filter(image, null); 

ImageIO.write(result, "TIFF", new File("/Users/user/Desktop/demo/sandal2.tif")); 

применяется цветовой профиль, но размолвка является сплющенный и альфа удалены. Как можно сохранить альфа-канал?

+0

Возможный дубликат [Как установить цветной профиль icc в Java и изменить цветовое пространство] (http://stackoverflow.com/questions/380678/how-to-set-icc-color-profile-in-java-and- change-colorspace) –

+0

Я пробовал это, и он не работал. Либо потому, что он неполный, либо он не работает с Tiffs. – jonD02

+0

@ jonD02 В настоящее время TwisterMonkeys 'TIFFImageWriter' будет писать профиль ICC, если профиль не является профилем sRGB (как в' ColorSpace.isCS_sRGB() '). Предполагается, что цветовое пространство TIFF по умолчанию - sRGB, что может быть неправильным предположением. Но он должен работать для AdobeRGB1998. Можете ли вы связать файл 'sandal.tif' с вашим примером кода? Если это так, я попытаюсь воспроизвести проблему и придумать решение. – haraldK

ответ

0

Как уже упоминался в комментариях, код, который вы должны должен работал, если не что-то особенное о вашем 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 для этого). Ваше оригинальное изображение не выложено, поэтому я думаю, что это меньше беспокоит.

+0

спасибо! Это работает для цветового профиля, но это создает проблему с другой частью моего приложения.TIF позже используется для создания PNG, используя следующий код: – jonD02

+0

'Файл file = new File (tiffFile); BufferedImage image = ImageIO.read (файл); BufferedImage resizeImagePng = resizeImage (изображение, BufferedImage.TYPE_INT_ARGB, image.getWidth()/4, image.getHeight()/4); ImageIO.write (resizeImagePng, «PNG», новый файл (pngFile)); private static BufferedImage resizeImage (BufferedImage originalImage, int type, int IMG_WIDTH, int IMG_HEIGHT) { BufferedImage resizedImage = new BufferedImage (IMG_WIDTH, IMG_HEIGHT, тип); Graphics2D g = resizedImage.createGraphics(); g.drawImage (originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null); g.dispose(); return resizedImage; – jonD02

+0

Результирующий файл PNG с помощью TIF с цветовым профилем: https://drive.google.com/open?id=0B8FrShLAYpOEcDllb3BUYTNfTlE Это не происходит, когда я обновляю Tif таким же образом в Photoshop: HTTPS://drive.google.com/open?id=0B8FrShLAYpOEUjNLQVBCVVJCQjA – jonD02