You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2016/12/09 16:43:33 UTC
svn commit: r1773433 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java
Author: tilman
Date: Fri Dec 9 16:43:33 2016
New Revision: 1773433
URL: http://svn.apache.org/viewvc?rev=1773433&view=rev
Log:
PDFBOX-3622: provide alternative converter for LAB images
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java?rev=1773433&r1=1773432&r2=1773433&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java Fri Dec 9 16:43:33 2016
@@ -115,6 +115,12 @@ public class PDSeparation extends PDSpec
@Override
public BufferedImage toRGBImage(WritableRaster raster) throws IOException
{
+ if (alternateColorSpace instanceof PDLab)
+ {
+ // PDFBOX-3622 - regular converter fails for Lab colorspaces
+ return toRGBImage2(raster);
+ }
+
// use the tint transform to convert the sample into
// the alternate color space (this is usually 1:many)
WritableRaster altRaster = Raster.createBandedRaster(DataBuffer.TYPE_BYTE,
@@ -149,6 +155,40 @@ public class PDSeparation extends PDSpec
return alternateColorSpace.toRGBImage(altRaster);
}
+ // converter that works without using super implementation of toRGBImage()
+ private BufferedImage toRGBImage2(WritableRaster raster) throws IOException
+ {
+ int width = raster.getWidth();
+ int height = raster.getHeight();
+ BufferedImage rgbImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ WritableRaster rgbRaster = rgbImage.getRaster();
+ float[] samples = new float[1];
+
+ Map<Integer, int[]> calculatedValues = new HashMap<Integer, int[]>();
+ Integer hash;
+ for (int y = 0; y < height; y++)
+ {
+ for (int x = 0; x < width; x++)
+ {
+ raster.getPixel(x, y, samples);
+ int[] rgb = calculatedValues.get(hash = Float.floatToIntBits(samples[0]));
+ if (rgb == null)
+ {
+ samples[0] /= 255;
+ float[] altColor = tintTransform.eval(samples);
+ float[] fltab = alternateColorSpace.toRGB(altColor);
+ rgb = new int[3];
+ rgb[0] = (int) (fltab[0] * 255);
+ rgb[1] = (int) (fltab[1] * 255);
+ rgb[2] = (int) (fltab[2] * 255);
+ calculatedValues.put(hash, rgb);
+ }
+ rgbRaster.setPixel(x, y, rgb);
+ }
+ }
+ return rgbImage;
+ }
+
protected void tintTransform(float[] samples, int[] alt) throws IOException
{
samples[0] /= 255; // 0..1