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 2014/05/06 21:04:43 UTC
svn commit: r1592839 - in /pdfbox/trunk/pdfbox/src:
main/java/org/apache/pdfbox/pdmodel/graphics/image/
test/java/org/apache/pdfbox/pdmodel/graphics/image/
Author: tilman
Date: Tue May 6 19:04:42 2014
New Revision: 1592839
URL: http://svn.apache.org/r1592839
Log:
PDFBOX-2057: fix masks for TYPE_4BYTE_ABGR, optimize, improve tests
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/ImageFactory.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/ImageFactory.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/ImageFactory.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/ImageFactory.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/ImageFactory.java Tue May 6 19:04:42 2014
@@ -112,16 +112,22 @@ class ImageFactory
{
throw new UnsupportedOperationException("only RGB color spaces are implemented");
}
+ int width = image.getWidth();
+ int height = image.getHeight();
// create an RGB image without alpha
- BufferedImage rgbImage = new BufferedImage(image.getWidth(), image.getHeight(),
- BufferedImage.TYPE_INT_RGB);
-
- Graphics2D g = rgbImage.createGraphics();
- g.setComposite(AlphaComposite.Src);
- g.drawImage(image, 0, 0, null);
- g.dispose();
-
+ //BEWARE: the previous solution in the history
+ // g.setComposite(AlphaComposite.Src) and g.drawImage()
+ // didn't work properly for TYPE_4BYTE_ABGR.
+ // alpha values of 0 result in a black dest pixel!!!
+ BufferedImage rgbImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
+ for (int x = 0; x < width; ++x)
+ {
+ for (int y = 0; y < height; ++y)
+ {
+ rgbImage.setRGB(x, y, image.getRGB(x, y) & 0xFFFFFF);
+ }
+ }
return rgbImage;
}
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java Tue May 6 19:04:42 2014
@@ -172,9 +172,9 @@ public final class JPEGFactory extends I
BufferedImage awtAlphaImage = getAlphaImage(image);
// create XObject
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ImageIOUtil.writeImage(image, "jpeg", bos, dpi, quality);
- ByteArrayInputStream byteStream = new ByteArrayInputStream(bos.toByteArray());
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ImageIOUtil.writeImage(image, "jpeg", baos, dpi, quality);
+ ByteArrayInputStream byteStream = new ByteArrayInputStream(baos.toByteArray());
PDImageXObject pdImage = new PDImageXObject(document, byteStream);
// add DCT filter
@@ -187,7 +187,7 @@ public final class JPEGFactory extends I
PDImage xAlpha = JPEGFactory.createFromImage(document, awtAlphaImage, quality);
dict.setItem(COSName.SMASK, xAlpha);
}
-
+
// set properties (width, height, depth, color space, etc.)
setPropertiesFromAWT(awtColorImage, pdImage);
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java Tue May 6 19:04:42 2014
@@ -30,7 +30,6 @@ import org.apache.pdfbox.pdmodel.PDDocum
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceColorSpace;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
-import static org.apache.pdfbox.pdmodel.graphics.image.ImageFactory.getColorImage;
/**
* Factory for creating a PDImageXObject containing a lossless compressed image.
@@ -53,10 +52,9 @@ public class LosslessFactory
int bpc;
PDDeviceColorSpace deviceColorSpace;
- // extract color channel
- BufferedImage awtColorImage = getColorImage(image);
-
ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ int height = image.getHeight();
+ int width = image.getWidth();
if ((image.getType() == BufferedImage.TYPE_BYTE_GRAY
|| image.getType() == BufferedImage.TYPE_BYTE_BINARY)
@@ -67,16 +65,17 @@ public class LosslessFactory
// grayscale images need one color per sample
bpc = image.getColorModel().getPixelSize();
deviceColorSpace = PDDeviceGray.INSTANCE;
- int h = awtColorImage.getHeight();
- int w = awtColorImage.getWidth();
- for (int y = 0; y < h; ++y)
+ for (int y = 0; y < height; ++y)
{
- for (int x = 0; x < w; ++x)
+ for (int x = 0; x < width; ++x)
{
- mcios.writeBits(awtColorImage.getRGB(x, y), bpc);
+ mcios.writeBits(image.getRGB(x, y) & 0xFF, bpc);
}
}
- mcios.writeBits(0, 7); // padding
+ while (mcios.getBitOffset() != 0)
+ {
+ mcios.writeBit(0);
+ }
mcios.flush();
mcios.close();
}
@@ -85,13 +84,11 @@ public class LosslessFactory
// RGB
bpc = 8;
deviceColorSpace = PDDeviceRGB.INSTANCE;
- int h = awtColorImage.getHeight();
- int w = awtColorImage.getWidth();
- for (int y = 0; y < h; ++y)
+ for (int y = 0; y < height; ++y)
{
- for (int x = 0; x < w; ++x)
+ for (int x = 0; x < width; ++x)
{
- Color color = new Color(awtColorImage.getRGB(x, y));
+ Color color = new Color(image.getRGB(x, y));
bos.write(color.getRed());
bos.write(color.getGreen());
bos.write(color.getBlue());
@@ -113,8 +110,8 @@ public class LosslessFactory
pdImage.setColorSpace(deviceColorSpace);
pdImage.setBitsPerComponent(bpc);
- pdImage.setHeight(awtColorImage.getHeight());
- pdImage.setWidth(awtColorImage.getWidth());
+ pdImage.setHeight(image.getHeight());
+ pdImage.setWidth(image.getWidth());
// alpha -> soft mask
PDImage xAlpha = createAlphaFromARGBImage(document, image);
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java Tue May 6 19:04:42 2014
@@ -163,7 +163,7 @@ public final class PDImageXObject extend
}
// get image as RGB
- BufferedImage image = SampledImageReader.getRGBImage(this, getColorKeyMask());
+ BufferedImage image = SampledImageReader.getRGBImage(this, getColorKeyMask());
// soft mask (overrides explicit mask)
PDImageXObject softMask = getSoftMask();
Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java Tue May 6 19:04:42 2014
@@ -22,6 +22,8 @@ import junit.framework.TestCase;
import org.apache.pdfbox.io.RandomAccess;
import org.apache.pdfbox.io.RandomAccessFile;
import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
import static org.apache.pdfbox.pdmodel.graphics.image.ValidateXImage.validate;
/**
@@ -41,7 +43,7 @@ public class CCITTFactoryTest extends Te
PDDocument document = new PDDocument();
RandomAccess reader = new RandomAccessFile(new File(tiffPath), "r");
PDImageXObject ximage = CCITTFactory.createFromRandomAccess(document, reader);
- validate(ximage, 1, 344, 287, "tiff");
+ validate(ximage, 1, 344, 287, "tiff", PDDeviceGray.INSTANCE.getName());
document.close();
}
}
Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java Tue May 6 19:04:42 2014
@@ -42,7 +42,7 @@ public class JPEGFactoryTest extends Tes
PDDocument document = new PDDocument();
InputStream stream = JPEGFactoryTest.class.getResourceAsStream("jpeg.jpg");
PDImageXObject ximage = JPEGFactory.createFromStream(document, stream);
- validate(ximage, 8, 344, 287, "jpg");
+ validate(ximage, 8, 344, 287, "jpg", PDDeviceRGB.INSTANCE.getName());
assertEquals(PDDeviceRGB.INSTANCE, ximage.getColorSpace());
document.close();
}
@@ -56,7 +56,7 @@ public class JPEGFactoryTest extends Tes
PDDocument document = new PDDocument();
InputStream stream = JPEGFactoryTest.class.getResourceAsStream("jpeg256.jpg");
PDImageXObject ximage = JPEGFactory.createFromStream(document, stream);
- validate(ximage, 8, 344, 287, "jpg");
+ validate(ximage, 8, 344, 287, "jpg", PDDeviceGray.INSTANCE.getName());
assertEquals(PDDeviceGray.INSTANCE, ximage.getColorSpace());
document.close();
}
@@ -71,7 +71,7 @@ public class JPEGFactoryTest extends Tes
BufferedImage image = ImageIO.read(JPEGFactoryTest.class.getResourceAsStream("jpeg.jpg"));
assertEquals(3, image.getColorModel().getNumComponents());
PDImageXObject ximage = JPEGFactory.createFromImage(document, image);
- validate(ximage, 8, 344, 287, "jpg");
+ validate(ximage, 8, 344, 287, "jpg", PDDeviceRGB.INSTANCE.getName());
assertEquals(PDDeviceRGB.INSTANCE, ximage.getColorSpace());
document.close();
}
@@ -86,7 +86,7 @@ public class JPEGFactoryTest extends Tes
BufferedImage image = ImageIO.read(JPEGFactoryTest.class.getResourceAsStream("jpeg256.jpg"));
assertEquals(1, image.getColorModel().getNumComponents());
PDImageXObject ximage = JPEGFactory.createFromImage(document, image);
- validate(ximage, 8, 344, 287, "jpg");
+ validate(ximage, 8, 344, 287, "jpg", PDDeviceGray.INSTANCE.getName());
assertEquals(PDDeviceGray.INSTANCE, ximage.getColorSpace());
document.close();
}
Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java Tue May 6 19:04:42 2014
@@ -17,10 +17,15 @@ package org.apache.pdfbox.pdmodel.graphi
import java.awt.Graphics;
import java.awt.image.BufferedImage;
+import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import junit.framework.TestCase;
import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
import static org.apache.pdfbox.pdmodel.graphics.image.ValidateXImage.validate;
/**
@@ -30,6 +35,15 @@ import static org.apache.pdfbox.pdmodel.
*/
public class LosslessFactoryTest extends TestCase
{
+ private final File testResultsDir = new File("target/test-output/graphics");
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ testResultsDir.mkdirs();
+ }
+
/**
* Tests RGB LosslessFactoryTest#createFromImage(PDDocument document,
* BufferedImage image)
@@ -41,39 +55,52 @@ public class LosslessFactoryTest extends
PDDocument document = new PDDocument();
BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("png.png"));
- PDImageXObject ximage = LosslessFactory.createFromImage(document, image);
- validate(ximage, 8, 344, 287, "png");
- checkIdent(image, ximage.getImage());
+ PDImageXObject ximage1 = LosslessFactory.createFromImage(document, image);
+ validate(ximage1, 8, 344, 287, "png", PDDeviceRGB.INSTANCE.getName());
+ checkIdent(image, ximage1.getImage());
// Create a grayscale image
BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
Graphics g = grayImage.getGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
- ximage = LosslessFactory.createFromImage(document, grayImage);
- validate(ximage, 8, 344, 287, "png");
- checkIdent(grayImage, ximage.getImage());
+ PDImageXObject ximage2 = LosslessFactory.createFromImage(document, grayImage);
+ validate(ximage2, 8, 344, 287, "png", PDDeviceGray.INSTANCE.getName());
+ checkIdent(grayImage, ximage2.getImage());
// Create a bitonal image
BufferedImage bitonalImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
g = bitonalImage.getGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
- ximage = LosslessFactory.createFromImage(document, bitonalImage);
- validate(ximage, 1, 344, 287, "png");
- checkIdent(bitonalImage, ximage.getImage());
-
+ PDImageXObject ximage3 = LosslessFactory.createFromImage(document, bitonalImage);
+ validate(ximage3, 1, 344, 287, "png", PDDeviceGray.INSTANCE.getName());
+ checkIdent(bitonalImage, ximage3.getImage());
+
+ // This part isn't really needed because this test doesn't break
+ // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+ // if something goes wrong in the future and we want to have a PDF to open.
+ PDPage page = new PDPage();
+ document.addPage(page);
+ PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+ contentStream.drawXObject(ximage1, 200, 300, ximage1.getWidth() / 2, ximage1.getHeight() / 2);
+ contentStream.drawXObject(ximage2, 200, 450, ximage2.getWidth() / 2, ximage2.getHeight() / 2);
+ contentStream.drawXObject(ximage3, 200, 600, ximage3.getWidth() / 2, ximage3.getHeight() / 2);
+ contentStream.close();
+ File pdfFile = new File(testResultsDir, "misc.pdf");
+ document.save(pdfFile);
+ document.close();
+ document = PDDocument.loadNonSeq(pdfFile, null);
document.close();
-
}
/**
- * Tests ARGB LosslessFactoryTest#createFromImage(PDDocument document,
+ * Tests INT_ARGB LosslessFactoryTest#createFromImage(PDDocument document,
* BufferedImage image)
*
* @throws java.io.IOException
*/
- public void testCreateLosslessFromImageARGB() throws IOException
+ public void testCreateLosslessFromImageINT_ARGB() throws IOException
{
PDDocument document = new PDDocument();
BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("png.png"));
@@ -86,26 +113,91 @@ public class LosslessFactoryTest extends
ag.drawImage(image, 0, 0, null);
ag.dispose();
- // create a weird transparency triangle
- for (int y = 0; y < h; ++y)
+ for (int x = 0; x < argbImage.getWidth(); ++x)
{
- for (int x = 0; x < Math.min(y, w); ++x)
+ for (int y = 0; y < argbImage.getHeight(); ++y)
{
- argbImage.setRGB(x, y, image.getRGB(x, y) & 0xFFFFFF | ((x * 255 / w) << 24));
+ argbImage.setRGB(x, y, (argbImage.getRGB(x, y) & 0xFFFFFF) | ((y / 10 * 10) << 24));
}
}
PDImageXObject ximage = LosslessFactory.createFromImage(document, argbImage);
- validate(ximage, 8, 344, 287, "png");
+ validate(ximage, 8, 344, 287, "png", PDDeviceRGB.INSTANCE.getName());
+ checkIdent(argbImage, ximage.getImage());
+ checkIdentRGB(argbImage, SampledImageReader.getRGBImage(ximage, null));
+
+ assertNotNull(ximage.getSoftMask());
+ validate(ximage.getSoftMask(), 8, 344, 287, "png", PDDeviceGray.INSTANCE.getName());
+
+ // This part isn't really needed because this test doesn't break
+ // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+ // if something goes wrong in the future and we want to have a PDF to open.
+ PDPage page = new PDPage();
+ document.addPage(page);
+ PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+ contentStream.drawXObject(ximage, 150, 300, ximage.getWidth(), ximage.getHeight());
+ contentStream.drawXObject(ximage, 200, 350, ximage.getWidth(), ximage.getHeight());
+ contentStream.close();
+ File pdfFile = new File(testResultsDir, "intargb.pdf");
+ document.save(pdfFile);
+ document.close();
+ document = PDDocument.loadNonSeq(pdfFile, null);
+ document.close();
+ }
+
+ /**
+ * Tests 4BYTE_ABGR LosslessFactoryTest#createFromImage(PDDocument document,
+ * BufferedImage image)
+ *
+ * @throws java.io.IOException
+ */
+ public void testCreateLosslessFromImage4BYTE_ABGR() throws IOException
+ {
+ PDDocument document = new PDDocument();
+ BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("png.png"));
+
+ // create an ARGB image
+ int w = image.getWidth();
+ int h = image.getHeight();
+ BufferedImage argbImage = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
+ Graphics ag = argbImage.getGraphics();
+ ag.drawImage(image, 0, 0, null);
+ ag.dispose();
+
+ for (int x = 0; x < argbImage.getWidth(); ++x)
+ {
+ for (int y = 0; y < argbImage.getHeight(); ++y)
+ {
+ argbImage.setRGB(x, y, (argbImage.getRGB(x, y) & 0xFFFFFF) | ((y / 10 * 10) << 24));
+ }
+ }
+
+ PDImageXObject ximage = LosslessFactory.createFromImage(document, argbImage);
+ validate(ximage, 8, 344, 287, "png", PDDeviceRGB.INSTANCE.getName());
+ checkIdent(argbImage, ximage.getImage());
+ checkIdentRGB(argbImage, SampledImageReader.getRGBImage(ximage, null));
assertNotNull(ximage.getSoftMask());
- validate(ximage.getSoftMask(), 8, 344, 287, "png");
+ validate(ximage.getSoftMask(), 8, 344, 287, "png", PDDeviceGray.INSTANCE.getName());
+ // This part isn't really needed because this test doesn't break
+ // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+ // if something goes wrong in the future and we want to have a PDF to open.
+ PDPage page = new PDPage();
+ document.addPage(page);
+ PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+ contentStream.drawXObject(ximage, 150, 300, ximage.getWidth(), ximage.getHeight());
+ contentStream.drawXObject(ximage, 200, 350, ximage.getWidth(), ximage.getHeight());
+ contentStream.close();
+ File pdfFile = new File(testResultsDir, "4bargb.pdf");
+ document.save(pdfFile);
+ document.close();
+ document = PDDocument.loadNonSeq(pdfFile, null);
document.close();
}
/**
- * Check whether images are identical.
+ * Check whether the images are identical.
*
* @param expectedImage
* @param actualImage
@@ -116,17 +208,45 @@ public class LosslessFactoryTest extends
int w = expectedImage.getWidth();
int h = expectedImage.getHeight();
+ assertEquals(w, actualImage.getWidth());
+ assertEquals(h, actualImage.getHeight());
for (int y = 0; y < h; ++y)
{
for (int x = 0; x < w; ++x)
{
if (expectedImage.getRGB(x, y) != actualImage.getRGB(x, y))
{
- errMsg = String.format("(%d,%d) %X != %X", x, y, expectedImage.getRGB(x, y), actualImage.getRGB(x, y));
+ errMsg = String.format("(%d,%d) %08X != %08X", x, y, expectedImage.getRGB(x, y), actualImage.getRGB(x, y));
}
assertEquals(errMsg, expectedImage.getRGB(x, y), actualImage.getRGB(x, y));
}
}
}
+ /**
+ * Check whether the RGB part of images are identical.
+ *
+ * @param expectedImage
+ * @param actualImage
+ */
+ private void checkIdentRGB(BufferedImage expectedImage, BufferedImage actualImage)
+ {
+ String errMsg = "";
+
+ int w = expectedImage.getWidth();
+ int h = expectedImage.getHeight();
+ assertEquals(w, actualImage.getWidth());
+ assertEquals(h, actualImage.getHeight());
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ if ((expectedImage.getRGB(x, y) & 0xFFFFFF) != (actualImage.getRGB(x, y) & 0xFFFFFF))
+ {
+ errMsg = String.format("(%d,%d) %06X != %06X", x, y, expectedImage.getRGB(x, y) & 0xFFFFFF, actualImage.getRGB(x, y) & 0xFFFFFF);
+ }
+ assertEquals(errMsg, expectedImage.getRGB(x, y) & 0xFFFFFF, actualImage.getRGB(x, y) & 0xFFFFFF);
+ }
+ }
+ }
}
Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java Tue May 6 19:04:42 2014
@@ -29,7 +29,7 @@ import org.apache.pdfbox.util.ImageIOUti
*/
public class ValidateXImage
{
- static public void validate(PDImageXObject ximage, int bpc, int width, int height, String format) throws IOException
+ static public void validate(PDImageXObject ximage, int bpc, int width, int height, String format, String colorSpaceName) throws IOException
{
// check the dictionary
assertNotNull(ximage);
@@ -39,13 +39,18 @@ public class ValidateXImage
assertEquals(width, ximage.getWidth());
assertEquals(height, ximage.getHeight());
assertEquals(format, ximage.getSuffix());
+ assertEquals(colorSpaceName, ximage.getColorSpace().getName());
// check the image
assertNotNull(ximage.getImage());
assertEquals(ximage.getWidth(), ximage.getImage().getWidth());
assertEquals(ximage.getHeight(), ximage.getImage().getHeight());
- boolean writeOk = ImageIOUtil.writeImage(ximage.getImage(), format, new NullOutputStream());
+ boolean writeOk = ImageIOUtil.writeImage(ximage.getImage(),
+ format, new NullOutputStream());
+ assertTrue(writeOk);
+ writeOk = ImageIOUtil.writeImage(SampledImageReader.getRGBImage(ximage, null),
+ format, new NullOutputStream());
assertTrue(writeOk);
}