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 2013/11/09 04:18:33 UTC
svn commit: r1540252 - in /commons/proper/imaging/trunk/src:
main/java/org/apache/commons/imaging/formats/tiff/taginfos/
main/java/org/apache/commons/imaging/palette/ test/data/images/
test/data/images/tiff/7/ test/java/org/apache/commons/imaging/ test...
Author: damjan
Date: Sat Nov 9 03:18:33 2013
New Revision: 1540252
URL: http://svn.apache.org/r1540252
Log:
Add some Javadoc and tests.
Fix a bug in string parsing from TIFF tags.
Fix a ColorGroup bug where a list that needs to be sorted is immutable.
Added:
commons/proper/imaging/trunk/src/test/data/images/tiff/7/
commons/proper/imaging/trunk/src/test/data/images/tiff/7/Oregon Scientific DS6639 - DSC_0307 - small - CMYK.tiff (with props)
commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffReadWriteTagsTest.java (with props)
commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/palette/
commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/palette/PaletteQuantizationTest.java (with props)
Modified:
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/ColorGroup.java
commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/Dithering.java
commons/proper/imaging/trunk/src/test/data/images/info.txt
commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/ImagingGuessFormatTest.java
commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffRoundtripTest.java
Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java?rev=1540252&r1=1540251&r2=1540252&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/tiff/taginfos/TagInfoAscii.java Sat Nov 9 03:18:33 2013
@@ -30,7 +30,7 @@ public class TagInfoAscii extends TagInf
}
public String[] getValue(final ByteOrder byteOrder, final byte[] bytes) {
- int nullCount = 1;
+ int nullCount = 0;
for (int i = 0; i < bytes.length - 1; i++) {
if (bytes[i] == 0) {
nullCount++;
Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/ColorGroup.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/ColorGroup.java?rev=1540252&r1=1540251&r2=1540252&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/ColorGroup.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/ColorGroup.java Sat Nov 9 03:18:33 2013
@@ -16,7 +16,6 @@
*/
package org.apache.commons.imaging.palette;
-import java.util.Collections;
import java.util.List;
import org.apache.commons.imaging.ImageWriteException;
@@ -49,7 +48,7 @@ class ColorGroup {
public ColorGroup(final List<ColorCount> color_counts, final boolean ignoreAlpha)
throws ImageWriteException {
- this.color_counts = Collections.unmodifiableList(color_counts);
+ this.color_counts = color_counts;
this.ignoreAlpha = ignoreAlpha;
if (color_counts.size() < 1) {
Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/Dithering.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/Dithering.java?rev=1540252&r1=1540251&r2=1540252&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/Dithering.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/palette/Dithering.java Sat Nov 9 03:18:33 2013
@@ -20,7 +20,18 @@ import java.awt.image.BufferedImage;
import org.apache.commons.imaging.ImageWriteException;
+/**
+ * Dithering algorithms to use when quantizing an image to paletted form.
+ */
public class Dithering {
+ /**
+ * Changes the given image to only use colors from the given palette,
+ * applying Floyd-Steinberg dithering in the process. Ensure that
+ * your alpha values in the image and in the palette are consistent.
+ * @param image the image to change
+ * @param palette the palette to use
+ * @throws ImageWriteException
+ */
public static void applyFloydSteinbergDithering(final BufferedImage image, final Palette palette) throws ImageWriteException {
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
Modified: commons/proper/imaging/trunk/src/test/data/images/info.txt
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/data/images/info.txt?rev=1540252&r1=1540251&r2=1540252&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/test/data/images/info.txt (original)
+++ commons/proper/imaging/trunk/src/test/data/images/info.txt Sat Nov 9 03:18:33 2013
@@ -208,6 +208,10 @@ tiff/6/bad-interoperability.asm
tiff/6/bad-interoperability.tiff
Contributed by Damjan Jovanovic.
Test image with a 0 count interoperability TIFF tag.
+
+tiff/7/Oregon Scientific DS6639 - DSC_0307 - small - CMYK.tiff
+ Charles Matthew Chen's reference photo, converted by Damjan Jovanovic.
+ Test TIFF with CMYK color.
wbmp/1/Oregon Scientific DS6639 - DSC_0307 - small.wbmp
Charles Matthew Chen's reference photo, converted by Damjan Jovanovic.
Added: commons/proper/imaging/trunk/src/test/data/images/tiff/7/Oregon Scientific DS6639 - DSC_0307 - small - CMYK.tiff
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/data/images/tiff/7/Oregon%20Scientific%20DS6639%20-%20DSC_0307%20-%20small%20-%20CMYK.tiff?rev=1540252&view=auto
==============================================================================
Binary file - no diff available.
Propchange: commons/proper/imaging/trunk/src/test/data/images/tiff/7/Oregon Scientific DS6639 - DSC_0307 - small - CMYK.tiff
------------------------------------------------------------------------------
svn:mime-type = image/tiff
Modified: commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/ImagingGuessFormatTest.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/ImagingGuessFormatTest.java?rev=1540252&r1=1540251&r2=1540252&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/ImagingGuessFormatTest.java (original)
+++ commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/ImagingGuessFormatTest.java Sat Nov 9 03:18:33 2013
@@ -57,7 +57,7 @@ public class ImagingGuessFormatTest exte
// testGuess(ImageFormat.IMAGE_FORMAT_JBIG2, JBIG2_IMAGE_FILE);
}
- public static final String UNKNOWN_IMAGE_FILE = "jpg\\1\\info.txt";
+ public static final String UNKNOWN_IMAGE_FILE = "info.txt";
public void testGuess_unknown() throws Exception {
testGuess(ImageFormats.UNKNOWN, UNKNOWN_IMAGE_FILE);
Added: commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffReadWriteTagsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffReadWriteTagsTest.java?rev=1540252&view=auto
==============================================================================
--- commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffReadWriteTagsTest.java (added)
+++ commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffReadWriteTagsTest.java Sat Nov 9 03:18:33 2013
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.imaging.formats.tiff;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.commons.imaging.FormatCompliance;
+import org.apache.commons.imaging.ImageReadException;
+import org.apache.commons.imaging.ImageWriteException;
+import org.apache.commons.imaging.common.RationalNumber;
+import org.apache.commons.imaging.common.bytesource.ByteSourceArray;
+import org.apache.commons.imaging.formats.tiff.constants.AllTagConstants;
+import org.apache.commons.imaging.formats.tiff.write.TiffImageWriterLossy;
+import org.apache.commons.imaging.formats.tiff.write.TiffOutputDirectory;
+import org.apache.commons.imaging.formats.tiff.write.TiffOutputSet;
+
+public class TiffReadWriteTagsTest extends TiffBaseTest {
+ public void testReadWriteTags() throws ImageWriteException, ImageReadException, IOException {
+ String description = "A pretty picture";
+ short page = 1;
+ RationalNumber twoThirds = new RationalNumber(2, 3);
+ int t4Options = 0;
+ int width = 10;
+ short height = 10;
+ String area = "A good area";
+ float widthRes = 2.2f;
+ double geoDoubleParams = -8.4;
+
+ TiffOutputSet set = new TiffOutputSet();
+ TiffOutputDirectory dir = set.getOrCreateRootDirectory();
+ dir.add(AllTagConstants.TIFF_TAG_IMAGE_DESCRIPTION, description);
+ dir.add(AllTagConstants.TIFF_TAG_PAGE_NUMBER, page, page);
+ dir.add(AllTagConstants.TIFF_TAG_YRESOLUTION, twoThirds);
+ dir.add(AllTagConstants.TIFF_TAG_T4_OPTIONS, t4Options);
+ dir.add(AllTagConstants.TIFF_TAG_IMAGE_WIDTH, width);
+ dir.add(AllTagConstants.TIFF_TAG_IMAGE_LENGTH, new short[] { height });
+ dir.add(AllTagConstants.GPS_TAG_GPS_AREA_INFORMATION, area);
+ dir.add(AllTagConstants.EXIF_TAG_WIDTH_RESOLUTION, widthRes);
+ dir.add(AllTagConstants.EXIF_TAG_GEO_DOUBLE_PARAMS_TAG, geoDoubleParams);
+
+ TiffImageWriterLossy writer = new TiffImageWriterLossy();
+ ByteArrayOutputStream tiff = new ByteArrayOutputStream();
+ writer.write(tiff, set);
+
+ TiffReader reader = new TiffReader(true);
+ Map<String,Object> params = new TreeMap<String,Object>();
+ FormatCompliance formatCompliance = new FormatCompliance("");
+ TiffContents contents = reader.readFirstDirectory(new ByteSourceArray(tiff.toByteArray()), params, true, formatCompliance);
+ TiffDirectory rootDir = contents.directories.get(0);
+ assertEquals(description, rootDir.getSingleFieldValue(AllTagConstants.TIFF_TAG_IMAGE_DESCRIPTION));
+ assertEquals(page, rootDir.getFieldValue(AllTagConstants.TIFF_TAG_PAGE_NUMBER, true)[0]);
+ RationalNumber yRes = rootDir.getSingleFieldValue(AllTagConstants.TIFF_TAG_YRESOLUTION);
+ assertEquals(twoThirds.numerator, yRes.numerator);
+ assertEquals(twoThirds.divisor, yRes.divisor);
+ assertEquals(t4Options, rootDir.getSingleFieldValue(AllTagConstants.TIFF_TAG_T4_OPTIONS));
+ assertEquals(width, rootDir.getSingleFieldValue(AllTagConstants.TIFF_TAG_IMAGE_WIDTH));
+ assertEquals(width, rootDir.getSingleFieldValue(AllTagConstants.TIFF_TAG_IMAGE_LENGTH));
+ assertEquals(area, rootDir.getFieldValue(AllTagConstants.GPS_TAG_GPS_AREA_INFORMATION, true));
+ assertEquals(widthRes, rootDir.getSingleFieldValue(AllTagConstants.EXIF_TAG_WIDTH_RESOLUTION));
+ assertEquals(geoDoubleParams, rootDir.getSingleFieldValue(AllTagConstants.EXIF_TAG_GEO_DOUBLE_PARAMS_TAG));
+ }
+}
Propchange: commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffReadWriteTagsTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffRoundtripTest.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffRoundtripTest.java?rev=1540252&r1=1540251&r2=1540252&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffRoundtripTest.java (original)
+++ commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/tiff/TiffRoundtripTest.java Sat Nov 9 03:18:33 2013
@@ -27,6 +27,7 @@ import org.apache.commons.imaging.ImageF
import org.apache.commons.imaging.ImageInfo;
import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.common.IImageMetadata;
+import org.apache.commons.imaging.formats.tiff.constants.TiffConstants;
import org.apache.commons.imaging.util.Debug;
public class TiffRoundtripTest extends TiffBaseTest {
@@ -50,14 +51,20 @@ public class TiffRoundtripTest extends T
BufferedImage image = Imaging.getBufferedImage(imageFile);
assertNotNull(image);
- final File tempFile = createTempFile(imageFile.getName() + ".", ".tif");
- final Map<String,Object> params = new HashMap<String,Object>();
- Imaging.writeImage(image, tempFile, ImageFormats.TIFF,
- params);
- image = null;
-
- final BufferedImage image2 = Imaging.getBufferedImage(tempFile);
- assertNotNull(image2);
+ final int[] compressions = new int[] {
+ TiffConstants.TIFF_COMPRESSION_UNCOMPRESSED,
+ TiffConstants.TIFF_COMPRESSION_LZW,
+ TiffConstants.TIFF_COMPRESSION_PACKBITS
+ };
+ for (final int compression : compressions) {
+ final File tempFile = createTempFile(imageFile.getName() + "-" + compression + ".", ".tif");
+ final Map<String,Object> params = new HashMap<String,Object>();
+ params.put(TiffConstants.PARAM_KEY_COMPRESSION, compression);
+ Imaging.writeImage(image, tempFile, ImageFormats.TIFF,
+ params);
+ final BufferedImage image2 = Imaging.getBufferedImage(tempFile);
+ assertNotNull(image2);
+ }
}
}
Added: commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/palette/PaletteQuantizationTest.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/palette/PaletteQuantizationTest.java?rev=1540252&view=auto
==============================================================================
--- commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/palette/PaletteQuantizationTest.java (added)
+++ commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/palette/PaletteQuantizationTest.java Sat Nov 9 03:18:33 2013
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.imaging.palette;
+
+import java.awt.image.BufferedImage;
+
+import org.apache.commons.imaging.ImageWriteException;
+import org.apache.commons.imaging.ImagingTest;
+
+public class PaletteQuantizationTest extends ImagingTest {
+ public void testPaletteQuantization() throws ImageWriteException {
+ BufferedImage whiteImage = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
+ for (int y = 0; y < whiteImage.getHeight(); y++) {
+ for (int x = 0; x < whiteImage.getWidth(); x++) {
+ whiteImage.setRGB(x, y, 0xFFFFFF);
+ }
+ }
+ checkPaletteDetails(whiteImage, 10, 1);
+
+ BufferedImage whiteAndBlackImage = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
+ for (int y = 0; y < whiteImage.getHeight(); y++) {
+ for (int x = 0; x < 5; x++) {
+ whiteAndBlackImage.setRGB(x, y, 0xFFFFFF);
+ }
+ for (int x = 5; x < 10; x++) {
+ whiteAndBlackImage.setRGB(x, y, 0x000000);
+ }
+ }
+ checkPaletteDetails(whiteAndBlackImage, 10, 2);
+
+ BufferedImage rainbowImage = new BufferedImage(9, 10, BufferedImage.TYPE_INT_RGB);
+ for (int y = 0; y < whiteImage.getHeight(); y++) {
+ for (int x = 0; x < 3; x++) {
+ rainbowImage.setRGB(x, y, 0xFF0000);
+ }
+ for (int x = 3; x < 6; x++) {
+ rainbowImage.setRGB(x, y, 0x00FF00);
+ }
+ for (int x = 6; x < 9; x++) {
+ rainbowImage.setRGB(x, y, 0x0000FF);
+ }
+ }
+ checkPaletteDetails(rainbowImage, 10, 3);
+ checkPaletteDetails(rainbowImage, 2, 2);
+ }
+
+ private void checkPaletteDetails(BufferedImage image, final int limit, final int expectedSize) throws ImageWriteException {
+ PaletteFactory paletteFactory = new PaletteFactory();
+ Palette palette;
+
+ palette = paletteFactory.makeExactRgbPaletteSimple(image, limit);
+ // too small palettes are null
+ boolean exact = false;
+ if (palette != null) {
+ assertEquals(expectedSize, palette.length());
+ //checkUniqueColors(image, palette);
+ exact = true;
+ }
+ if (exact) {
+ //checkDithering(image, palette);
+ }
+
+ palette = paletteFactory.makeQuantizedRgbaPalette(image, false, limit);
+ assertEquals(expectedSize, palette.length());
+ checkUniqueColors(image, palette);
+ if (exact) {
+ checkPixelsAreIdentical(image, palette);
+ }
+
+ palette = paletteFactory.makeQuantizedRgbPalette(image, limit);
+ assertEquals(expectedSize, palette.length());
+ //checkUniqueColors(image, palette);
+ if (exact) {
+ //checkDithering(image, palette);
+ }
+
+ MedianCutQuantizer medianCutQuantizer = new MedianCutQuantizer(true);
+ palette = medianCutQuantizer.process(
+ image, limit, new MedianCutMostPopulatedBoxesImplementation(), false);
+ assertEquals(expectedSize, palette.length());
+ checkUniqueColors(image, palette);
+ if (exact) {
+ checkPixelsAreIdentical(image, palette);
+ }
+ }
+
+ private void checkUniqueColors(BufferedImage src, Palette palette) throws ImageWriteException {
+ BufferedImage dst = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_RGB);
+ dst.getGraphics().drawImage(src, 0, 0, src.getWidth(), src.getHeight(), null);
+ Dithering.applyFloydSteinbergDithering(dst, palette);
+ Palette ditheredPalette = new PaletteFactory().makeExactRgbPaletteSimple(dst, palette.length() * 2);
+ assertEquals(palette.length(), ditheredPalette.length());
+ }
+
+ private void checkPixelsAreIdentical(BufferedImage src, Palette palette) throws ImageWriteException {
+ BufferedImage dst = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_RGB);
+ dst.getGraphics().drawImage(src, 0, 0, src.getWidth(), src.getHeight(), null);
+ Dithering.applyFloydSteinbergDithering(dst, palette);
+ for (int y = 0; y < src.getHeight(); y++) {
+ for (int x = 0; x < src.getWidth(); x++) {
+ assertEquals(src.getRGB(x, y), dst.getRGB(x, y));
+ }
+ }
+ }
+}
Propchange: commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/palette/PaletteQuantizationTest.java
------------------------------------------------------------------------------
svn:eol-style = native