You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by da...@apache.org on 2012/06/27 20:42:24 UTC
svn commit: r1354661 - in /commons/proper/imaging/trunk/src:
main/java/org/apache/commons/imaging/formats/dcx/
main/java/org/apache/commons/imaging/formats/ico/
main/java/org/apache/commons/imaging/formats/pcx/
test/java/org/apache/commons/imaging/roun...
Author: damjan
Date: Wed Jun 27 18:42:22 2012
New Revision: 1354661
URL: http://svn.apache.org/viewvc?rev=1354661&view=rev
Log:
Add a pixel density test, and fix pixel density implementations in PCX, DCX and ICO formats.
Modified:
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/pcx/PcxWriter.java
commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripTest.java
Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java?rev=1354661&r1=1354660&r2=1354661&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/dcx/DcxImageParser.java Wed Jun 27 18:42:22 2012
@@ -33,6 +33,7 @@ import org.apache.commons.imaging.ImageI
import org.apache.commons.imaging.ImageParser;
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.ImageWriteException;
+import org.apache.commons.imaging.PixelDensity;
import org.apache.commons.imaging.common.BinaryOutputStream;
import org.apache.commons.imaging.common.IImageMetadata;
import org.apache.commons.imaging.common.bytesource.ByteSource;
@@ -217,6 +218,17 @@ public class DcxImageParser extends Imag
.remove(PcxConstants.PARAM_KEY_PCX_COMPRESSION);
pcxParams.put(PcxConstants.PARAM_KEY_PCX_COMPRESSION, value);
}
+
+ if (params.containsKey(PARAM_KEY_PIXEL_DENSITY)) {
+ Object value = params.remove(PARAM_KEY_PIXEL_DENSITY);
+ if (value != null) {
+ if (!(value instanceof PixelDensity))
+ throw new ImageWriteException(
+ "Invalid pixel density parameter");
+ pcxParams.put(PARAM_KEY_PIXEL_DENSITY, (PixelDensity) value);
+ }
+ }
+
if (params.size() > 0) {
Object firstKey = params.keySet().iterator().next();
Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java?rev=1354661&r1=1354660&r2=1354661&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/ico/IcoImageParser.java Wed Jun 27 18:42:22 2012
@@ -36,6 +36,7 @@ import org.apache.commons.imaging.ImageP
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.ImageWriteException;
import org.apache.commons.imaging.Imaging;
+import org.apache.commons.imaging.PixelDensity;
import org.apache.commons.imaging.common.BinaryOutputStream;
import org.apache.commons.imaging.common.IImageMetadata;
import org.apache.commons.imaging.common.bytesource.ByteSource;
@@ -719,6 +720,8 @@ public class IcoImageParser extends Imag
// clear format key.
if (params.containsKey(PARAM_KEY_FORMAT))
params.remove(PARAM_KEY_FORMAT);
+
+ PixelDensity pixelDensity = (PixelDensity) params.remove(PARAM_KEY_PIXEL_DENSITY);
if (params.size() > 0) {
Object firstKey = params.keySet().iterator().next();
@@ -785,8 +788,8 @@ public class IcoImageParser extends Imag
bos.write2Bytes(bitCount);
bos.write4Bytes(0); // compression
bos.write4Bytes(0); // image size
- bos.write4Bytes(0); // x pixels per meter
- bos.write4Bytes(0); // y pixels per meter
+ bos.write4Bytes(pixelDensity == null ? 0 : (int)Math.round(pixelDensity.horizontalDensityMetres())); // x pixels per meter
+ bos.write4Bytes(pixelDensity == null ? 0 : (int)Math.round(pixelDensity.horizontalDensityMetres())); // y pixels per meter
bos.write4Bytes(0); // colors used, 0 = (1 << bitCount) (ignored)
bos.write4Bytes(0); // colors important
Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/pcx/PcxWriter.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/pcx/PcxWriter.java?rev=1354661&r1=1354660&r2=1354661&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/pcx/PcxWriter.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/pcx/PcxWriter.java Wed Jun 27 18:42:22 2012
@@ -72,8 +72,7 @@ public class PcxWriter implements PcxCon
if (!(value instanceof PixelDensity))
throw new ImageWriteException(
"Invalid pixel density parameter");
- pixelDensity = (PixelDensity) params
- .remove(PARAM_KEY_PIXEL_DENSITY);
+ pixelDensity = (PixelDensity) value;
}
}
if (pixelDensity == null) {
Modified: commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripTest.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripTest.java?rev=1354661&r1=1354660&r2=1354661&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripTest.java (original)
+++ commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/roundtrip/RoundtripTest.java Wed Jun 27 18:42:22 2012
@@ -24,11 +24,13 @@ import java.util.HashMap;
import java.util.Map;
import org.apache.commons.imaging.ImageFormat;
+import org.apache.commons.imaging.ImageInfo;
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.ImageWriteException;
import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.ImagingConstants;
import org.apache.commons.imaging.ImagingTest;
+import org.apache.commons.imaging.PixelDensity;
import org.apache.commons.imaging.common.RgbBufferedImageFactory;
import org.apache.commons.imaging.util.Debug;
import org.apache.commons.imaging.util.IoUtils;
@@ -46,53 +48,56 @@ public class RoundtripTest extends Imagi
public final boolean canWrite;
public final int colorSupport;
public final boolean identicalSecondWrite;
+ public final boolean preservesResolution;
public FormatInfo(ImageFormat format, boolean canRead,
boolean canWrite, int colorSupport,
- final boolean identicalSecondWrite) {
+ final boolean identicalSecondWrite,
+ final boolean preservesResolution) {
this.canRead = canRead;
this.canWrite = canWrite;
this.colorSupport = colorSupport;
this.format = format;
this.identicalSecondWrite = identicalSecondWrite;
+ this.preservesResolution = preservesResolution;
}
}
private static final FormatInfo FORMAT_INFOS[] = { //
new FormatInfo(ImageFormat.IMAGE_FORMAT_PNG, true, true,
- COLOR_FULL_RGB, true), //
+ COLOR_FULL_RGB, true, true), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_GIF, true, true,
- COLOR_LIMITED_INDEX, true), //
+ COLOR_LIMITED_INDEX, true, false), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_ICO, true, true,
- COLOR_FULL_RGB, true), //
+ COLOR_FULL_RGB, true, true), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_TIFF, true, true,
- COLOR_FULL_RGB, true), //
+ COLOR_FULL_RGB, true, true), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_JPEG, true, false,
- COLOR_FULL_RGB, true), //
+ COLOR_FULL_RGB, true, true), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_BMP, true, true,
- COLOR_FULL_RGB, true), //
+ COLOR_FULL_RGB, true, false), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_PSD, true, false,
- COLOR_FULL_RGB, true), //
+ COLOR_FULL_RGB, true, true), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_PBM, true, true,
- COLOR_BITMAP, true), //
+ COLOR_BITMAP, true, false), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_PGM, true, true,
- COLOR_GRAYSCALE, true), //
+ COLOR_GRAYSCALE, true, false), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_PPM, true, true,
- COLOR_FULL_RGB, true), //
+ COLOR_FULL_RGB, true, false), //
// new FormatInfo(ImageFormat.IMAGE_FORMAT_PNM, true, true,
// COLOR_FULL_RGB, true), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_TGA, false, false,
- COLOR_FULL_RGB, true), //
+ COLOR_FULL_RGB, true, true), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_WBMP, true, true,
- COLOR_BITMAP, true), //
+ COLOR_BITMAP, true, false), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_PCX, true, true,
- COLOR_FULL_RGB, true), //
+ COLOR_FULL_RGB, true, true), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_DCX, true, true,
- COLOR_FULL_RGB, true), //
+ COLOR_FULL_RGB, true, true), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_XBM, true, true,
- COLOR_BITMAP, false), //
+ COLOR_BITMAP, false, false), //
new FormatInfo(ImageFormat.IMAGE_FORMAT_XPM, true, true,
- COLOR_FULL_RGB, false), //
+ COLOR_FULL_RGB, false, false), //
};
private BufferedImage createArgbBitmapImage(int width, int height) {
@@ -378,6 +383,40 @@ public class RoundtripTest extends Imagi
}
}
}
+
+ public void testPixelDensityRoundtrip() throws IOException,
+ ImageReadException, ImageWriteException {
+ BufferedImage testImage = createFullColorImage(2, 2);
+ for (FormatInfo formatInfo : FORMAT_INFOS) {
+ if (!formatInfo.canRead || !formatInfo.canWrite || !formatInfo.preservesResolution)
+ continue;
+
+ Debug.debug("pixel density test: " + formatInfo.format.name);
+
+ File temp1 = createTempFile("pixeldensity.", "."
+ + formatInfo.format.extension);
+
+ Map params = new HashMap();
+ PixelDensity pixelDensity = PixelDensity.createFromPixelsPerInch(75, 150);
+ params.put(ImagingConstants.PARAM_KEY_PIXEL_DENSITY, pixelDensity);
+ Imaging.writeImage(testImage, temp1, formatInfo.format, params);
+
+ ImageInfo imageInfo = Imaging.getImageInfo(temp1);
+ if (imageInfo == null)
+ continue;
+ int xReadDPI = imageInfo.getPhysicalWidthDpi();
+ int yReadDPI = imageInfo.getPhysicalHeightDpi();
+ // allow a 5% margin of error in storage and conversion
+ assertTrue("horizontal pixel density stored wrongly for " + formatInfo.format +
+ " in=" + pixelDensity.horizontalDensityInches() + ", out=" + xReadDPI,
+ Math.abs((xReadDPI - pixelDensity.horizontalDensityInches()) /
+ pixelDensity.horizontalDensityInches()) <= 0.05);
+ assertTrue("vertical pixel density stored wrongly for " + formatInfo.format +
+ " in=" + pixelDensity.verticalDensityInches() + ", out=" + yReadDPI,
+ Math.abs((yReadDPI - pixelDensity.verticalDensityInches()) /
+ pixelDensity.verticalDensityInches()) <= 0.05);
+ }
+ }
private void roundtrip(FormatInfo formatInfo, BufferedImage testImage,
String tempPrefix, boolean imageExact) throws IOException,