You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2013/07/17 20:12:00 UTC
svn commit: r1504214 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java
Author: lehmi
Date: Wed Jul 17 18:11:59 2013
New Revision: 1504214
URL: http://svn.apache.org/r1504214
Log:
PDFBOX-1638: handle colorspaces with more than 1 bit
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java?rev=1504214&r1=1504213&r2=1504214&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java Wed Jul 17 18:11:59 2013
@@ -18,6 +18,7 @@ package org.apache.pdfbox.pdmodel.graphi
import java.awt.Transparency;
import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
import java.awt.image.DataBufferByte;
import java.awt.image.IndexColorModel;
import java.awt.image.WritableRaster;
@@ -37,14 +38,16 @@ import org.apache.pdfbox.io.IOUtils;
import org.apache.pdfbox.io.RandomAccess;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.common.PDStream;
+import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
+import org.apache.pdfbox.pdmodel.graphics.color.PDIndexed;
/**
* An image class for CCITT Fax.
*
* @author <a href="ben@benlitchfield.com">Ben Litchfield</a>
* @author paul king
- * @version $Revision: 1.6 $
+ *
*/
public class PDCcitt extends PDXObjectImage
{
@@ -79,7 +82,6 @@ public class PDCcitt extends PDXObjectIm
public PDCcitt( PDDocument doc, RandomAccess raf ) throws IOException
{
super( new PDStream(doc),"tiff");
- // super( new PDStream( doc, null, true ), "tiff" );
COSDictionary decodeParms = new COSDictionary();
@@ -148,11 +150,35 @@ public class PDCcitt extends PDXObjectIm
}
boolean blackIsOne = decodeParms.getBoolean(COSName.BLACK_IS_1, false);
- BufferedImage image = new BufferedImage(cols, rows, BufferedImage.TYPE_BYTE_BINARY);
- WritableRaster raster = image.getRaster();
+ byte[] bufferData = null;
+ ColorModel colorModel = null;
+ PDColorSpace colorspace = getColorSpace();
+ // most likely there is no colorspace as a CCITT-filter uses 1-bit values mapped to black/white
+ // in some rare cases other colorspaces maybe used such as an indexed colorspace, see PDFBOX-1638
+ if (colorspace instanceof PDIndexed)
+ {
+ PDIndexed csIndexed = (PDIndexed)colorspace;
+ COSBase maskArray = getMask();
+ if (maskArray != null && maskArray instanceof COSArray)
+ {
+ colorModel = csIndexed.createColorModel(8, ((COSArray)maskArray).getInt(0));
+ }
+ else
+ {
+ colorModel = csIndexed.createColorModel(8);
+ }
+ }
+ else
+ {
+ byte[] map = new byte[] {(byte)0xff, (byte)0x00};
+ colorModel = new IndexColorModel(1, map.length, map, map, map, Transparency.OPAQUE);
+ }
+ WritableRaster raster = colorModel.createCompatibleWritableRaster( cols, rows );
DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();
- byte[] bufferData = buffer.getData();
+ bufferData = buffer.getData();
IOUtils.populateBuffer(stream.getUnfilteredStream(), bufferData);
+ BufferedImage image = new BufferedImage(colorModel, raster, false, null);
+
if (!blackIsOne)
{
//Inverting the bitmap
@@ -167,17 +193,16 @@ public class PDCcitt extends PDXObjectIm
*/
if(hasMask())
{
- byte map[] = new byte[] {(byte)0x00, (byte)0xff};
- IndexColorModel cm = new IndexColorModel(1, map.length, map, map, map, Transparency.OPAQUE);
- raster = cm.createCompatibleWritableRaster( image.getWidth(), image.getHeight() );
- buffer = (DataBufferByte)raster.getDataBuffer();
- bufferData = buffer.getData();
-
- byte array[] = ((DataBufferByte)image.getData().getDataBuffer()).getData();
- System.arraycopy( array, 0,bufferData, 0,
- (array.length<bufferData.length?array.length: bufferData.length) );
- BufferedImage indexed = new BufferedImage(cm, raster, false, null);
- image = indexed;
+ byte[] map = new byte[] {(byte)0x00, (byte)0xff};
+ IndexColorModel cm = new IndexColorModel(1, map.length, map, map, map, Transparency.OPAQUE);
+ raster = cm.createCompatibleWritableRaster( cols, rows );
+ bufferData = ((DataBufferByte)raster.getDataBuffer()).getData();
+
+ byte[] array = ((DataBufferByte)image.getData().getDataBuffer()).getData();
+ System.arraycopy( array, 0,bufferData, 0,
+ (array.length<bufferData.length?array.length: bufferData.length) );
+ BufferedImage indexed = new BufferedImage(cm, raster, false, null);
+ image = indexed;
}
return applyMasks(image);