You are viewing a plain text version of this content. The canonical link for it is here.
Posted to sanselan-commits@incubator.apache.org by cm...@apache.org on 2008/01/07 08:12:05 UTC
svn commit: r609529 [1/2] - in /incubator/sanselan/trunk/src:
main/java/org/apache/sanselan/common/
main/java/org/apache/sanselan/formats/jpeg/
main/java/org/apache/sanselan/formats/jpeg/exifRewrite/
main/java/org/apache/sanselan/formats/tiff/constants...
Author: cmchen
Date: Mon Jan 7 00:12:01 2008
New Revision: 609529
URL: http://svn.apache.org/viewvc?rev=609529&view=rev
Log:
Having completed the neccesarily preliminaries, I'm read to start work on the "lossless" (Maker-Note safe) exif rewrite approach. We're going to bump up against the APP1 segment limit very quickly.
Added:
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/ImageDataOffsets.java (with props)
Removed:
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/ImageDataInfo.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossy2.java
Modified:
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegImageParser.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/exifRewrite/ExifRewriter.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffFieldTypeConstants.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterBase.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossless.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossy.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputDirectory.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java
incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSummary.java
incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/ExifRewriteTest.java
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java Mon Jan 7 00:12:01 2008
@@ -519,7 +519,7 @@
return result;
}
- protected final byte[] getBytearrayTail(String name, byte bytes[], int count)
+ protected final byte[] getByteArrayTail(String name, byte bytes[], int count)
{
return readBytearray(name, bytes, count, bytes.length - count);
}
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegImageParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegImageParser.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegImageParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegImageParser.java Mon Jan 7 00:12:01 2008
@@ -376,7 +376,7 @@
//
// Debug.debug("head", head);
- return getBytearrayTail("trimmed exif bytes", bytes, 6);
+ return getByteArrayTail("trimmed exif bytes", bytes, 6);
}
private JpegImageMetadata.Photoshop getPhotoshopMetadata(
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/exifRewrite/ExifRewriter.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/exifRewrite/ExifRewriter.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/exifRewrite/ExifRewriter.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/exifRewrite/ExifRewriter.java Mon Jan 7 00:12:01 2008
@@ -33,7 +33,7 @@
import org.apache.sanselan.formats.tiff.TiffImageMetadata;
import org.apache.sanselan.formats.tiff.write.TiffImageWriterBase;
import org.apache.sanselan.formats.tiff.write.TiffImageWriterLossless;
-import org.apache.sanselan.formats.tiff.write.TiffImageWriterLossy2;
+import org.apache.sanselan.formats.tiff.write.TiffImageWriterLossy;
import org.apache.sanselan.formats.tiff.write.TiffOutputSet;
import org.apache.sanselan.util.Debug;
@@ -143,98 +143,45 @@
writeSegmentsReplacingExif(os, pieces, null);
}
- // public void rewriteExifMetadataLossless(ByteSource byteSource,
- // OutputStream os, Map params) throws ImageReadException,
- // IOException, ImageWriteException
- // {
- //
- // rewriteExifMetadata(MODE_LOSSLESS, byteSource, os, params);
- // }
- //
- // public void rewriteExifMetadataLossy(ByteSource byteSource,
- // OutputStream os, Map params) throws ImageReadException,
- // IOException, ImageWriteException
- // {
- //
- // rewriteExifMetadata(MODE_LOSSY, byteSource, os, params);
- // }
- //
- // private void rewriteExifMetadata(int mode, ByteSource byteSource,
- // OutputStream os, Map params) throws ImageReadException,
- // IOException, ImageWriteException
- // {
- // JFIFPieces jfifPieces = analyzeJFIF(byteSource);
- // ArrayList pieces = jfifPieces.pieces;
- // GenericSegment exifSegment = jfifPieces.exifSegment;
- //
- // byte exifBytes[] = exifSegment.bytes;
- // exifBytes = getBytearrayTail("trimmed exif bytes", exifBytes, 6);
- //
- // TiffImageMetadata exifMetadata = (TiffImageMetadata) new TiffImageParser()
- // .getMetadata(exifBytes, params);
- //
- // byte newBytes[] = writeExifSegment(mode, exifMetadata, true);
- // // exifSegment.bytes = newBytes;
- //
- // // ArrayList segments = readSegments(byteSource, null, false, true);
- //
- // // TiffImageMetadata exif = getExifMetadata(byteSource, params);
- //
- // writeSegmentsReplacingExif(os, pieces, newBytes);
- // }
-
- // public void updateExifMetadata(ByteSource byteSource, OutputStream os,
- // ArrayList outputDirectories, Map params) throws ImageReadException,
- // IOException, ImageWriteException
- // {
- // JFIFPieces jfifPieces = analyzeJFIF(byteSource);
- // ArrayList pieces = jfifPieces.pieces;
- // GenericSegment exifSegment = jfifPieces.exifSegment;
- //
- // byte exifBytes[] = exifSegment.bytes;
- // exifBytes = getBytearrayTail("trimmed exif bytes", exifBytes, 6);
- //
- // TiffImageMetadata exifMetadata = (TiffImageMetadata) new TiffImageParser()
- // .getMetadata(exifBytes, params);
- // int byteOrder = exifMetadata.contents.header.byteOrder;
- //
- // byte newBytes[] = writeExifSegment(outputDirectories, byteOrder, true);
- //
- // writeSegmentsReplacingExif(os, pieces, newBytes);
- // }
-
- private static final int MODE_LOSSY = -1;
- private static final int MODE_LOSSLESS = -2;
+ // private static final int MODE_LOSSY = -1;
+ // private static final int MODE_LOSSLESS = -2;
public void updateExifMetadataLossless(ByteSource byteSource,
OutputStream os, TiffOutputSet outputSet)
throws ImageReadException, IOException, ImageWriteException
{
- updateExifMetadata(MODE_LOSSLESS, byteSource, os, outputSet);
+ // List outputDirectories = outputSet.getDirectories();
+ JFIFPieces jfifPieces = analyzeJFIF(byteSource);
+ ArrayList pieces = jfifPieces.pieces;
+ GenericSegment exifSegment = jfifPieces.exifSegment;
+
+ byte exifBytes[] = exifSegment.bytes;
+ exifBytes = getByteArrayTail("trimmed exif bytes", exifBytes, 6);
+
+ TiffImageWriterBase writer = new TiffImageWriterLossless(
+ outputSet.byteOrder, exifBytes);
+
+ boolean includeEXIFPrefix = true;
+ byte newBytes[] = writeExifSegment(writer, outputSet, includeEXIFPrefix);
+
+ Debug.debug("oldBytes", exifBytes.length);
+ Debug.debug("newBytes", newBytes.length);
+
+ writeSegmentsReplacingExif(os, pieces, newBytes);
}
public void updateExifMetadataLossy(ByteSource byteSource, OutputStream os,
TiffOutputSet outputSet) throws ImageReadException, IOException,
ImageWriteException
{
- updateExifMetadata(MODE_LOSSY, byteSource, os, outputSet);
- }
-
- private void updateExifMetadata(int mode, ByteSource byteSource,
- OutputStream os, TiffOutputSet outputSet)
- throws ImageReadException, IOException, ImageWriteException
- {
- // List outputDirectories = outputSet.getDirectories();
JFIFPieces jfifPieces = analyzeJFIF(byteSource);
ArrayList pieces = jfifPieces.pieces;
- GenericSegment exifSegment = jfifPieces.exifSegment;
-
- byte exifBytes[] = exifSegment.bytes;
- exifBytes = getBytearrayTail("trimmed exif bytes", exifBytes, 6);
- // int byteOrder = outputSet.byteOrder;
+ TiffImageWriterBase writer = new TiffImageWriterLossy(
+ outputSet.byteOrder);
- byte newBytes[] = writeExifSegment(mode, outputSet, true);
+ boolean includeEXIFPrefix = true;
+ byte newBytes[] = writeExifSegment(writer, outputSet, includeEXIFPrefix);
writeSegmentsReplacingExif(os, pieces, newBytes);
}
@@ -287,75 +234,22 @@
}
}
- private byte[] writeExifSegment(int mode, TiffImageMetadata exif,
- boolean includeEXIFPrefix) throws IOException, ImageWriteException
- {
- if (exif == null)
- return null;
-
- // int byteOrder = exif.contents.header.byteOrder;
-
- TiffOutputSet outputSet = exif.getOutputSet();
- // TiffOutputSet outputSet = new TiffOutputSet(byteOrder);
- //// ArrayList outputDirectories = new ArrayList();
- // ArrayList srcDirs = exif.getDirectories();
- // for (int i = 0; i < srcDirs.size(); i++)
- // {
- // TiffImageMetadata.Directory srcDir = (TiffImageMetadata.Directory) srcDirs
- // .get(i);
- // // Debug.debug("srcDir", srcDir);
- //
- // // TiffOutputDirectory outputDirectory = translate(srcDir, byteOrder);
- // TiffOutputDirectory outputDirectory = srcDir
- // .getOutputDirectory(byteOrder);
- // outputSet.add(outputDirectory);
- // }
-
- return writeExifSegment(mode, outputSet, includeEXIFPrefix);
- }
-
- // private byte[] writeExifSegment(int mode, TiffOutputSet outputSet,
- // boolean includeEXIFPrefix) throws IOException, ImageWriteException
- // {
- // List outputDirectories = outputSet.getDirectories();
- //
- // return writeExifSegment(mode, outputSet.byteOrder, outputDirectories,
- // includeEXIFPrefix);
- // }
-
//
- // public byte[] writeExifSegmentLossy(List outputDirectories, int byteOrder,
+ // private byte[] writeExifSegment(int mode, TiffOutputSet outputSet,
// boolean includeEXIFPrefix) throws IOException, ImageWriteException
// {
- // TiffImageWriterBase writer = new TiffImageWriter(byteOrder);
- // return writeExifSegment(writer, outputDirectories, byteOrder,
- // includeEXIFPrefix);
- // }
+ // TiffImageWriterBase writer;
+ // if (mode == MODE_LOSSLESS)
+ // writer = new TiffImageWriterLossless(outputSet.byteOrder);
+ // else if (mode == MODE_LOSSY)
+ // writer = new TiffImageWriterLossy(outputSet.byteOrder);
+ // // writer = new TiffImageWriterLossy(outputSet.byteOrder);
+ // else
+ // throw new ImageWriteException("Unknown TIFF write mode.");
//
- // private byte[] writeExifSegmentLossless(List outputDirectories,
- // int byteOrder, boolean includeEXIFPrefix) throws IOException,
- // ImageWriteException
- // {
- // TiffImageWriterBase writer = new TiffImageWriter(byteOrder);
- // return writeExifSegment(writer, outputDirectories, byteOrder,
- // includeEXIFPrefix);
+ // return writeExifSegment(writer, outputSet, includeEXIFPrefix);
// }
- private byte[] writeExifSegment(int mode, TiffOutputSet outputSet,
- boolean includeEXIFPrefix) throws IOException, ImageWriteException
- {
- TiffImageWriterBase writer;
- if (mode == MODE_LOSSLESS)
- writer = new TiffImageWriterLossless(outputSet.byteOrder);
- else if (mode == MODE_LOSSY)
- writer = new TiffImageWriterLossy2(outputSet.byteOrder);
-// writer = new TiffImageWriterLossy(outputSet.byteOrder);
- else
- throw new ImageWriteException("Unknown TIFF write mode.");
-
- return writeExifSegment(writer, outputSet, includeEXIFPrefix);
- }
-
private byte[] writeExifSegment(TiffImageWriterBase writer,
TiffOutputSet outputSet, boolean includeEXIFPrefix)
throws IOException, ImageWriteException
@@ -369,7 +263,7 @@
os.write(0);
}
- writer.writeDirectories(os, outputSet);
+ writer.write(os, outputSet);
return os.toByteArray();
}
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffFieldTypeConstants.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffFieldTypeConstants.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffFieldTypeConstants.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffFieldTypeConstants.java Mon Jan 7 00:12:01 2008
@@ -30,47 +30,6 @@
public interface TiffFieldTypeConstants extends SanselanConstants
{
- // public static final FieldTypeByte FIELD_TYPE_BYTE = new FieldTypeByte(1,
- // "Byte");
- //
- // public static final FieldTypeASCII FIELD_TYPE_ASCII = new FieldTypeASCII(2,
- // "ASCII");
- //
- // public static final FieldTypeShort FIELD_TYPE_SHORT = new FieldTypeShort(3,
- // "Short");
- //
- // public static final FieldTypeLong FIELD_TYPE_LONG = new FieldTypeLong(4,
- // "Long");
- //
- // public static final FieldTypeRational FIELD_TYPE_RATIONAL = new FieldTypeRational(
- // 5, "Rational");
- //
- // public static final FieldType FIELD_TYPE_SBYTE = new FieldTypeByte(6,
- // "SByte");
- // public static final FieldType FIELD_TYPE_UNDEFINED = new FieldTypeByte(7,
- // "Undefined");
- // public static final FieldType FIELD_TYPE_SSHORT = new FieldTypeShort(8,
- // "SShort");
- //
- // public static final FieldType FIELD_TYPE_SLONG = new FieldTypeLong(9,
- // "SLong");
- //
- // public static final FieldType FIELD_TYPE_SRATIONAL = new FieldTypeRational(
- // 10, "SRational");
- //
- // public static final FieldType FIELD_TYPE_FLOAT = new FieldTypeFloat();
- //
- // public static final FieldType FIELD_TYPE_DOUBLE = new FieldTypeDouble();
- //
- // public static final FieldType FIELD_TYPE_UNKNOWN = new FieldTypeUnknown();
- //
- // public static final FieldType FIELD_TYPES[] = {
- // FIELD_TYPE_BYTE, FIELD_TYPE_ASCII, FIELD_TYPE_SHORT,
- // FIELD_TYPE_LONG, FIELD_TYPE_RATIONAL, FIELD_TYPE_SBYTE,
- // FIELD_TYPE_UNDEFINED, FIELD_TYPE_SSHORT, FIELD_TYPE_SLONG,
- // FIELD_TYPE_SRATIONAL, FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE,
- // };
-
public static final FieldTypeByte FIELD_TYPE_BYTE = new FieldTypeByte(1,
"Byte");
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java Mon Jan 7 00:12:01 2008
@@ -20,7 +20,6 @@
import org.apache.sanselan.common.BinaryFileFunctions;
import org.apache.sanselan.formats.tiff.TiffField;
import org.apache.sanselan.formats.tiff.constants.TiffConstants;
-import org.apache.sanselan.formats.tiff.write.TiffImageWriterLossy;
public abstract class FieldType extends BinaryFileFunctions
implements
Added: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/ImageDataOffsets.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/ImageDataOffsets.java?rev=609529&view=auto
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/ImageDataOffsets.java (added)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/ImageDataOffsets.java Mon Jan 7 00:12:01 2008
@@ -0,0 +1,42 @@
+/*
+ * 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.sanselan.formats.tiff.write;
+
+class ImageDataOffsets
+{
+ public final int imageDataOffsets[];
+ public final TiffOutputField imageDataOffsetsField;
+ public final TiffOutputItem outputItems[];
+
+ public ImageDataOffsets(final byte imageData[][],
+ final int[] imageDataOffsets,
+ final TiffOutputField imageDataOffsetsField)
+ {
+ this.imageDataOffsets = imageDataOffsets;
+ this.imageDataOffsetsField = imageDataOffsetsField;
+
+ outputItems = new TiffOutputItem[imageData.length];
+ for (int i = 0; i < imageData.length; i++)
+ {
+ TiffOutputItem item = new TiffOutputItem.Value("TIFF image data",
+ imageData[i]);
+ outputItems[i] = item;
+ }
+
+ }
+
+}
\ No newline at end of file
Propchange: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/ImageDataOffsets.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterBase.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterBase.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterBase.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterBase.java Mon Jan 7 00:12:01 2008
@@ -16,6 +16,7 @@
*/
package org.apache.sanselan.formats.tiff.write;
+import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
@@ -27,6 +28,10 @@
import org.apache.sanselan.ImageWriteException;
import org.apache.sanselan.common.BinaryConstants;
+import org.apache.sanselan.common.PackBits;
+import org.apache.sanselan.common.mylzw.MyLZWCompressor;
+import org.apache.sanselan.formats.tiff.RawTiffImageData;
+import org.apache.sanselan.formats.tiff.TiffDirectory;
import org.apache.sanselan.formats.tiff.constants.TiffConstants;
public abstract class TiffImageWriterBase
@@ -34,6 +39,7 @@
TiffConstants,
BinaryConstants
{
+
public static final int DEFAULT_WRITE_BYTE_ORDER = BYTE_ORDER_INTEL;
protected final int byteOrder;
@@ -53,12 +59,9 @@
return (4 - (dataLength % 4)) % 4;
}
- public abstract void writeDirectories(OutputStream os,
+ public abstract void write(OutputStream os,
TiffOutputSet outputSet) throws IOException, ImageWriteException;
- // public abstract void writeDirectories(OutputStream os, List directories)
- // throws IOException, ImageWriteException;
-
protected TiffOutputSummary validateDirectories(List directories)
throws ImageWriteException
{
@@ -249,6 +252,271 @@
return result;
// Debug.debug();
+ }
+
+ public void writeImage(BufferedImage src, OutputStream os, Map params)
+ throws ImageWriteException, IOException
+ {
+ // writeImageNew(src, os, params);
+ // }
+ //
+ // public void writeImageNew(BufferedImage src, OutputStream os, Map params)
+ // throws ImageWriteException, IOException
+ // {
+
+ // make copy of params; we'll clear keys as we consume them.
+ params = new HashMap(params);
+
+ // clear format key.
+ if (params.containsKey(PARAM_KEY_FORMAT))
+ params.remove(PARAM_KEY_FORMAT);
+
+ int width = src.getWidth();
+ int height = src.getHeight();
+
+ // BinaryOutputStream bos = new BinaryOutputStream(os, WRITE_BYTE_ORDER);
+ //
+ // writeImageFileHeader(bos, WRITE_BYTE_ORDER);
+
+ // ArrayList directoryFields = new ArrayList();
+
+ final int photometricInterpretation = 2; // TODO:
+
+ int compression = TIFF_COMPRESSION_LZW; // LZW is default
+ if (params.containsKey(PARAM_KEY_COMPRESSION))
+ {
+ Object value = params.get(PARAM_KEY_COMPRESSION);
+ if (value != null)
+ {
+ if (!(value instanceof Number))
+ throw new ImageWriteException(
+ "Invalid compression parameter: " + value);
+ compression = ((Number) value).intValue();
+ }
+ params.remove(PARAM_KEY_COMPRESSION);
+ }
+
+ final int samplesPerPixel = 3; // TODO:
+ final int bitsPerSample = 8; // TODO:
+
+ // int fRowsPerStrip; // TODO:
+ int rowsPerStrip = 8000 / (width * samplesPerPixel); // TODO:
+ rowsPerStrip = Math.max(1, rowsPerStrip); // must have at least one.
+
+ byte strips[][] = getStrips(src, samplesPerPixel, bitsPerSample,
+ rowsPerStrip);
+
+ // int stripCount = (height + fRowsPerStrip - 1) / fRowsPerStrip;
+ // int stripCount = strips.length;
+
+ if (params.size() > 0)
+ {
+ Object firstKey = params.keySet().iterator().next();
+ throw new ImageWriteException("Unknown parameter: " + firstKey);
+ }
+
+ // System.out.println("width: " + width);
+ // System.out.println("height: " + height);
+ // System.out.println("fRowsPerStrip: " + fRowsPerStrip);
+ // System.out.println("fSamplesPerPixel: " + fSamplesPerPixel);
+ // System.out.println("stripCount: " + stripCount);
+
+ if (compression == TIFF_COMPRESSION_PACKBITS)
+ {
+ for (int i = 0; i < strips.length; i++)
+ strips[i] = new PackBits().compress(strips[i]);
+ }
+ else if (compression == TIFF_COMPRESSION_LZW)
+ {
+ for (int i = 0; i < strips.length; i++)
+ {
+ byte uncompressed[] = strips[i];
+
+ int LZWMinimumCodeSize = 8;
+
+ MyLZWCompressor compressor = new MyLZWCompressor(
+ LZWMinimumCodeSize, BYTE_ORDER_MSB, true);
+ byte compressed[] = compressor.compress(uncompressed);
+
+ strips[i] = compressed;
+ }
+ }
+ else if (compression == TIFF_COMPRESSION_UNCOMPRESSED)
+ {
+ // do nothing.
+ }
+ else
+ throw new ImageWriteException(
+ "Invalid compression parameter (Only LZW, Packbits and uncompressed supported).");
+
+ // int stripOffsets[] = new int[stripCount];
+ // int stripByteCounts[] = new int[stripCount];
+ //
+ // for (int i = 0; i < strips.length; i++)
+ // stripByteCounts[i] = strips[i].length;
+
+ TiffOutputSet outputSet = new TiffOutputSet(byteOrder);
+ TiffOutputDirectory directory = outputSet.addRootDirectory();
+
+ // WriteField stripOffsetsField;
+
+ {
+ {
+ TiffOutputField field = new TiffOutputField(
+ TIFF_TAG_IMAGE_WIDTH, FIELD_TYPE_LONG, 1,
+ FIELD_TYPE_LONG.writeData(new int[]{
+ width,
+ }, byteOrder));
+ directory.add(field);
+ }
+ {
+ TiffOutputField field = new TiffOutputField(
+ TIFF_TAG_IMAGE_LENGTH, FIELD_TYPE_LONG, 1,
+ FIELD_TYPE_LONG.writeData(new int[]{
+ height,
+ }, byteOrder));
+ directory.add(field);
+ }
+ {
+ TiffOutputField field = new TiffOutputField(
+ TIFF_TAG_PHOTOMETRIC_INTERPRETATION, FIELD_TYPE_SHORT,
+ 1, FIELD_TYPE_SHORT.writeData(new int[]{
+ photometricInterpretation,
+ }, byteOrder));
+ directory.add(field);
+ }
+ {
+ TiffOutputField field = new TiffOutputField(
+ TIFF_TAG_COMPRESSION, FIELD_TYPE_SHORT, 1,
+ FIELD_TYPE_SHORT.writeData(new int[]{
+ compression,
+ }, byteOrder));
+ directory.add(field);
+ }
+ {
+ TiffOutputField field = new TiffOutputField(
+ TIFF_TAG_SAMPLES_PER_PIXEL, FIELD_TYPE_SHORT, 1,
+ FIELD_TYPE_SHORT.writeData(new int[]{
+ samplesPerPixel,
+ }, byteOrder));
+ directory.add(field);
+ }
+ {
+ TiffOutputField field = new TiffOutputField(
+ TIFF_TAG_BITS_PER_SAMPLE, FIELD_TYPE_SHORT, 3,
+ FIELD_TYPE_SHORT.writeData(new int[]{
+ bitsPerSample, bitsPerSample, bitsPerSample,
+ }, byteOrder));
+ directory.add(field);
+ }
+ // {
+ // stripOffsetsField = new WriteField(TIFF_TAG_STRIP_OFFSETS,
+ // FIELD_TYPE_LONG, stripOffsets.length, FIELD_TYPE_LONG
+ // .writeData(stripOffsets, byteOrder));
+ // directory.add(stripOffsetsField);
+ // }
+ // {
+ // WriteField field = new WriteField(TIFF_TAG_STRIP_BYTE_COUNTS,
+ // FIELD_TYPE_LONG, stripByteCounts.length,
+ // FIELD_TYPE_LONG.writeData(stripByteCounts,
+ // WRITE_BYTE_ORDER));
+ // directory.add(field);
+ // }
+ {
+ TiffOutputField field = new TiffOutputField(
+ TIFF_TAG_ROWS_PER_STRIP, FIELD_TYPE_LONG, 1,
+ FIELD_TYPE_LONG.writeData(new int[]{
+ rowsPerStrip,
+ }, byteOrder));
+ directory.add(field);
+ }
+
+ {
+ int resolutionUnit = 2;// inches.
+ TiffOutputField field = new TiffOutputField(
+ TIFF_TAG_RESOLUTION_UNIT, FIELD_TYPE_SHORT, 1,
+ FIELD_TYPE_SHORT.writeData(new int[]{
+ resolutionUnit,
+ }, byteOrder));
+ directory.add(field);
+ }
+
+ {
+ int xResolution = 72;
+ TiffOutputField field = new TiffOutputField(
+ TIFF_TAG_XRESOLUTION, FIELD_TYPE_RATIONAL, 1,
+ FIELD_TYPE_RATIONAL
+ .writeData(xResolution, 1, byteOrder));
+ directory.add(field);
+ }
+
+ {
+ int yResolution = 72;
+ TiffOutputField field = new TiffOutputField(
+ TIFF_TAG_YRESOLUTION, FIELD_TYPE_RATIONAL, 1,
+ FIELD_TYPE_RATIONAL
+ .writeData(yResolution, 1, byteOrder));
+ directory.add(field);
+ }
+
+ }
+
+ RawTiffImageData rawTiffImageData = new RawTiffImageData.Strips(strips);
+ directory.setRawTiffImageData(rawTiffImageData);
+
+ write(os, outputSet);
+ }
+
+ private byte[][] getStrips(BufferedImage src, int samplesPerPixel,
+ int bitsPerSample, int rowsPerStrip)
+ {
+ int width = src.getWidth();
+ int height = src.getHeight();
+
+ int stripCount = (height + rowsPerStrip - 1) / rowsPerStrip;
+
+ byte result[][] = null;
+ { // Write Strips
+ result = new byte[stripCount][];
+
+ int remaining_rows = height;
+
+ for (int i = 0; i < stripCount; i++)
+ {
+ int rowsInStrip = Math.min(rowsPerStrip, remaining_rows);
+ remaining_rows -= rowsInStrip;
+
+ int bitsInStrip = bitsPerSample * rowsInStrip * width
+ * samplesPerPixel;
+ int bytesInStrip = (bitsInStrip + 7) / 8;
+
+ byte uncompressed[] = new byte[bytesInStrip];
+
+ int counter = 0;
+ int y = i * rowsPerStrip;
+ int stop = i * rowsPerStrip + rowsPerStrip;
+
+ for (; (y < height) && (y < stop); y++)
+ {
+ for (int x = 0; x < width; x++)
+ {
+ int rgb = src.getRGB(x, y);
+ int red = 0xff & (rgb >> 16);
+ int green = 0xff & (rgb >> 8);
+ int blue = 0xff & (rgb >> 0);
+
+ uncompressed[counter++] = (byte) red;
+ uncompressed[counter++] = (byte) green;
+ uncompressed[counter++] = (byte) blue;
+ }
+ }
+
+ result[i] = uncompressed;
+ }
+
+ }
+
+ return result;
}
}
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossless.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossless.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossless.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossless.java Mon Jan 7 00:12:01 2008
@@ -22,577 +22,100 @@
import org.apache.sanselan.ImageWriteException;
import org.apache.sanselan.common.BinaryOutputStream;
+import org.apache.sanselan.util.Debug;
import org.apache.sanselan.util.DebugOutputStream;
public class TiffImageWriterLossless extends TiffImageWriterBase
{
+ private final byte exifBytes[];
- public TiffImageWriterLossless()
+ public TiffImageWriterLossless(byte exifBytes[])
{
+ this.exifBytes = exifBytes;
}
- public TiffImageWriterLossless(int byteOrder)
+ public TiffImageWriterLossless(int byteOrder, byte exifBytes[])
{
super(byteOrder);
+ this.exifBytes = exifBytes;
}
- public void writeDirectories(OutputStream os, TiffOutputSet outputSet)
+ public void write(OutputStream os, TiffOutputSet outputSet)
throws IOException, ImageWriteException
{
- writeDirectories(os, outputSet.getDirectories());
+ List directories = outputSet.getDirectories();
+
+ TiffOutputSummary outputSummary = validateDirectories(directories);
+
+ List outputItems = outputSet.getOutputItems(outputSummary);
+
+ updateOffsetsStep(outputItems);
+
+ outputSummary.updateOffsets(byteOrder);
+
+ BinaryOutputStream bos = new BinaryOutputStream(os, byteOrder);
+
+ writeStep(bos, outputItems);
+
}
- public void writeDirectories(OutputStream os, List directories)
+ private void updateOffsetsStep(List outputItems) throws IOException,
+ ImageWriteException
+ {
+ // int offset = TIFF_HEADER_SIZE;
+ int offset = exifBytes.length;
+
+ for (int i = 0; i < outputItems.size(); i++)
+ {
+ TiffOutputItem outputItem = (TiffOutputItem) outputItems.get(i);
+
+ outputItem.setOffset(offset);
+ int itemLength = outputItem.getItemLength();
+ offset += itemLength;
+
+ int remainder = imageDataPaddingLength(itemLength);
+ offset += remainder;
+ }
+ }
+
+ private void writeStep(BinaryOutputStream bos, List outputItems)
throws IOException, ImageWriteException
{
- TiffOutputSummary outputSummary = validateDirectories(directories);
+ writeImageFileHeader(bos);
- // Collections.sort(directories, Directory.COMPARATOR);
+ bos.write(exifBytes, TIFF_HEADER_SIZE, exifBytes.length
+ - TIFF_HEADER_SIZE);
- /**/
+ // int offset = TIFF_HEADER_SIZE;
+ int offset = exifBytes.length;
+ for (int i = 0; i < outputItems.size(); i++)
+ {
+ TiffOutputItem outputItem = (TiffOutputItem) outputItems.get(i);
+
+ outputItem.writeItem(bos);
+
+ int length = outputItem.getItemLength();
+ offset += length;
+ int remainder = imageDataPaddingLength(length);
+ offset += remainder;
+ for (int j = 0; j < remainder; j++)
+ bos.write(0);
+ }
- // ImageDataInfo imageDataInfo = imageDataInfoStep(directories, imageData,
- // stripsNotTiles);
- /**/
-
- // PointerDirectoriesInfo pointerDirectoriesInfo = pointerDirectoriesStep(directories);
- /**/
-
- // // final int imageDataOffset =
- // calculateLengthsAndOffsetsStep(directories);
- //
- // /**/
- //
- // updateDirectoryPointersStep(pointerDirectoriesInfo);
- //
- // /**/
- //
- // // updateImageDataOffsetsStep(imageDataInfo, imageDataOffset);
- // /**/
- //
- // DebugOutputStream dos = null;
- // // DebugOutputStream dos = new DebugOutputStream(os);
- // // os = dos;
- // BinaryOutputStream bos = new BinaryOutputStream(os, byteOrder);
- //
- // /**/
- //
- // writeStep(bos, directories, dos);
}
- // public byte[][] getStrips(BufferedImage src, int fSamplesPerPixel,
- // int bitsPerSample, int rowsPerStrip)
- // {
- // int width = src.getWidth();
- // int height = src.getHeight();
- //
- // int stripCount = (height + rowsPerStrip - 1) / rowsPerStrip;
- //
- // byte result[][] = null;
- // { // Write Strips
- // result = new byte[stripCount][];
- //
- // int remaining_rows = height;
- //
- // for (int i = 0; i < stripCount; i++)
- // {
- // int rowsInStrip = Math.min(rowsPerStrip, remaining_rows);
- // remaining_rows -= rowsInStrip;
- //
- // int bitsInStrip = bitsPerSample * rowsInStrip * width
- // * fSamplesPerPixel;
- // int bytesInStrip = (bitsInStrip + 7) / 8;
- //
- // byte uncompressed[] = new byte[bytesInStrip];
- //
- // int counter = 0;
- // int y = i * rowsPerStrip;
- // int stop = i * rowsPerStrip + rowsPerStrip;
- //
- // for (; (y < height) && (y < stop); y++)
- // {
- // for (int x = 0; x < width; x++)
- // {
- // int rgb = src.getRGB(x, y);
- // int red = 0xff & (rgb >> 16);
- // int green = 0xff & (rgb >> 8);
- // int blue = 0xff & (rgb >> 0);
- //
- // uncompressed[counter++] = (byte) red;
- // uncompressed[counter++] = (byte) green;
- // uncompressed[counter++] = (byte) blue;
- // }
- // }
- //
- // result[i] = uncompressed;
- // }
- //
- // }
- //
- // return result;
- // }
- //
- // public void writeImage(BufferedImage src, OutputStream os, Map params)
- // throws ImageWriteException, IOException
- // {
- // // writeImageNew(src, os, params);
- // // }
- // //
- // // public void writeImageNew(BufferedImage src, OutputStream os, Map params)
- // // throws ImageWriteException, IOException
- // // {
- //
- // // make copy of params; we'll clear keys as we consume them.
- // params = new HashMap(params);
- //
- // // clear format key.
- // if (params.containsKey(PARAM_KEY_FORMAT))
- // params.remove(PARAM_KEY_FORMAT);
- //
- // int width = src.getWidth();
- // int height = src.getHeight();
- //
- // // BinaryOutputStream bos = new BinaryOutputStream(os, WRITE_BYTE_ORDER);
- // //
- // // writeImageFileHeader(bos, WRITE_BYTE_ORDER);
- //
- // // ArrayList directoryFields = new ArrayList();
- //
- // final int photometricInterpretation = 2; // TODO:
- //
- // int compression = TIFF_COMPRESSION_LZW; // LZW is default
- // if (params.containsKey(PARAM_KEY_COMPRESSION))
- // {
- // Object value = params.get(PARAM_KEY_COMPRESSION);
- // if (value != null)
- // {
- // if (!(value instanceof Number))
- // throw new ImageWriteException(
- // "Invalid compression parameter: " + value);
- // compression = ((Number) value).intValue();
- // }
- // params.remove(PARAM_KEY_COMPRESSION);
- // }
- //
- // final int samplesPerPixel = 3; // TODO:
- // final int bitsPerSample = 8; // TODO:
- //
- // // int fRowsPerStrip; // TODO:
- // int rowsPerStrip = 8000 / (width * samplesPerPixel); // TODO:
- // rowsPerStrip = Math.max(1, rowsPerStrip); // must have at least one.
- //
- // byte strips[][] = getStrips(src, samplesPerPixel, bitsPerSample,
- // rowsPerStrip);
- //
- // // int stripCount = (height + fRowsPerStrip - 1) / fRowsPerStrip;
- // // int stripCount = strips.length;
- //
- // if (params.size() > 0)
- // {
- // Object firstKey = params.keySet().iterator().next();
- // throw new ImageWriteException("Unknown parameter: " + firstKey);
- // }
- //
- // // System.out.println("width: " + width);
- // // System.out.println("height: " + height);
- // // System.out.println("fRowsPerStrip: " + fRowsPerStrip);
- // // System.out.println("fSamplesPerPixel: " + fSamplesPerPixel);
- // // System.out.println("stripCount: " + stripCount);
- //
- // if (compression == TIFF_COMPRESSION_PACKBITS)
- // {
- // for (int i = 0; i < strips.length; i++)
- // strips[i] = new PackBits().compress(strips[i]);
- // }
- // else if (compression == TIFF_COMPRESSION_LZW)
- // {
- // for (int i = 0; i < strips.length; i++)
- // {
- // byte uncompressed[] = strips[i];
- //
- // int LZWMinimumCodeSize = 8;
- //
- // MyLZWCompressor compressor = new MyLZWCompressor(
- // LZWMinimumCodeSize, BYTE_ORDER_MSB, true);
- // byte compressed[] = compressor.compress(uncompressed);
- //
- // strips[i] = compressed;
- // }
- // }
- // else if (compression == TIFF_COMPRESSION_UNCOMPRESSED)
- // {
- // // do nothing.
- // }
- // else
- // throw new ImageWriteException(
- // "Invalid compression parameter (Only LZW, Packbits and uncompressed supported).");
- //
- // // int stripOffsets[] = new int[stripCount];
- // // int stripByteCounts[] = new int[stripCount];
- // //
- // // for (int i = 0; i < strips.length; i++)
- // // stripByteCounts[i] = strips[i].length;
- //
- // TiffOutputDirectory directory = new TiffOutputDirectory(
- // TiffDirectory.DIRECTORY_TYPE_ROOT);
- //
- // // WriteField stripOffsetsField;
- //
- // {
- // {
- // TiffOutputField field = new TiffOutputField(
- // TIFF_TAG_IMAGE_WIDTH, FIELD_TYPE_LONG, 1,
- // FIELD_TYPE_LONG.writeData(new int[]{
- // width,
- // }, byteOrder));
- // directory.add(field);
- // }
- // {
- // TiffOutputField field = new TiffOutputField(
- // TIFF_TAG_IMAGE_LENGTH, FIELD_TYPE_LONG, 1,
- // FIELD_TYPE_LONG.writeData(new int[]{
- // height,
- // }, byteOrder));
- // directory.add(field);
- // }
- // {
- // TiffOutputField field = new TiffOutputField(
- // TIFF_TAG_PHOTOMETRIC_INTERPRETATION, FIELD_TYPE_SHORT,
- // 1, FIELD_TYPE_SHORT.writeData(new int[]{
- // photometricInterpretation,
- // }, byteOrder));
- // directory.add(field);
- // }
- // {
- // TiffOutputField field = new TiffOutputField(
- // TIFF_TAG_COMPRESSION, FIELD_TYPE_SHORT, 1,
- // FIELD_TYPE_SHORT.writeData(new int[]{
- // compression,
- // }, byteOrder));
- // directory.add(field);
- // }
- // {
- // TiffOutputField field = new TiffOutputField(
- // TIFF_TAG_SAMPLES_PER_PIXEL, FIELD_TYPE_SHORT, 1,
- // FIELD_TYPE_SHORT.writeData(new int[]{
- // samplesPerPixel,
- // }, byteOrder));
- // directory.add(field);
- // }
- // {
- // TiffOutputField field = new TiffOutputField(
- // TIFF_TAG_BITS_PER_SAMPLE, FIELD_TYPE_SHORT, 3,
- // FIELD_TYPE_SHORT.writeData(new int[]{
- // bitsPerSample, bitsPerSample, bitsPerSample,
- // }, byteOrder));
- // directory.add(field);
- // }
- // // {
- // // stripOffsetsField = new WriteField(TIFF_TAG_STRIP_OFFSETS,
- // // FIELD_TYPE_LONG, stripOffsets.length, FIELD_TYPE_LONG
- // // .writeData(stripOffsets, byteOrder));
- // // directory.add(stripOffsetsField);
- // // }
- // // {
- // // WriteField field = new WriteField(TIFF_TAG_STRIP_BYTE_COUNTS,
- // // FIELD_TYPE_LONG, stripByteCounts.length,
- // // FIELD_TYPE_LONG.writeData(stripByteCounts,
- // // WRITE_BYTE_ORDER));
- // // directory.add(field);
- // // }
- // {
- // TiffOutputField field = new TiffOutputField(
- // TIFF_TAG_ROWS_PER_STRIP, FIELD_TYPE_LONG, 1,
- // FIELD_TYPE_LONG.writeData(new int[]{
- // rowsPerStrip,
- // }, byteOrder));
- // directory.add(field);
- // }
- //
- // {
- // int resolutionUnit = 2;// inches.
- // TiffOutputField field = new TiffOutputField(
- // TIFF_TAG_RESOLUTION_UNIT, FIELD_TYPE_SHORT, 1,
- // FIELD_TYPE_SHORT.writeData(new int[]{
- // resolutionUnit,
- // }, byteOrder));
- // directory.add(field);
- // }
- //
- // {
- // int xResolution = 72;
- // TiffOutputField field = new TiffOutputField(
- // TIFF_TAG_XRESOLUTION, FIELD_TYPE_RATIONAL, 1,
- // FIELD_TYPE_RATIONAL
- // .writeData(xResolution, 1, byteOrder));
- // directory.add(field);
- // }
- //
- // {
- // int yResolution = 72;
- // TiffOutputField field = new TiffOutputField(
- // TIFF_TAG_YRESOLUTION, FIELD_TYPE_RATIONAL, 1,
- // FIELD_TYPE_RATIONAL
- // .writeData(yResolution, 1, byteOrder));
- // directory.add(field);
- // }
- //
- // }
- //
- // RawTiffImageData rawTiffImageData = new RawTiffImageData.Strips(strips);
- // directory.setRawTiffImageData(rawTiffImageData);
- //
- // ArrayList directories = new ArrayList();
- // directories.add(directory);
- //
- // writeDirectories(os, directories);
- // }
- //
- // private void writeImageFileHeader(BinaryOutputStream bos)
- // throws IOException, ImageWriteException
- // {
- // bos.write(byteOrder);
- // bos.write(byteOrder);
- //
- // bos.write2Bytes(42); // tiffVersion
- //
- // int foffsetToFirstIFD = TIFF_HEADER_SIZE;
- //
- // bos.write4Bytes(foffsetToFirstIFD);
- // }
- //
- // static int imageDataPaddingLength(int dataLength)
- // {
- // return (4 - (dataLength % 4)) % 4;
- // }
- //
- // private TiffOutputDirectory findDirectoryByType(List directories,
- // int type)
- // {
- // for (int i = 0; i < directories.size(); i++)
- // {
- // TiffOutputDirectory directory = (TiffOutputDirectory) directories
- // .get(i);
- // if (directory.type == type)
- // return directory;
- // }
- // return null;
- // }
- //
- // public void writeDirectories(OutputStream os, List directories)
- // throws IOException, ImageWriteException
- // {
- // // Collections.sort(directories, Directory.COMPARATOR);
- //
- // /**/
- //
- // // ImageDataInfo imageDataInfo = imageDataInfoStep(directories, imageData,
- // // stripsNotTiles);
- // /**/
- //
- // PointerDirectoriesInfo pointerDirectoriesInfo = pointerDirectoriesStep(directories);
- //
- // /**/
- //
- // // final int imageDataOffset =
- // calculateLengthsAndOffsetsStep(directories);
- //
- // /**/
- //
- // updateDirectoryPointersStep(pointerDirectoriesInfo);
- //
- // /**/
- //
- // // updateImageDataOffsetsStep(imageDataInfo, imageDataOffset);
- // /**/
- //
- // DebugOutputStream dos = null;
- // // DebugOutputStream dos = new DebugOutputStream(os);
- // // os = dos;
- // BinaryOutputStream bos = new BinaryOutputStream(os, byteOrder);
- //
- // /**/
- //
- // writeStep(bos, directories, dos);
- //
- // /**/
- //
- // // writeImageDataStep(bos, directories, imageDataInfo);
- // /**/
- // }
- //
- // private PointerDirectoriesInfo pointerDirectoriesStep(List directories)
- // throws ImageWriteException
- // {
- // TiffOutputDirectory firstDirectory = (TiffOutputDirectory) directories
- // .get(0);
- //
- // TiffOutputField exifDirectoryOffsetField = null;
- // TiffOutputDirectory exifDirectory = findDirectoryByType(directories,
- // TiffDirectory.DIRECTORY_TYPE_EXIF);
- // if (null != exifDirectory)
- // {
- // exifDirectoryOffsetField = firstDirectory
- // .findField(EXIF_TAG_GPSINFO);
- //
- // if (null == exifDirectoryOffsetField)
- // {
- // exifDirectoryOffsetField = new TiffOutputField(
- // EXIF_TAG_GPSINFO, FIELD_TYPE_LONG, 1,
- // FIELD_TYPE_LONG.writeData(new int[]{
- // 0,
- // }, byteOrder));
- // firstDirectory.add(exifDirectoryOffsetField);
- // }
- // }
- //
- // TiffOutputField gpsDirectoryOffsetField = null;
- // TiffOutputDirectory gpsDirectory = findDirectoryByType(directories,
- // TiffDirectory.DIRECTORY_TYPE_GPS);
- // if (null != gpsDirectory)
- // {
- // gpsDirectoryOffsetField = firstDirectory
- // .findField(EXIF_TAG_GPSINFO);
- // if (null == gpsDirectoryOffsetField)
- // {
- // gpsDirectoryOffsetField = new TiffOutputField(
- // EXIF_TAG_GPSINFO, FIELD_TYPE_LONG, 1,
- // FIELD_TYPE_LONG.writeData(new int[]{
- // 0,
- // }, byteOrder));
- // firstDirectory.add(gpsDirectoryOffsetField);
- // }
- // }
- //
- // TiffOutputField iteroperabilityDirectoryOffsetField = null;
- // TiffOutputDirectory iteroperabilityDirectory = findDirectoryByType(
- // directories, TiffDirectory.DIRECTORY_TYPE_INTEROPERABILITY);
- // if (null != iteroperabilityDirectory)
- // {
- // if (null == exifDirectory)
- // throw new ImageWriteException(
- // "Can't write iteroperability directory without EXIF directory.");
- //
- // iteroperabilityDirectoryOffsetField = exifDirectory
- // .findField(EXIF_TAG_INTEROP_OFFSET);
- // if (null == iteroperabilityDirectoryOffsetField)
- // {
- // iteroperabilityDirectoryOffsetField = new TiffOutputField(
- // EXIF_TAG_INTEROP_OFFSET, FIELD_TYPE_LONG,
- // 1, FIELD_TYPE_LONG.writeData(new int[]{
- // 0,
- // }, byteOrder));
- // exifDirectory.add(iteroperabilityDirectoryOffsetField);
- // }
- // }
- //
- // return new PointerDirectoriesInfo(exifDirectoryOffsetField,
- // exifDirectory, gpsDirectoryOffsetField, gpsDirectory,
- // iteroperabilityDirectoryOffsetField, iteroperabilityDirectory);
- //
- // }
- //
- // private void calculateLengthsAndOffsetsStep(List directories)
- // throws IOException, ImageWriteException
- // // private int calculateLengthsAndOffsetsStep(ArrayList directories)
- // {
- // // Calculate lengths and offsets
- // int offset = TIFF_HEADER_SIZE;
- //
- // TiffOutputDirectory previousDirectory = null;
- // for (int i = 0; i < directories.size(); i++)
- // {
- // TiffOutputDirectory directory = (TiffOutputDirectory) directories
- // .get(i);
- //
- // // fields must be written in ascending order.
- // directory.sortFields();
- //
- // directory.offset = offset;
- //
- // if (directory.type == TiffDirectory.DIRECTORY_TYPE_EXIF
- // || directory.type == TiffDirectory.DIRECTORY_TYPE_GPS
- // || directory.type == TiffDirectory.DIRECTORY_TYPE_INTEROPERABILITY)
- // {
- // // "pointer" directories don't partcipate in normal TIFF directory chain.
- // directory.calculateLengths(byteOrder);
- // offset += directory.totalLength;
- // }
- // else
- // {
- // if (null != previousDirectory)
- // previousDirectory.nextDirectoryOffset = offset;
- //
- // directory.calculateLengths(byteOrder);
- // offset += directory.totalLength;
- //
- // previousDirectory = directory;
- // }
- // }
- // // return offset;
- // }
- //
- // private void updateDirectoryPointersStep(
- // PointerDirectoriesInfo pointerDirectoriesInfo)
- // {
- // if (null != pointerDirectoriesInfo.exifDirectory)
- // {
- // byte value[] = FIELD_TYPE_LONG.writeData(new int[]{
- // pointerDirectoriesInfo.exifDirectory.offset,
- // }, byteOrder);
- // pointerDirectoriesInfo.exifDirectoryOffsetField.setData(value);
- // }
- //
- // if (null != pointerDirectoriesInfo.gpsDirectory)
- // {
- // byte value[] = FIELD_TYPE_LONG.writeData(new int[]{
- // pointerDirectoriesInfo.gpsDirectory.offset,
- // }, byteOrder);
- // pointerDirectoriesInfo.gpsDirectoryOffsetField.setData(value);
- // }
- //
- // if (null != pointerDirectoriesInfo.iteroperabilityDirectory)
- // {
- // byte value[] = FIELD_TYPE_LONG.writeData(new int[]{
- // pointerDirectoriesInfo.iteroperabilityDirectory.offset,
- // }, byteOrder);
- // pointerDirectoriesInfo.iteroperabilityDirectoryOffsetField
- // .setData(value);
- // }
- // }
- //
- // private void writeStep(BinaryOutputStream bos, List directories,
- // DebugOutputStream dos) throws IOException, ImageWriteException
- // {
- // writeImageFileHeader(bos);
- //
- // long count, lastCount = 0;
- //
- // if (null != dos)
- // {
- // count = dos.count();
- // Debug.debug("image header" + " start: " + lastCount + ", end: "
- // + dos.count() + ", length: " + (count - lastCount));
- // lastCount = count;
- // }
- //
- // for (int i = 0; i < directories.size(); i++)
- // {
- // TiffOutputDirectory directory = (TiffOutputDirectory) directories
- // .get(i);
- // directory.write(bos);
- //
- // if (null != dos)
- // {
- // count = dos.count();
- // Debug.debug("directory("
- // + TiffDirectory.description(directory.type) + ")"
- // + " start: " + lastCount + ", end: " + dos.count()
- // + ", length: " + (count - lastCount)
- // + ", expected length: " + directory.totalLength);
- // lastCount = count;
- // }
- // }
- // }
+ private void writeImageFileHeader(BinaryOutputStream bos)
+ throws IOException, ImageWriteException
+ {
+ bos.write(byteOrder);
+ bos.write(byteOrder);
+
+ bos.write2Bytes(42); // tiffVersion
+
+ // int foffsetToFirstIFD = TIFF_HEADER_SIZE;
+ int offsetToFirstIFD = exifBytes.length;
+
+ bos.write4Bytes(offsetToFirstIFD);
+ }
}
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossy.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossy.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossy.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossy.java Mon Jan 7 00:12:01 2008
@@ -16,21 +16,12 @@
*/
package org.apache.sanselan.formats.tiff.write;
-import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import org.apache.sanselan.ImageWriteException;
import org.apache.sanselan.common.BinaryOutputStream;
-import org.apache.sanselan.common.PackBits;
-import org.apache.sanselan.common.mylzw.MyLZWCompressor;
-import org.apache.sanselan.formats.tiff.RawTiffImageData;
-import org.apache.sanselan.formats.tiff.TiffDirectory;
import org.apache.sanselan.util.Debug;
import org.apache.sanselan.util.DebugOutputStream;
@@ -46,272 +37,64 @@
super(byteOrder);
}
- public byte[][] getStrips(BufferedImage src, int fSamplesPerPixel,
- int bitsPerSample, int rowsPerStrip)
+ public void write(OutputStream os, TiffOutputSet outputSet)
+ throws IOException, ImageWriteException
{
- int width = src.getWidth();
- int height = src.getHeight();
-
- int stripCount = (height + rowsPerStrip - 1) / rowsPerStrip;
-
- byte result[][] = null;
- { // Write Strips
- result = new byte[stripCount][];
-
- int remaining_rows = height;
-
- for (int i = 0; i < stripCount; i++)
- {
- int rowsInStrip = Math.min(rowsPerStrip, remaining_rows);
- remaining_rows -= rowsInStrip;
-
- int bitsInStrip = bitsPerSample * rowsInStrip * width
- * fSamplesPerPixel;
- int bytesInStrip = (bitsInStrip + 7) / 8;
-
- byte uncompressed[] = new byte[bytesInStrip];
-
- int counter = 0;
- int y = i * rowsPerStrip;
- int stop = i * rowsPerStrip + rowsPerStrip;
-
- for (; (y < height) && (y < stop); y++)
- {
- for (int x = 0; x < width; x++)
- {
- int rgb = src.getRGB(x, y);
- int red = 0xff & (rgb >> 16);
- int green = 0xff & (rgb >> 8);
- int blue = 0xff & (rgb >> 0);
-
- uncompressed[counter++] = (byte) red;
- uncompressed[counter++] = (byte) green;
- uncompressed[counter++] = (byte) blue;
- }
- }
-
- result[i] = uncompressed;
- }
-
- }
+ List directories = outputSet.getDirectories();
- return result;
- }
+ TiffOutputSummary outputSummary = validateDirectories(directories);
- public void writeImage(BufferedImage src, OutputStream os, Map params)
- throws ImageWriteException, IOException
- {
- // writeImageNew(src, os, params);
- // }
- //
- // public void writeImageNew(BufferedImage src, OutputStream os, Map params)
- // throws ImageWriteException, IOException
- // {
+ List outputItems = outputSet.getOutputItems(outputSummary);
- // make copy of params; we'll clear keys as we consume them.
- params = new HashMap(params);
+ updateOffsetsStep(outputItems);
- // clear format key.
- if (params.containsKey(PARAM_KEY_FORMAT))
- params.remove(PARAM_KEY_FORMAT);
+ outputSummary.updateOffsets(byteOrder);
- int width = src.getWidth();
- int height = src.getHeight();
+ BinaryOutputStream bos = new BinaryOutputStream(os, byteOrder);
- // BinaryOutputStream bos = new BinaryOutputStream(os, WRITE_BYTE_ORDER);
- //
- // writeImageFileHeader(bos, WRITE_BYTE_ORDER);
+ writeStep(bos, outputItems);
- // ArrayList directoryFields = new ArrayList();
+ }
- final int photometricInterpretation = 2; // TODO:
+ private void updateOffsetsStep(List outputItems) throws IOException,
+ ImageWriteException
+ {
+ int offset = TIFF_HEADER_SIZE;
- int compression = TIFF_COMPRESSION_LZW; // LZW is default
- if (params.containsKey(PARAM_KEY_COMPRESSION))
+ for (int i = 0; i < outputItems.size(); i++)
{
- Object value = params.get(PARAM_KEY_COMPRESSION);
- if (value != null)
- {
- if (!(value instanceof Number))
- throw new ImageWriteException(
- "Invalid compression parameter: " + value);
- compression = ((Number) value).intValue();
- }
- params.remove(PARAM_KEY_COMPRESSION);
- }
-
- final int samplesPerPixel = 3; // TODO:
- final int bitsPerSample = 8; // TODO:
-
- // int fRowsPerStrip; // TODO:
- int rowsPerStrip = 8000 / (width * samplesPerPixel); // TODO:
- rowsPerStrip = Math.max(1, rowsPerStrip); // must have at least one.
+ TiffOutputItem outputItem = (TiffOutputItem) outputItems.get(i);
- byte strips[][] = getStrips(src, samplesPerPixel, bitsPerSample,
- rowsPerStrip);
+ outputItem.setOffset(offset);
+ int itemLength = outputItem.getItemLength();
+ offset += itemLength;
- // int stripCount = (height + fRowsPerStrip - 1) / fRowsPerStrip;
- // int stripCount = strips.length;
-
- if (params.size() > 0)
- {
- Object firstKey = params.keySet().iterator().next();
- throw new ImageWriteException("Unknown parameter: " + firstKey);
+ int remainder = imageDataPaddingLength(itemLength);
+ offset += remainder;
}
+ }
- // System.out.println("width: " + width);
- // System.out.println("height: " + height);
- // System.out.println("fRowsPerStrip: " + fRowsPerStrip);
- // System.out.println("fSamplesPerPixel: " + fSamplesPerPixel);
- // System.out.println("stripCount: " + stripCount);
+ private void writeStep(BinaryOutputStream bos, List outputItems)
+ throws IOException, ImageWriteException
+ {
- if (compression == TIFF_COMPRESSION_PACKBITS)
- {
- for (int i = 0; i < strips.length; i++)
- strips[i] = new PackBits().compress(strips[i]);
- }
- else if (compression == TIFF_COMPRESSION_LZW)
- {
- for (int i = 0; i < strips.length; i++)
- {
- byte uncompressed[] = strips[i];
-
- int LZWMinimumCodeSize = 8;
-
- MyLZWCompressor compressor = new MyLZWCompressor(
- LZWMinimumCodeSize, BYTE_ORDER_MSB, true);
- byte compressed[] = compressor.compress(uncompressed);
+ writeImageFileHeader(bos);
- strips[i] = compressed;
- }
- }
- else if (compression == TIFF_COMPRESSION_UNCOMPRESSED)
+ int offset = TIFF_HEADER_SIZE;
+ for (int i = 0; i < outputItems.size(); i++)
{
- // do nothing.
- }
- else
- throw new ImageWriteException(
- "Invalid compression parameter (Only LZW, Packbits and uncompressed supported).");
-
- // int stripOffsets[] = new int[stripCount];
- // int stripByteCounts[] = new int[stripCount];
- //
- // for (int i = 0; i < strips.length; i++)
- // stripByteCounts[i] = strips[i].length;
-
- TiffOutputDirectory directory = new TiffOutputDirectory(
- TiffDirectory.DIRECTORY_TYPE_ROOT);
+ TiffOutputItem outputItem = (TiffOutputItem) outputItems.get(i);
- // WriteField stripOffsetsField;
-
- {
- {
- TiffOutputField field = new TiffOutputField(
- TIFF_TAG_IMAGE_WIDTH, FIELD_TYPE_LONG, 1,
- FIELD_TYPE_LONG.writeData(new int[]{
- width,
- }, byteOrder));
- directory.add(field);
- }
- {
- TiffOutputField field = new TiffOutputField(
- TIFF_TAG_IMAGE_LENGTH, FIELD_TYPE_LONG, 1,
- FIELD_TYPE_LONG.writeData(new int[]{
- height,
- }, byteOrder));
- directory.add(field);
- }
- {
- TiffOutputField field = new TiffOutputField(
- TIFF_TAG_PHOTOMETRIC_INTERPRETATION, FIELD_TYPE_SHORT,
- 1, FIELD_TYPE_SHORT.writeData(new int[]{
- photometricInterpretation,
- }, byteOrder));
- directory.add(field);
- }
- {
- TiffOutputField field = new TiffOutputField(
- TIFF_TAG_COMPRESSION, FIELD_TYPE_SHORT, 1,
- FIELD_TYPE_SHORT.writeData(new int[]{
- compression,
- }, byteOrder));
- directory.add(field);
- }
- {
- TiffOutputField field = new TiffOutputField(
- TIFF_TAG_SAMPLES_PER_PIXEL, FIELD_TYPE_SHORT, 1,
- FIELD_TYPE_SHORT.writeData(new int[]{
- samplesPerPixel,
- }, byteOrder));
- directory.add(field);
- }
- {
- TiffOutputField field = new TiffOutputField(
- TIFF_TAG_BITS_PER_SAMPLE, FIELD_TYPE_SHORT, 3,
- FIELD_TYPE_SHORT.writeData(new int[]{
- bitsPerSample, bitsPerSample, bitsPerSample,
- }, byteOrder));
- directory.add(field);
- }
- // {
- // stripOffsetsField = new WriteField(TIFF_TAG_STRIP_OFFSETS,
- // FIELD_TYPE_LONG, stripOffsets.length, FIELD_TYPE_LONG
- // .writeData(stripOffsets, byteOrder));
- // directory.add(stripOffsetsField);
- // }
- // {
- // WriteField field = new WriteField(TIFF_TAG_STRIP_BYTE_COUNTS,
- // FIELD_TYPE_LONG, stripByteCounts.length,
- // FIELD_TYPE_LONG.writeData(stripByteCounts,
- // WRITE_BYTE_ORDER));
- // directory.add(field);
- // }
- {
- TiffOutputField field = new TiffOutputField(
- TIFF_TAG_ROWS_PER_STRIP, FIELD_TYPE_LONG, 1,
- FIELD_TYPE_LONG.writeData(new int[]{
- rowsPerStrip,
- }, byteOrder));
- directory.add(field);
- }
-
- {
- int resolutionUnit = 2;// inches.
- TiffOutputField field = new TiffOutputField(
- TIFF_TAG_RESOLUTION_UNIT, FIELD_TYPE_SHORT, 1,
- FIELD_TYPE_SHORT.writeData(new int[]{
- resolutionUnit,
- }, byteOrder));
- directory.add(field);
- }
-
- {
- int xResolution = 72;
- TiffOutputField field = new TiffOutputField(
- TIFF_TAG_XRESOLUTION, FIELD_TYPE_RATIONAL, 1,
- FIELD_TYPE_RATIONAL
- .writeData(xResolution, 1, byteOrder));
- directory.add(field);
- }
-
- {
- int yResolution = 72;
- TiffOutputField field = new TiffOutputField(
- TIFF_TAG_YRESOLUTION, FIELD_TYPE_RATIONAL, 1,
- FIELD_TYPE_RATIONAL
- .writeData(yResolution, 1, byteOrder));
- directory.add(field);
- }
+ outputItem.writeItem(bos);
+ int length = outputItem.getItemLength();
+ offset += length;
+ int remainder = imageDataPaddingLength(length);
+ offset += remainder;
+ for (int j = 0; j < remainder; j++)
+ bos.write(0);
}
- RawTiffImageData rawTiffImageData = new RawTiffImageData.Strips(strips);
- directory.setRawTiffImageData(rawTiffImageData);
-
- ArrayList directories = new ArrayList();
- directories.add(directory);
-
- writeDirectories(os, directories);
}
private void writeImageFileHeader(BinaryOutputStream bos)
@@ -322,139 +105,9 @@
bos.write2Bytes(42); // tiffVersion
- int foffsetToFirstIFD = TIFF_HEADER_SIZE;
-
- bos.write4Bytes(foffsetToFirstIFD);
- }
+ int offsetToFirstIFD = TIFF_HEADER_SIZE;
- private TiffOutputDirectory findDirectoryByType(List directories, int type)
- {
- for (int i = 0; i < directories.size(); i++)
- {
- TiffOutputDirectory directory = (TiffOutputDirectory) directories
- .get(i);
- if (directory.type == type)
- return directory;
- }
- return null;
- }
-
- public void writeDirectories(OutputStream os, TiffOutputSet outputSet)
- throws IOException, ImageWriteException
- {
- writeDirectories(os, outputSet.getDirectories());
- }
-
- public void writeDirectories(OutputStream os, List directories)
- throws IOException, ImageWriteException
- {
-
- TiffOutputSummary outputSummary = validateDirectories(directories);
-
- // Collections.sort(directories, Directory.COMPARATOR);
-
- /**/
-
- // ImageDataInfo imageDataInfo = imageDataInfoStep(directories, imageData,
- // stripsNotTiles);
- /**/
-
- // PointerDirectoriesInfo pointerDirectoriesInfo = pointerDirectoriesStep(directories);
- /**/
-
- // final int imageDataOffset =
- calculateLengthsAndOffsetsStep(directories);
-
- /**/
-
- outputSummary.updateOffsets(byteOrder);
-
- /**/
-
- // updateImageDataOffsetsStep(imageDataInfo, imageDataOffset);
- /**/
-
- DebugOutputStream dos = null;
- // DebugOutputStream dos = new DebugOutputStream(os);
- // os = dos;
- BinaryOutputStream bos = new BinaryOutputStream(os, byteOrder);
-
- /**/
-
- writeStep(bos, directories, dos);
-
- /**/
-
- // writeImageDataStep(bos, directories, imageDataInfo);
- /**/
- }
-
- private void calculateLengthsAndOffsetsStep(List directories)
- throws IOException, ImageWriteException
- // private int calculateLengthsAndOffsetsStep(ArrayList directories)
- {
- // Calculate lengths and offsets
- int offset = TIFF_HEADER_SIZE;
-
- for (int i = 0; i < directories.size(); i++)
- {
- TiffOutputDirectory directory = (TiffOutputDirectory) directories
- .get(i);
-
- // fields must be written in ascending order.
- directory.sortFields();
-
- directory.setOffset(offset);
-
- if (directory.type == TiffDirectory.DIRECTORY_TYPE_EXIF
- || directory.type == TiffDirectory.DIRECTORY_TYPE_GPS
- || directory.type == TiffDirectory.DIRECTORY_TYPE_INTEROPERABILITY)
- {
- // "pointer" directories don't partcipate in normal TIFF directory chain.
- directory.calculateLengths(byteOrder);
- offset += directory.totalLength;
- }
- else
- {
- directory.calculateLengths(byteOrder);
- offset += directory.totalLength;
- }
- }
- // return offset;
- }
-
- private void writeStep(BinaryOutputStream bos, List directories,
- DebugOutputStream dos) throws IOException, ImageWriteException
- {
- writeImageFileHeader(bos);
-
- long count, lastCount = 0;
-
- if (null != dos)
- {
- count = dos.count();
- Debug.debug("image header" + " start: " + lastCount + ", end: "
- + dos.count() + ", length: " + (count - lastCount));
- lastCount = count;
- }
-
- for (int i = 0; i < directories.size(); i++)
- {
- TiffOutputDirectory directory = (TiffOutputDirectory) directories
- .get(i);
- directory.write(bos);
-
- if (null != dos)
- {
- count = dos.count();
- Debug.debug("directory("
- + TiffDirectory.description(directory.type) + ")"
- + " start: " + lastCount + ", end: " + dos.count()
- + ", length: " + (count - lastCount)
- + ", expected length: " + directory.totalLength);
- lastCount = count;
- }
- }
+ bos.write4Bytes(offsetToFirstIFD);
}
}
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputDirectory.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputDirectory.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputDirectory.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputDirectory.java Mon Jan 7 00:12:01 2008
@@ -36,12 +36,7 @@
implements
TiffConstants
{
- public static final int UNDEFINED_VALUE = -1;
-
public final int type;
- public int internalLength = UNDEFINED_VALUE;
- public int totalLength = UNDEFINED_VALUE;
- // public int offset = UNDEFINED_VALUE;
private final ArrayList fields = new ArrayList();
private TiffOutputDirectory nextDirectory = null;
@@ -90,48 +85,6 @@
}
};
Collections.sort(fields, comparator);
- // Debug.debug("first field", ((WriteField) fields.get(0)).tagInfo);
- // Debug.debug("last field", ((WriteField) fields.get(fields.size()-1)).tagInfo);
- // for(int i=0;i<fields.size();i++)
- // {
- // WriteField field = (WriteField) fields.get(i);
- // Debug.debug(" field", field.tagInfo);
- // }
- }
-
- public void calculateLengths(int byteOrder) throws IOException,
- ImageWriteException
- {
- tiffImageDataInfoStep(byteOrder);
- jpegImageDataInfoStep(byteOrder);
-
- internalLength = TIFF_ENTRY_LENGTH * fields.size()
- + TIFF_DIRECTORY_HEADER_LENGTH + TIFF_DIRECTORY_FOOTER_LENGTH;
-
- totalLength = internalLength;
-
- for (int i = 0; i < fields.size(); i++)
- {
- TiffOutputField field = (TiffOutputField) fields.get(i);
- totalLength += field.getSeperateValueLength();
- }
-
- if (null != imageDataInfo)
- {
- int imageDataOffset = getOffset() + totalLength;
- totalLength += imageDataInfo.totalLength;
- updateTiffImageDataOffsetsStep(imageDataOffset, byteOrder);
- }
-
- if (null != rawJpegImageData)
- {
- int imageDataOffset = getOffset() + totalLength;
- totalLength += rawJpegImageData.length;
- totalLength += TiffImageWriterBase
- .imageDataPaddingLength(rawJpegImageData.length);
- updateJpegImageDataOffsetsStep(imageDataOffset, byteOrder);
- }
-
}
public String description()
@@ -149,83 +102,11 @@
for (int i = 0; i < fields.size(); i++)
{
TiffOutputField field = (TiffOutputField) fields.get(i);
- field.writeSimple(bos);
-
-// Debug.debug("\t" + "writing field (" + field.tag + ", 0x" + Integer.toHexString(field.tag) + ")", field.tagInfo);
-// if(field.tagInfo.isOffset())
-// Debug.debug("\t\tOFFSET!", field.bytes);
- }
-
- int nextDirectoryOffset = 0;
- if (nextDirectory != null)
- nextDirectoryOffset = nextDirectory.getOffset();
-
- // Write nextDirectoryOffset
- if (nextDirectoryOffset == UNDEFINED_VALUE)
- bos.write4Bytes(0);
- else
- bos.write4Bytes(nextDirectoryOffset);
-
- // // Write Seperate Values
- // for (int i = 0; i < fields.size(); i++)
- // {
- // TiffOutputField field = (TiffOutputField) fields.get(i);
- // field.writeSeperateValue(bos);
- // }
-
- // if (null != rawTiffImageData)
- // {
- // byte imageData[][] = rawTiffImageData.getRawImageData();
- // for (int i = 0; i < imageData.length; i++)
- // {
- // bos.writeByteArray(imageData[i]);
- // int imageDataByteCount = imageData[i].length;
- //
- // int remainder = TiffImageWriterBase
- // .imageDataPaddingLength(imageDataByteCount);
- // for (int j = 0; j < remainder; j++)
- // bos.write(0);
- // }
- // }
- //
- // if (null != rawJpegImageData)
- // {
- // // byte imageData[][] = rawJpegImageData.getRawImageData();
- // bos.writeByteArray(rawJpegImageData);
- // int remainder = TiffImageWriterBase
- // .imageDataPaddingLength(rawJpegImageData.length);
- // for (int j = 0; j < remainder; j++)
- // bos.write(0);
- // }
-
- }
-
- public void write(BinaryOutputStream bos) throws IOException,
- ImageWriteException
- {
-
- // Debug.debug("dir write");
- // Debug.debug("dir write offset", offset);
- // Debug.debug("dir write internalLength", internalLength);
- // Debug.debug("dir write totalLength", totalLength);
- // Debug.debug("dir write fields", fields.size());
- // Debug.debug("dir write nextDirectoryOffset", nextDirectoryOffset);
+ field.writeField(bos);
- int nextSeperateValueOffset = getOffset() + internalLength;
-
- // Debug.debug("writing directory", description());
- // Debug.debug("writing fields.size()", fields.size());
-
- // Write Directory Field Count
- bos.write2Bytes(fields.size()); // DirectoryFieldCount
-
- // Write Fields
- for (int i = 0; i < fields.size(); i++)
- {
- TiffOutputField field = (TiffOutputField) fields.get(i);
- // checkOffset("ifd [" + i + "]", fOffsetToSeperateValues);
- nextSeperateValueOffset += field.writeDirectoryEntry(bos,
- nextSeperateValueOffset);
+ // Debug.debug("\t" + "writing field (" + field.tag + ", 0x" + Integer.toHexString(field.tag) + ")", field.tagInfo);
+ // if(field.tagInfo.isOffset())
+ // Debug.debug("\t\tOFFSET!", field.bytes);
}
int nextDirectoryOffset = 0;
@@ -237,110 +118,8 @@
bos.write4Bytes(0);
else
bos.write4Bytes(nextDirectoryOffset);
-
- // Write Seperate Values
- for (int i = 0; i < fields.size(); i++)
- {
- TiffOutputField field = (TiffOutputField) fields.get(i);
- field.writeSeperateValue(bos);
- }
-
- if (null != rawTiffImageData)
- {
- byte imageData[][] = rawTiffImageData.getRawImageData();
- for (int i = 0; i < imageData.length; i++)
- {
- bos.writeByteArray(imageData[i]);
- int imageDataByteCount = imageData[i].length;
-
- int remainder = TiffImageWriterBase
- .imageDataPaddingLength(imageDataByteCount);
- for (int j = 0; j < remainder; j++)
- bos.write(0);
- }
- }
-
- if (null != rawJpegImageData)
- {
- // byte imageData[][] = rawJpegImageData.getRawImageData();
- bos.writeByteArray(rawJpegImageData);
- int remainder = TiffImageWriterBase
- .imageDataPaddingLength(rawJpegImageData.length);
- for (int j = 0; j < remainder; j++)
- bos.write(0);
- }
-
}
- private ImageDataInfo imageDataInfo = null;
-
- private void tiffImageDataInfoStep(int byteOrder)
- {
- if (null == rawTiffImageData)
- return;
-
- byte imageData[][] = rawTiffImageData.getRawImageData();
- boolean stripsNotTiles = rawTiffImageData.stripsNotTiles();
-
- int imageDataOffsets[] = null;
- int imageDataByteCounts[] = null;
- TiffOutputField imageDataOffsetsField = null;
-
- imageDataOffsets = new int[imageData.length];
- imageDataByteCounts = new int[imageData.length];
-
- int totalLength = 0;
- for (int i = 0; i < imageData.length; i++)
- {
- imageDataByteCounts[i] = imageData[i].length;
- totalLength += imageData[i].length;
-
- totalLength += TiffImageWriterBase
- .imageDataPaddingLength(imageData[i].length);
- }
-
- // Append imageData-related fields to first directory
- {
- TagInfo tagInfo;
- if (stripsNotTiles)
- tagInfo = TIFF_TAG_STRIP_OFFSETS;
- else
- tagInfo = TIFF_TAG_TILE_OFFSETS;
-
- imageDataOffsetsField = findField(tagInfo);
- if (null == imageDataOffsetsField)
- {
- imageDataOffsetsField = new TiffOutputField(tagInfo,
- FIELD_TYPE_LONG, imageDataOffsets.length,
- FIELD_TYPE_LONG.writeData(imageDataOffsets, byteOrder));
- add(imageDataOffsetsField);
- }
- }
- {
- TagInfo tagInfo;
- if (stripsNotTiles)
- tagInfo = TIFF_TAG_STRIP_BYTE_COUNTS;
- else
- tagInfo = TIFF_TAG_TILE_BYTE_COUNTS;
-
- byte data[] = FIELD_TYPE_LONG.writeData(imageDataByteCounts,
- byteOrder);
-
- TiffOutputField field = findField(tagInfo);
- if (null == field)
- add(new TiffOutputField(tagInfo, FIELD_TYPE_LONG,
- imageDataByteCounts.length, data));
- else
- field.setData(data);
-
- }
-
- imageDataInfo = new ImageDataInfo(imageData, imageDataOffsets,
- imageDataByteCounts, imageDataOffsetsField, totalLength);
- }
-
- TiffOutputField jpegImageDataOffsetField = null;
-
private byte rawJpegImageData[] = null;
public void setRawJpegImageData(byte rawJpegImageData[])
@@ -353,69 +132,6 @@
return rawJpegImageData;
}
- private void jpegImageDataInfoStep(int byteOrder)
- {
- if (null == rawJpegImageData)
- return;
-
- // int totalLength = 0;
- // totalLength += rawJpegImageData.length;
- // totalLength += imageDataPaddingLength(rawJpegImageData.length);
-
- // Append imageData-related fields to first directory
- {
- TagInfo tagInfo = TIFF_TAG_JPEG_INTERCHANGE_FORMAT;
-
- jpegImageDataOffsetField = findField(tagInfo);
- if (null == jpegImageDataOffsetField)
- {
- jpegImageDataOffsetField = new TiffOutputField(tagInfo,
- FIELD_TYPE_LONG, 1, FIELD_TYPE_LONG.getStubValue(1));
- add(jpegImageDataOffsetField);
- }
- }
- {
- TagInfo tagInfo = TIFF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH;
-
- byte data[] = FIELD_TYPE_LONG.writeData(new int[]{
- rawJpegImageData.length,
- }, byteOrder);
-
- TiffOutputField field = findField(tagInfo);
- if (null == field)
- add(new TiffOutputField(tagInfo, FIELD_TYPE_LONG, 1, data));
- else
- field.setData(data);
- }
- }
-
- private void updateTiffImageDataOffsetsStep(final int imageDataOffset,
- int byteOrder) throws IOException, ImageWriteException
- {
- int currentOffset = imageDataOffset;
-
- for (int i = 0; i < imageDataInfo.imageData.length; i++)
- {
- imageDataInfo.imageDataOffsets[i] = currentOffset;
- currentOffset += imageDataInfo.imageDataByteCounts[i];
-
- currentOffset += TiffImageWriterBase
- .imageDataPaddingLength(imageDataInfo.imageDataByteCounts[i]);
- }
-
- imageDataInfo.imageDataOffsetsField.setData(FIELD_TYPE_LONG.writeData(
- imageDataInfo.imageDataOffsets, byteOrder));
- // }
- }
-
- private void updateJpegImageDataOffsetsStep(final int imageDataOffset,
- int byteOrder) throws IOException, ImageWriteException
- {
- jpegImageDataOffsetField.setData(FIELD_TYPE_LONG.writeData(new int[]{
- imageDataOffset,
- }, byteOrder));
- }
-
private RawTiffImageData rawTiffImageData = null;
public void setRawTiffImageData(RawTiffImageData rawTiffImageData)
@@ -428,16 +144,6 @@
return rawTiffImageData;
}
- // public static final Comparator COMPARATOR = new Comparator()
- // {
- // public int compare(Object o1, Object o2)
- // {
- // Directory e1 = (Directory) o1;
- // Directory e2 = (Directory) o2;
- // return e1.offset - e2.offset;
- // }
- // };
-
public int getItemLength()
{
return TIFF_ENTRY_LENGTH * fields.size() + TIFF_DIRECTORY_HEADER_LENGTH
@@ -461,7 +167,7 @@
protected List getOutputItems(TiffOutputSummary outputSummary)
{
// first validate directory fields.
-
+
removeFieldIfPresent(TIFF_TAG_JPEG_INTERCHANGE_FORMAT);
removeFieldIfPresent(TIFF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH);
@@ -473,15 +179,15 @@
FieldType.getStubLocalValue());
add(jpegOffsetField);
+ byte lengthValue[] = FIELD_TYPE_LONG.writeData(new int[]{
+ rawJpegImageData.length,
+ }, outputSummary.byteOrder);
+
TiffOutputField jpegLengthField = new TiffOutputField(
TIFF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, FIELD_TYPE_LONG,
- 1, FieldType.getStubLocalValue());
+ 1, lengthValue);
add(jpegLengthField);
- byte lengthValue[] = FIELD_TYPE_LONG.writeData(new int[]{
- rawJpegImageData.length,
- }, outputSummary.byteOrder);
- jpegLengthField.setData(lengthValue);
}
// --------------------------------------------------------------
@@ -492,7 +198,7 @@
removeFieldIfPresent(TIFF_TAG_TILE_BYTE_COUNTS);
TiffOutputField imageDataOffsetField;
- ImageDataInfo imageDataInfo = null;
+ ImageDataOffsets imageDataInfo = null;
if (null != rawTiffImageData)
{
boolean stripsNotTiles = rawTiffImageData.stripsNotTiles();
@@ -520,15 +226,9 @@
imageDataOffsets = new int[imageData.length];
imageDataByteCounts = new int[imageData.length];
-
- int imageDataTotalLength = 0;
for (int i = 0; i < imageData.length; i++)
{
imageDataByteCounts[i] = imageData[i].length;
- imageDataTotalLength += imageData[i].length;
-
- imageDataTotalLength += TiffImageWriterBase
- .imageDataPaddingLength(imageData[i].length);
}
// --------
@@ -551,9 +251,8 @@
// --------
- imageDataInfo = new ImageDataInfo(imageData, imageDataOffsets,
- imageDataByteCounts, imageDataOffsetField,
- imageDataTotalLength);
+ imageDataInfo = new ImageDataOffsets(imageData, imageDataOffsets,
+ imageDataOffsetField);
}
// --------------------------------------------------------------
@@ -562,18 +261,6 @@
result.add(this);
sortFields();
- // public void calculateLengths(int byteOrder) throws IOException,
- // ImageWriteException
- //{
- // tiffImageDataInfoStep(byteOrder);
- // jpegImageDataInfoStep(byteOrder);
- //
- // internalLength = TIFF_ENTRY_LENGTH * fields.size()
- // + TIFF_DIRECTORY_HEADER_LENGTH
- // + TIFF_DIRECTORY_FOOTER_LENGTH;
- //
- // totalLength = internalLength;
- //
for (int i = 0; i < fields.size(); i++)
{
TiffOutputField field = (TiffOutputField) fields.get(i);
@@ -582,7 +269,7 @@
TiffOutputItem item = field.getSeperateValue();
result.add(item);
-// outputSummary.add(item, field);
+ // outputSummary.add(item, field);
}
if (null != imageDataInfo)
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java Mon Jan 7 00:12:01 2008
@@ -69,7 +69,7 @@
}, byteOrder));
}
- protected void writeSimple(BinaryOutputStream bos) throws IOException,
+ protected void writeField(BinaryOutputStream bos) throws IOException,
ImageWriteException
{
bos.write2Bytes(tag);
@@ -99,36 +99,6 @@
}
}
- protected int writeDirectoryEntry(BinaryOutputStream bos,
- int seperateValuesOffset) throws ImageWriteException, IOException
- {
- bos.write2Bytes(tag);
- bos.write2Bytes(fieldType.type);
- bos.write4Bytes(count);
-
- // if(fieldType.type == TiffConstants.FIELD_TYPE_ASCII.type)
- // Debug.debug("ascii bytes", bytes);
-
- if (isLocalValue())
- {
- bos.writeByteArray(bytes);
- int remainder = TIFF_ENTRY_MAX_VALUE_LENGTH - bytes.length;
- for (int i = 0; i < remainder; i++)
- bos.write(0);
- return 0;
- }
- else
- {
- bos.write4Bytes(seperateValuesOffset);
-
- int written = bytes.length;
- if ((written % 2) != 0)
- written++;
-
- return written;
- }
- }
-
protected TiffOutputItem getSeperateValue()
{
return separateValueItem;
@@ -139,47 +109,16 @@
return bytes.length <= TIFF_ENTRY_MAX_VALUE_LENGTH;
}
- protected int getSeperateValueLength()
- {
- if (isLocalValue())
- return 0;
- else
- {
- int written = bytes.length;
- if ((written % 2) != 0)
- written++;
-
- return written;
- }
- }
-
- protected int writeSeperateValue(BinaryOutputStream bos)
- throws ImageWriteException, IOException
- {
- if (isLocalValue())
- return 0;
-
- bos.writeByteArray(bytes);
-
- int written = bytes.length;
- if ((written % 2) != 0)
- {
- bos.write(0);
- written++;
- }
- return written;
- }
-
- protected void setData(byte bytes[])
+ protected void setData(byte bytes[]) throws ImageWriteException
{
if (this.bytes.length != bytes.length)
- throw new Error("Bug. Locality disrupted! "
- + tagInfo.getDescription());
- boolean wasLocalValue = isLocalValue();
+ throw new ImageWriteException("Cannot change size of value.");
+
+ // boolean wasLocalValue = isLocalValue();
this.bytes = bytes;
- if (isLocalValue() != wasLocalValue)
- throw new Error("Bug. Locality disrupted! "
- + tagInfo.getDescription());
+ // if (isLocalValue() != wasLocalValue)
+ // throw new Error("Bug. Locality disrupted! "
+ // + tagInfo.getDescription());
}
private static final String newline = System.getProperty("line.separator");
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java Mon Jan 7 00:12:01 2008
@@ -127,20 +127,6 @@
return result;
}
- // public static final int DIRECTORY_TYPE_UNKNOWN = -1;
- // public static final int DIRECTORY_TYPE_ROOT = 0;
- // public static final int DIRECTORY_TYPE_SUB = 1;
- // public static final int DIRECTORY_TYPE_THUMBNAIL = 2;
- // public static final int DIRECTORY_TYPE_EXIF = -2;
- // // public static final int DIRECTORY_TYPE_SUB = 5;
- // public static final int DIRECTORY_TYPE_GPS = -3;
- // public static final int DIRECTORY_TYPE_INTEROPERABILITY = -4;
- // public static final int DIRECTORY_TYPE_DIR_0 = 0;
- // public static final int DIRECTORY_TYPE_DIR_1 = 1;
- // public static final int DIRECTORY_TYPE_DIR_2 = 2;
- // public static final int DIRECTORY_TYPE_DIR_3 = 3;
- // public static final int DIRECTORY_TYPE_DIR_4 = 4;
-
private static final String newline = System.getProperty("line.separator");
public String toString()
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSummary.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSummary.java?rev=609529&r1=609528&r2=609529&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSummary.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSummary.java Mon Jan 7 00:12:01 2008
@@ -60,7 +60,7 @@
offsetItems.add(new OffsetItem(item, itemOffsetField));
}
- public void updateOffsets(int byteOrder)
+ public void updateOffsets(int byteOrder) throws ImageWriteException
{
for (int i = 0; i < offsetItems.size(); i++)
{
@@ -74,9 +74,9 @@
for (int i = 0; i < imageDataItems.size(); i++)
{
- ImageDataInfo imageDataInfo = (ImageDataInfo) imageDataItems.get(i);
+ ImageDataOffsets imageDataInfo = (ImageDataOffsets) imageDataItems.get(i);
- for (int j = 0; j < imageDataInfo.imageData.length; j++)
+ for (int j = 0; j < imageDataInfo.outputItems.length; j++)
{
TiffOutputItem item = imageDataInfo.outputItems[j];
imageDataInfo.imageDataOffsets[j] = item.getOffset();
@@ -89,7 +89,7 @@
private List imageDataItems = new ArrayList();
- public void addTiffImageData(final ImageDataInfo imageDataInfo)
+ public void addTiffImageData(final ImageDataOffsets imageDataInfo)
{
offsetItems.add(imageDataInfo);
}