[
https://issues.apache.org/jira/browse/IMAGING-201?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17206093#comment-17206093
]
Gary Lucas edited comment on IMAGING-201 at 10/2/20, 10:55 AM:
---------------------------------------------------------------
I investigated this issue further and it appears that the CMYK to RGB
conversions are implemented correctly in the Commons Imaging library. The
conversion code takes a round-about approach, but a little algebra shows that
they are equivalent to the well-known formulas. I did find that the conversion
maps CMYK to _linear_ RGB, but that the BufferedImage class used by Java wants
sRGB. Adding the linear-to-sRGB conversion to the code addressed the incorrect
green tone on the model's jacket, but results in an overall washed out
appearance in the image (the poor guy is so pale that he looks like he has a
bad case of the flu).
I believe that the key to correctly rendering this image is to use the ICC
Color Profile that is bundled with the image using tag 34675 (0x8773:
InterColorProfile). There is some support for this in the Commons Imaging color
package, but it is not integrated into the TIFF code.
I'm afraid that I am not especially familiar with color models and profiles and
have taken this issue as far as I can for now. I hope these notes might help
somebody else get started on a solution.
Here's the code I added to my local version of the CMYK photometric interpreter
to perform the CMYK to RGB conversion:
{code:java}
int makeRGB(int[] samples) {
final double c = samples[0] / 255.0;
final double m = samples[1] / 255.0;
final double y = samples[2] / 255.0;
final double k = samples[3] / 255.0;
int r = (int) (255 * linearToSRGB((1 - c) * (1 - k)) + 0.5);
int g = (int) (255 * linearToSRGB((1 - m) * (1 - k)) + 0.5);
int b = (int) (255 * linearToSRGB((1 - y) * (1 - k)) + 0.5);
return 0xff000000 | (r << 16) | (g << 8) | b;
}
double linearToSRGB(double a) {
if (a <= 0.0031308) {
return a * 12.92;
} else {
return 1.055 * Math.pow(a, 1.0 / 2.4) - 0.055;
}
}
{code}
was (Author: gwlucas):
I investigated this issue further and it appears that the CMYK to RGB
conversions are implemented correctly in the Commons Imaging library. The
conversion code takes a round-about approach, but a little algebra shows that
they are equivalent to the well-known formulas. I did find that the conversion
maps CMYK to _linear_ RGB, but that the BufferedImage class used by Java wants
sRGB. Adding the linear-to-sRGB conversion to the code addressed the incorrect
green tone on the model's jacket, but results in an overall washed out
appearance in the image (the poor guy is so pale that he looks like he has a
bad case of the flu).
I believe that the key to correctly rendering this image is to use the ICC
Color Profile that is bundled with the image using tag 34675 (0x8773:
InterColorProfile). There is some support for this in the Commons Imaging color
package, but it is not integrated into the TIFF code.
I'm afraid that I am not especially familiar with color models and profiles and
have taken this issue as far as I can for now. I hope these notes might help
somebody else get started on a solution.
Here's the code I added to my local version of the CMYK photometric interpreter
to perform the CMYK to RGB conversion:
int makeRGB(int[] samples) {
final double c = samples[0] / 255.0;
final double m = samples[1] / 255.0;
final double y = samples[2] / 255.0;
final double k = samples[3] / 255.0;
int r = (int) (255 * linearToSRGB((1 - c) * (1 - k)) + 0.5);
int g = (int) (255 * linearToSRGB((1 - m) * (1 - k)) + 0.5);
int b = (int) (255 * linearToSRGB((1 - y) * (1 - k)) + 0.5);
return 0xff000000 | (r << 16) | (g << 8) | b;
}
double linearToSRGB(double a) {
if (a <= 0.0031308) {
return a * 12.92;
} else {
return 1.055 * Math.pow(a, 1.0 / 2.4) - 0.055;
}
}
> Significant change in color of output image of tiff file
> --------------------------------------------------------
>
> Key: IMAGING-201
> URL: https://issues.apache.org/jira/browse/IMAGING-201
> Project: Commons Imaging
> Issue Type: Bug
> Components: Format: TIFF
> Affects Versions: 1.0-alpha1
> Reporter: Praful Vaishnav
> Priority: Major
> Attachments: SS_result.png, SS_source.png
>
>
> Hii.. I am reading tiff image file and using this library to convert it to
> PNG format. Resultant png file has significant change in color wrt its
> original tiff file. Below is the code :
> {code:java}
> File file = new File("C:\\original.tiff");
> BufferedImage bi = Imaging.getBufferedImage(file);
> File dstFile = new File("C:\\result.png");
> Imaging.writeImage(bi, dstFile, ImageFormats.PNG, null);
> {code}
> Reason could be :
> original image is 32 bit depth and result image is 24 bit depth. Is there any
> issue with 32 bit depth image file.
> Link for source tiff file -
> https://www.dropbox.com/s/kgqgdcygelkor8b/original.tiff?dl=0
> Attachements:
> SS_source.png - Screenshot of original tiff file
> SS_result.png - Screenshot of result png file
--
This message was sent by Atlassian Jira
(v8.3.4#803005)