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 2018/10/05 17:08:52 UTC
svn commit: r1842944 -
/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java
Author: tilman
Date: Fri Oct 5 17:08:51 2018
New Revision: 1842944
URL: http://svn.apache.org/viewvc?rev=1842944&view=rev
Log:
PDFBOX-4326: override colorspace to avoid wrong number of 3 colors; provide passing integer RGB raster for possible future use
Modified:
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java
Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java?rev=1842944&r1=1842943&r2=1842944&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java Fri Oct 5 17:08:51 2018
@@ -16,10 +16,13 @@
*/
package org.apache.pdfbox.filter;
+import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.DataBufferUShort;
+import java.awt.image.IndexColorModel;
+import java.awt.image.MultiPixelPackedSampleModel;
import java.awt.image.Raster;
import java.io.IOException;
import java.io.InputStream;
@@ -49,6 +52,9 @@ import org.apache.pdfbox.pdmodel.graphic
*/
public final class JPXFilter extends Filter
{
+ /**
+ * {@inheritDoc}
+ */
@Override
public DecodeResult decode(InputStream encoded, OutputStream decoded, COSDictionary
parameters, int index, DecodeOptions options) throws IOException
@@ -74,6 +80,23 @@ public final class JPXFilter extends Fil
}
return result;
+ case DataBuffer.TYPE_INT:
+ // not yet used (as of October 2018) but works as fallback
+ // if we decide to convert to BufferedImage.TYPE_INT_RGB
+ int[] ar = new int[raster.getNumBands()];
+ for (int y = 0; y < image.getHeight(); ++y)
+ {
+ for (int x = 0; x < image.getWidth(); ++x)
+ {
+ raster.getPixel(x, y, ar);
+ for (int i = 0; i < ar.length; ++i)
+ {
+ decoded.write(ar[i]);
+ }
+ }
+ }
+ return result;
+
default:
throw new IOException("Data type " + raster.getDataBuffer().getDataType() + " not implemented");
}
@@ -136,7 +159,21 @@ public final class JPXFilter extends Fil
// extract embedded color space
if (!parameters.containsKey(COSName.COLORSPACE))
{
- result.setColorSpace(new PDJPXColorSpace(image.getColorModel().getColorSpace()));
+ if (image.getSampleModel() instanceof MultiPixelPackedSampleModel &&
+ image.getColorModel().getPixelSize() == 1 &&
+ image.getRaster().getNumBands() == 1 &&
+ image.getColorModel() instanceof IndexColorModel)
+ {
+ // PDFBOX-4326:
+ // force CS_GRAY colorspace because colorspace in IndexColorModel
+ // has 3 colors despite that there is only 1 color per pixel
+ // in raster
+ result.setColorSpace(new PDJPXColorSpace(ColorSpace.getInstance(ColorSpace.CS_GRAY)));
+ }
+ else
+ {
+ result.setColorSpace(new PDJPXColorSpace(image.getColorModel().getColorSpace()));
+ }
}
return image;
@@ -151,6 +188,9 @@ public final class JPXFilter extends Fil
}
}
+ /**
+ * {@inheritDoc}
+ */
@Override
protected void encode(InputStream input, OutputStream encoded, COSDictionary parameters)
throws IOException