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 2023/12/19 10:00:49 UTC
svn commit: r1914769 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java
Author: tilman
Date: Tue Dec 19 10:00:49 2023
New Revision: 1914769
URL: http://svn.apache.org/viewvc?rev=1914769&view=rev
Log:
PDFBOX-5738: revert workaround from 5488 and ignore 4 channel YCbCr and remove related code, as suggested by Harald Kuhr; see also twelvemonkeys github issue #878
Modified:
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java
Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java?rev=1914769&r1=1914768&r2=1914769&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java Tue Dec 19 10:00:49 2023
@@ -21,6 +21,7 @@ import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
+
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -32,13 +33,12 @@ import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageInputStream;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.apache.pdfbox.cos.COSDictionary;
+
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -55,21 +55,6 @@ final class DCTFilter extends Filter
private static final int POS_TRANSFORM = 11;
private static final String ADOBE = "Adobe";
- private static XPathExpression xPathExpression;
-
- static
- {
- try
- {
- xPathExpression = XPathFactory.newInstance().newXPath().compile("Chroma/ColorSpaceType/@name");
- }
- catch (XPathExpressionException ex)
- {
- // shouldn't happen unless you changed the expression
- LOG.error(ex.getMessage(), ex);
- }
- }
-
@Override
public DecodeResult decode(InputStream encoded, OutputStream decoded, COSDictionary
parameters, int index, DecodeOptions options) throws IOException
@@ -146,14 +131,14 @@ final class DCTFilter extends Filter
int colorTransform = transform != null ? transform : 0;
// 0 = Unknown (RGB or CMYK), 1 = YCbCr, 2 = YCCK
+ // https://exiftool.org/TagNames/JPEG.html#Adobe
switch (colorTransform)
{
case 0:
// already CMYK
break;
case 1:
- raster = fromYCbCrtoCMYK(raster);
- break;
+ LOG.warn("There is no 4 channel YCbCr, using YCCK");
case 2:
raster = fromYCCKtoCMYK(raster);
break;
@@ -212,24 +197,6 @@ final class DCTFilter extends Filter
return Integer.valueOf(adobe.getAttribute("transform"));
}
}
-
- // PDFBOX-5488: plan B: use ColorSpaceType from the other metadata tree.
- try
- {
- String value = xPathExpression.evaluate(metadata.getAsTree("javax_imageio_1.0"));
- if ("YCbCr".equals(value))
- {
- return 1;
- }
- if ("YCCK".equals(value))
- {
- return 2;
- }
- }
- catch (XPathExpressionException ex)
- {
- return 0;
- }
return 0;
}
@@ -304,44 +271,6 @@ final class DCTFilter extends Filter
// naive RGB to CMYK
int cyan = 255 - r;
- int magenta = 255 - g;
- int yellow = 255 - b;
-
- // update new raster
- value[0] = cyan;
- value[1] = magenta;
- value[2] = yellow;
- value[3] = (int)K;
- writableRaster.setPixel(x, y, value);
- }
- }
- return writableRaster;
- }
-
- private WritableRaster fromYCbCrtoCMYK(Raster raster)
- {
- WritableRaster writableRaster = raster.createCompatibleWritableRaster();
-
- int[] value = new int[4];
- for (int y = 0, height = raster.getHeight(); y < height; y++)
- {
- for (int x = 0, width = raster.getWidth(); x < width; x++)
- {
- raster.getPixel(x, y, value);
-
- // 4-channels 0..255
- float Y = value[0];
- float Cb = value[1];
- float Cr = value[2];
- float K = value[3];
-
- // YCbCr to RGB, see http://www.equasys.de/colorconversion.html
- int r = clamp( (1.164f * (Y-16)) + (1.596f * (Cr - 128)) );
- int g = clamp( (1.164f * (Y-16)) + (-0.392f * (Cb-128)) + (-0.813f * (Cr-128)));
- int b = clamp( (1.164f * (Y-16)) + (2.017f * (Cb-128)));
-
- // naive RGB to CMYK
- int cyan = 255 - r;
int magenta = 255 - g;
int yellow = 255 - b;