mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-08-06 04:55:30 -04:00
TMI-DNG: Initial commit.
This commit is contained in:
parent
f69f706f60
commit
6ab0e64107
65
imageio/imageio-dng/pom.xml
Normal file
65
imageio/imageio-dng/pom.xml
Normal file
@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Copyright (c) 2014, Harald Kuhr
|
||||
~ All rights reserved.
|
||||
~
|
||||
~ Redistribution and use in source and binary forms, with or without
|
||||
~ modification, are permitted provided that the following conditions are met:
|
||||
~ * Redistributions of source code must retain the above copyright
|
||||
~ notice, this list of conditions and the following disclaimer.
|
||||
~ * Redistributions in binary form must reproduce the above copyright
|
||||
~ notice, this list of conditions and the following disclaimer in the
|
||||
~ documentation and/or other materials provided with the distribution.
|
||||
~ * Neither the name "TwelveMonkeys" nor the
|
||||
~ names of its contributors may be used to endorse or promote products
|
||||
~ derived from this software without specific prior written permission.
|
||||
~
|
||||
~ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
~ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
~ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
~ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
~ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
~ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
~ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
~ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
~ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
~ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
~ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>imageio</artifactId>
|
||||
<groupId>com.twelvemonkeys.imageio</groupId>
|
||||
<version>3.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>imageio-dng</artifactId>
|
||||
<name>TwelveMonkeys :: ImageIO :: DNG plugin</name>
|
||||
<description>ImageIO plugin for Adobe Digital Negative and TIFF/EP (DNG).</description>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.twelvemonkeys.imageio</groupId>
|
||||
<artifactId>imageio-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.twelvemonkeys.imageio</groupId>
|
||||
<artifactId>imageio-core</artifactId>
|
||||
<classifier>tests</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.twelvemonkeys.imageio</groupId>
|
||||
<artifactId>imageio-metadata</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<version>${project.version}</version>
|
||||
<groupId>com.twelvemonkeys.imageio</groupId>
|
||||
<artifactId>imageio-jpeg</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
@ -0,0 +1,127 @@
|
||||
package com.twelvemonkeys.imageio.plugins.dng;
|
||||
|
||||
/**
|
||||
* DNG
|
||||
*
|
||||
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
|
||||
* @author last modified by $Author: haraldk$
|
||||
* @version $Id: DNG.java,v 1.0 03.10.14 10:49 haraldk Exp$
|
||||
*/
|
||||
interface DNG {
|
||||
// TODO: Some (all?) of these tags are defined by TIFF/EP, should we reflect that in package/class names?
|
||||
|
||||
/** CFA (Color Filter Array). */
|
||||
int PHOTOMETRIC_CFA = 32803;
|
||||
/** LinearRaw. */
|
||||
int PHOTOMETRIC_LINEAR_RAW = 34892;
|
||||
|
||||
/**
|
||||
* Lossy JPEG.
|
||||
* <p/>
|
||||
* Lossy JPEG (34892) is allowed for IFDs that use PhotometricInterpretation = 34892
|
||||
* (LinearRaw) and 8-bit integer data. This new compression code is required to let the DNG
|
||||
* reader know to use a lossy JPEG decoder rather than a lossless JPEG decoder for this
|
||||
* combination of PhotometricInterpretation and BitsPerSample.
|
||||
*/
|
||||
int COMPRESSION_LOSSY_JPEG = 34892;
|
||||
|
||||
/**
|
||||
* CFARepeatPatternDim
|
||||
* <p/>
|
||||
* This tag encodes the number of pixels horizontally and vertically that are needed to uniquely define the repeat
|
||||
* pattern of the color filter array (CFA) pattern used in the color image sensor. It is mandatory when
|
||||
* PhotometricInterpretation = 32803, and there are no defaults allowed. It is optional when
|
||||
* PhotometricInterpretation = 2 or 6 and SensingMethod = 2, where it can be used to indicate the original sensor
|
||||
* sampling positions.
|
||||
*/
|
||||
int TAG_CFA_REPEAT_PATTERN_DIM = 33421;
|
||||
/**
|
||||
* Indicates the color filter array (CFA) geometric pattern of the image sensor
|
||||
* when a one-chip color area sensor is used.
|
||||
* NOTE: This tag (defined in TIFF/EP) is different from the CFAPattern defined in normal TIFF.
|
||||
*/
|
||||
int TAG_CFA_PATTERN = 33422;
|
||||
|
||||
/** Indicates the image sensor type on the camera or input device. */
|
||||
int TAG_SENSING_METHOD = 37399;
|
||||
|
||||
// From http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/cfapattern.html
|
||||
byte CFA_PATTERN_RED = 0;
|
||||
byte CFA_PATTERN_GREEN = 1;
|
||||
byte CFA_PATTERN_BLUE = 2;
|
||||
byte CFA_PATTERN_CYAN = 3;
|
||||
byte CFA_PATTERN_MAGENTA = 4;
|
||||
byte CFA_PATTERN_YELLOW = 5;
|
||||
byte CFA_PATTERN_WHITE = 6; // ???? Should be KEY?
|
||||
|
||||
/**
|
||||
* This tag encodes the DNG four-tier version number. For files compliant with this version of
|
||||
* the DNG specification (1.4.0.0), this tag should contain the bytes: 1, 4, 0, 0.
|
||||
*/
|
||||
int TAG_DNG_VERSION = 50706;
|
||||
int TAG_DNG_BACKWARD_VERSION = 50707;
|
||||
|
||||
/** UniqueCameraModel defines a unique, non-localized name for the camera model that created the image in the raw file. */
|
||||
int TAG_UNIQUE_CAMERA_MODEL = 50708;
|
||||
int TAG_LOCALIZED_CAMERA_MODEL = 50709;
|
||||
|
||||
/** CFA plane to RGB mapping (default: [0, 1, 2]). */
|
||||
int TAG_CFA_PLANE_COLOR = 50710;
|
||||
/** CFA spatial layout (default: 1). */
|
||||
int TAG_CFA_LAYOUT = 50711;
|
||||
|
||||
/** 1 = Rectangular (or square) layout. */
|
||||
int CFA_LAYOUT_RECTANGULAR = 1;
|
||||
/** 2 = Staggered layout A: even columns are offset down by 1/2 row. */
|
||||
int CFA_LAYOUT_STAGGERED_A = 2;
|
||||
/** 3 = Staggered layout B: even columns are offset up by 1/2 row. */
|
||||
int CFA_LAYOUT_STAGGERED_B = 3;
|
||||
/** 4 = Staggered layout C: even rows are offset right by 1/2 column. */
|
||||
int CFA_LAYOUT_STAGGERED_C = 4;
|
||||
/** 5 = Staggered layout D: even rows are offset left by 1/2 column. */
|
||||
int CFA_LAYOUT_STAGGERED_D = 5;
|
||||
/** 6 = Staggered layout E: even rows are offset up by 1/2 row, even columns are offset left by 1/2 column. */
|
||||
int CFA_LAYOUT_STAGGERED_E = 6;
|
||||
/** 7 = Staggered layout F: even rows are offset up by 1/2 row, even columns are offset right by 1/2 column. */
|
||||
int CFA_LAYOUT_STAGGERED_F = 7;
|
||||
/** 8 = Staggered layout G: even rows are offset down by 1/2 row, even columns are offset left by 1/2 column. */
|
||||
int CFA_LAYOUT_STAGGERED_G = 8;
|
||||
/** 9 = Staggered layout H: even rows are offset down by 1/2 row, even columns are offset right by 1/2 column. */
|
||||
int CFA_LAYOUT_STAGGERED_H = 9;
|
||||
|
||||
/** LinearizationTable describes a lookup table that maps stored values into linear values. */
|
||||
int TAG_LINEARIZATION_TABLE = 50712;
|
||||
|
||||
/** This tag specifies repeat pattern size for the BlackLevel tag. Default: [1, 1]. */
|
||||
int TAG_BLACK_LEVEL_REPEAT_DIM = 50713;
|
||||
|
||||
/**
|
||||
* This tag specifies the zero light (a.k.a. thermal black or black current) encoding level,
|
||||
* as a repeating pattern. Default: 0.
|
||||
*/
|
||||
int TAG_BLACK_LEVEL = 50714;
|
||||
|
||||
// TODO: Rest of DNG tags.
|
||||
// ...
|
||||
|
||||
/**
|
||||
* Horizontal Difference X2.
|
||||
* Same as Horizontal Difference except the pixel two to the left is used rather than the pixel one to the left.
|
||||
*/
|
||||
int PREDICTOR_HORIZONTAL_X2 = 34892;
|
||||
/**
|
||||
* Horizontal Difference X4.
|
||||
* Same as Horizontal Difference except the pixel four to the left is used rather than the pixel one to the left.
|
||||
*/
|
||||
int PREDICTOR_HORIZONTAL_X4 = 34893;
|
||||
/**
|
||||
* Floating Point X2.
|
||||
* Same as Floating Point except the pixel two to the left is used rather than the pixel one to the left.
|
||||
*/
|
||||
int PREDICTOR_FLOATINGPOINT_X2 = 34894;
|
||||
/**
|
||||
* Floating Point X4.
|
||||
* Same as Floating Point except the pixel four to the left is used rather than the pixel one to the left
|
||||
*/
|
||||
int PREDICTOR_FLOATINGPOINT_X4 = 34895;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,125 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Harald Kuhr
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name "TwelveMonkeys" nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package com.twelvemonkeys.imageio.plugins.dng;
|
||||
|
||||
import com.twelvemonkeys.imageio.metadata.exif.TIFF;
|
||||
import com.twelvemonkeys.imageio.spi.ProviderInfo;
|
||||
import com.twelvemonkeys.imageio.util.IIOUtil;
|
||||
|
||||
import javax.imageio.ImageReader;
|
||||
import javax.imageio.spi.ImageReaderSpi;
|
||||
import javax.imageio.stream.ImageInputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteOrder;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* CR2ImageReaderSpi
|
||||
*
|
||||
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
|
||||
* @author last modified by $Author: haraldk$
|
||||
* @version $Id: CR2ImageReaderSpi.java,v 1.0 07.04.14 21:26 haraldk Exp$
|
||||
*/
|
||||
public final class DNGImageReaderSpi extends ImageReaderSpi {
|
||||
public DNGImageReaderSpi() {
|
||||
this(IIOUtil.getProviderInfo(DNGImageReaderSpi.class));
|
||||
}
|
||||
|
||||
private DNGImageReaderSpi(final ProviderInfo pProviderInfo) {
|
||||
super(
|
||||
pProviderInfo.getVendorName(),
|
||||
pProviderInfo.getVersion(),
|
||||
new String[]{"dng", "NDG"},
|
||||
new String[]{"dng"},
|
||||
new String[]{
|
||||
"image/x-adobe-dng", // TODO: Look up
|
||||
},
|
||||
"com.twelvemonkeys.imageio.plugins.dng.DNGImageReader",
|
||||
new Class[] {ImageInputStream.class},
|
||||
null,
|
||||
true, null, null, null, null,
|
||||
true,
|
||||
null, null,
|
||||
null, null
|
||||
);
|
||||
}
|
||||
|
||||
public boolean canDecodeInput(final Object pSource) throws IOException {
|
||||
if (!(pSource instanceof ImageInputStream)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ImageInputStream stream = (ImageInputStream) pSource;
|
||||
|
||||
stream.mark();
|
||||
try {
|
||||
byte[] bom = new byte[2];
|
||||
stream.readFully(bom);
|
||||
|
||||
ByteOrder originalOrder = stream.getByteOrder();
|
||||
|
||||
try {
|
||||
if (bom[0] == 'I' && bom[1] == 'I') {
|
||||
stream.setByteOrder(ByteOrder.LITTLE_ENDIAN);
|
||||
}
|
||||
else if (bom[0] == 'M' && bom[1] == 'M') {
|
||||
stream.setByteOrder(ByteOrder.BIG_ENDIAN);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
|
||||
int tiffMagic = stream.readUnsignedShort();
|
||||
if (tiffMagic != TIFF.TIFF_MAGIC) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: This is not different from a normal TIFF...
|
||||
|
||||
return true;
|
||||
}
|
||||
finally {
|
||||
stream.setByteOrder(originalOrder);
|
||||
}
|
||||
}
|
||||
finally {
|
||||
stream.reset();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageReader createReaderInstance(Object extension) throws IOException {
|
||||
return new DNGImageReader(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription(Locale locale) {
|
||||
return "Adobe Digital Negative (DNG) format Reader";
|
||||
}
|
||||
}
|
@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Harald Kuhr
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name "TwelveMonkeys" nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package com.twelvemonkeys.imageio.plugins.dng;
|
||||
|
||||
import com.twelvemonkeys.imageio.util.ImageReaderAbstractTestCase;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.imageio.ImageReader;
|
||||
import javax.imageio.spi.ImageReaderSpi;
|
||||
import java.awt.*;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* CR2ImageReaderTest
|
||||
*
|
||||
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
|
||||
* @author last modified by $Author: haraldk$
|
||||
* @version $Id: CR2ImageReaderTest.java,v 1.0 07.04.14 21:52 haraldk Exp$
|
||||
*/
|
||||
public class DNGImageReaderTest extends ImageReaderAbstractTestCase {
|
||||
@Override
|
||||
protected List<TestData> getTestData() {
|
||||
return Arrays.asList(
|
||||
new TestData(getClassLoaderResource("/dng/L1004220.DNG"),
|
||||
// Uncompressed RGB (thumbnail), Ucompressed CFA
|
||||
// new Dimension(320, 216),
|
||||
new Dimension(5216, 3472)),
|
||||
new TestData(getClassLoaderResource("/dng/IMG_2224.dng"),
|
||||
// Uncompressed RGB (thumbnail), JPEG Lossless CFA, JPEG DCT YCbCr
|
||||
// new Dimension(256, 171),
|
||||
new Dimension(3516, 2328),
|
||||
new Dimension(1024, 683))
|
||||
// new TestData(getClassLoaderResource("/dng/test.dng"), new Dimension(2, 2)) // Only JPEG Lossless CFA
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ImageReaderSpi createProvider() {
|
||||
return new DNGImageReaderSpi();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ImageReader createReader() {
|
||||
return new com.twelvemonkeys.imageio.plugins.dng.DNGImageReader(createProvider());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Class getReaderClass() {
|
||||
return com.twelvemonkeys.imageio.plugins.dng.DNGImageReader.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> getFormatNames() {
|
||||
return Arrays.asList("dng");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> getSuffixes() {
|
||||
return Arrays.asList("dng");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> getMIMETypes() {
|
||||
return Arrays.asList("image/x-dng");
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore("Known issue: Subsampled reading not supported")
|
||||
@Override
|
||||
public void testReadWithSubsampleParamPixels() throws IOException {
|
||||
super.testReadWithSubsampleParamPixels();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore("Known issue: Source region reading not supported")
|
||||
@Override
|
||||
public void testReadWithSourceRegionParamEqualImage() throws IOException {
|
||||
super.testReadWithSourceRegionParamEqualImage();
|
||||
}
|
||||
}
|
BIN
imageio/imageio-dng/src/test/resources/dng/IMG_2224.dng
Executable file
BIN
imageio/imageio-dng/src/test/resources/dng/IMG_2224.dng
Executable file
Binary file not shown.
BIN
imageio/imageio-dng/src/test/resources/dng/L1004220.DNG
Normal file
BIN
imageio/imageio-dng/src/test/resources/dng/L1004220.DNG
Normal file
Binary file not shown.
BIN
imageio/imageio-dng/src/test/resources/dng/L1004235.DNG
Normal file
BIN
imageio/imageio-dng/src/test/resources/dng/L1004235.DNG
Normal file
Binary file not shown.
BIN
imageio/imageio-dng/src/test/resources/dng/L1004432.DNG
Normal file
BIN
imageio/imageio-dng/src/test/resources/dng/L1004432.DNG
Normal file
Binary file not shown.
BIN
imageio/imageio-dng/src/test/resources/dng/test.dng
Normal file
BIN
imageio/imageio-dng/src/test/resources/dng/test.dng
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user