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 2007/11/17 23:30:14 UTC
svn commit: r596023 - in
/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan: ./ common/
formats/bmp/ formats/gif/ formats/png/ formats/pnm/ formats/psd/
formats/tiff/ sampleUsage/ util/
Author: cmchen
Date: Sat Nov 17 15:30:11 2007
New Revision: 596023
URL: http://svn.apache.org/viewvc?rev=596023&view=rev
Log:
fixed two bugs exposed by unit tests around png's: a) not writing alpha channel properly b) ignoring alpha channel when reading grayscale pngs.
Modified:
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/Sanselan.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/BinaryFileFunctions.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/IBufferedImageFactory.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/SimpleBufferedImageFactory.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/bmp/BmpImageParser.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/gif/GifImageParser.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/PngImageParser.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/PngWriter.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/ScanExpediter.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/ScanExpediterSimple.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/pnm/PNMImageParser.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/psd/PsdImageParser.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/tiff/TiffImageParser.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/sampleUsage/ImageReadExample.java
incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/util/IOUtils.java
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/Sanselan.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/Sanselan.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/Sanselan.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/Sanselan.java Sat Nov 17 15:30:11 2007
@@ -65,7 +65,7 @@
*/
public static boolean hasImageFileExtension(File file)
{
- if(!file.isFile())
+ if (!file.isFile())
return false;
return hasImageFileExtension(file.getName());
}
@@ -238,6 +238,19 @@
/**
* Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and TIFF images.
* <p>
+ * @param is InputStream from which to read image data.
+ * @param filename Filename associated with image data (optional).
+ * @return An instance of ICC_Profile or null if the image contains no ICC profile..
+ */
+ public static ICC_Profile getICCProfile(InputStream is, String filename)
+ throws ImageReadException, IOException
+ {
+ return getICCProfile(new ByteSourceInputStream(is, filename));
+ }
+
+ /**
+ * Extracts an ICC Profile (if present) from JPEG, PNG, PSD (Photoshop) and TIFF images.
+ * <p>
* @param file File containing image data.
* @return An instance of ICC_Profile or null if the image contains no ICC profile..
*/
@@ -330,6 +343,25 @@
* <p>
* Not to be confused with "image metadata."
* <p>
+ * @param is InputStream from which to read image data.
+ * @param filename Filename associated with image data (optional).
+ * @return An instance of ImageInfo.
+ * @see ImageInfo
+ */
+ public static ImageInfo getImageInfo(InputStream is, String filename)
+ throws ImageReadException, IOException
+ {
+ return getImageInfo(new ByteSourceInputStream(is, filename));
+ }
+
+ /**
+ * Parses the "image info" of an image.
+ * <p>
+ * "Image info" is a summary of basic information about the image such as:
+ * width, height, file format, bit depth, color type, etc.
+ * <p>
+ * Not to be confused with "image metadata."
+ * <p>
* @param bytes Byte array containing an image file.
* @return An instance of ImageInfo.
* @see ImageInfo
@@ -406,6 +438,19 @@
/**
* Determines the width and height of an image.
* <p>
+ * @param is InputStream from which to read image data.
+ * @param filename Filename associated with image data (optional).
+ * @return The width and height of the image.
+ */
+ public static Dimension getImageSize(InputStream is, String filename)
+ throws ImageReadException, IOException
+ {
+ return getImageSize(new ByteSourceInputStream(is, filename));
+ }
+
+ /**
+ * Determines the width and height of an image.
+ * <p>
* @param bytes Byte array containing an image file.
* @return The width and height of the image.
*/
@@ -435,6 +480,8 @@
return imageParser.getImageSize(byteSource);
}
+
+
/**
* Parses the metadata of an image. This metadata depends on the format of the image.
* <p>
@@ -489,6 +536,54 @@
* <p>
* Not to be confused with "image info."
* <p>
+ * @param is InputStream from which to read image data.
+ * @param filename Filename associated with image data (optional).
+ * @return An instance of IImageMetadata.
+ * @see IImageMetadata
+ */
+ public static IImageMetadata getMetadata(InputStream is, String filename)
+ throws ImageReadException, IOException
+ {
+ return getMetadata(is, filename, null);
+ }
+
+ /**
+ * Parses the metadata of an image file. This metadata depends on the format of the image.
+ * <p>
+ * JPEG/JFIF files may contain EXIF and/or IPTC metadata.
+ * PNG files may contain comments.
+ * TIFF files may contain metadata.
+ * <p>
+ * The instance of IImageMetadata returned by getMetadata() should be upcast (depending on image format).
+ * <p>
+ * Not to be confused with "image info."
+ * <p>
+ * @param is InputStream from which to read image data.
+ * @param filename Filename associated with image data (optional).
+ * @param params Map of optional parameters, defined in SanselanConstants.
+ * @return An instance of IImageMetadata.
+ * @see IImageMetadata
+ */
+ public static IImageMetadata getMetadata(InputStream is, String filename, Map params)
+ throws ImageReadException, IOException
+ {
+ return getMetadata(new ByteSourceInputStream(is, filename), params);
+ }
+
+
+
+
+ /**
+ * Parses the metadata of an image file. This metadata depends on the format of the image.
+ * <p>
+ * JPEG/JFIF files may contain EXIF and/or IPTC metadata.
+ * PNG files may contain comments.
+ * TIFF files may contain metadata.
+ * <p>
+ * The instance of IImageMetadata returned by getMetadata() should be upcast (depending on image format).
+ * <p>
+ * Not to be confused with "image info."
+ * <p>
* @param file File containing image data.
* @return An instance of IImageMetadata.
* @see IImageMetadata
@@ -583,6 +678,22 @@
ImageParser imageParser = getImageParser(byteSource);
return imageParser.getFormatCompliance(byteSource);
+ }
+
+ /**
+ * Returns all images contained in an image.
+ * <p>
+ * Useful for image formats such as GIF and ICO in which a single file may
+ * contain multiple images.
+ * <p>
+ * @param is InputStream from which to read image data.
+ * @param filename Filename associated with image data (optional).
+ * @return A vector of BufferedImages.
+ */
+ public static Vector getAllBufferedImages(InputStream is, String filename)
+ throws ImageReadException, IOException
+ {
+ return getAllBufferedImages(new ByteSourceInputStream(is, filename));
}
/**
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/BinaryFileFunctions.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/BinaryFileFunctions.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/BinaryFileFunctions.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/BinaryFileFunctions.java Sat Nov 17 15:30:11 2007
@@ -26,6 +26,7 @@
import org.cmc.sanselan.ImageReadException;
import org.cmc.sanselan.ImageWriteException;
+import org.cmc.sanselan.util.Debug;
public class BinaryFileFunctions implements BinaryConstants
{
@@ -467,6 +468,7 @@
while (read < length)
{
int count = is.read(result, read, length - read);
+// Debug.debug("count", count);
if (count < 1)
throw new IOException(exception);
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/IBufferedImageFactory.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/IBufferedImageFactory.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/IBufferedImageFactory.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/IBufferedImageFactory.java Sat Nov 17 15:30:11 2007
@@ -4,7 +4,7 @@
public interface IBufferedImageFactory
{
- public BufferedImage getColorBufferedImage(int width, int height);
+ public BufferedImage getColorBufferedImage(int width, int height, boolean hasAlpha);
- public BufferedImage getGrayscaleBufferedImage(int width, int height);
+ public BufferedImage getGrayscaleBufferedImage(int width, int height, boolean hasAlpha);
}
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/SimpleBufferedImageFactory.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/SimpleBufferedImageFactory.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/SimpleBufferedImageFactory.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/common/SimpleBufferedImageFactory.java Sat Nov 17 15:30:11 2007
@@ -2,15 +2,23 @@
import java.awt.image.BufferedImage;
+import org.cmc.sanselan.util.Debug;
+
public class SimpleBufferedImageFactory implements IBufferedImageFactory
{
- public BufferedImage getColorBufferedImage(int width, int height)
+ public BufferedImage getColorBufferedImage(int width, int height,
+ boolean hasAlpha)
{
- return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+ if (hasAlpha)
+ return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+ return new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
}
- public BufferedImage getGrayscaleBufferedImage(int width, int height)
+ public BufferedImage getGrayscaleBufferedImage(int width, int height,
+ boolean hasAlpha)
{
+ if (hasAlpha)
+ return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
return new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
}
}
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/bmp/BmpImageParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/bmp/BmpImageParser.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/bmp/BmpImageParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/bmp/BmpImageParser.java Sat Nov 17 15:30:11 2007
@@ -562,8 +562,9 @@
int width = bhi.width;
int height = bhi.height;
+ boolean hasAlpha = false;
BufferedImage result = getBufferedImageFactory(params)
- .getColorBufferedImage(width, height);
+ .getColorBufferedImage(width, height, hasAlpha);
if (debug)
{
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/gif/GifImageParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/gif/GifImageParser.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/gif/GifImageParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/gif/GifImageParser.java Sat Nov 17 15:30:11 2007
@@ -734,8 +734,9 @@
int width = ghi.logicalScreenWidth;
int height = ghi.logicalScreenHeight;
+ boolean hasAlpha = gce.transparency;
BufferedImage result = getBufferedImageFactory(params)
- .getColorBufferedImage(width, height);
+ .getColorBufferedImage(width, height, hasAlpha);
{
int colortable[];
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/PngImageParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/PngImageParser.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/PngImageParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/PngImageParser.java Sat Nov 17 15:30:11 2007
@@ -59,6 +59,7 @@
import org.cmc.sanselan.formats.transparencyfilters.TransparencyFilterTrueColor;
import org.cmc.sanselan.icc.IccProfileParser;
import org.cmc.sanselan.util.Debug;
+import org.cmc.sanselan.util.IOUtils;
public class PngImageParser extends ImageParser implements PngConstants
{
@@ -318,15 +319,15 @@
// followed by an alpha sample.
switch (colorType)
{
- case 0 :
+ case COLOR_TYPE_GREYSCALE :
return true;
- case 2 :
+ case COLOR_TYPE_TRUE_COLOR :
return false;
- case 3 :
+ case COLOR_TYPE_INDEXED_COLOR :
return false;
- case 4 :
+ case COLOR_TYPE_GREYSCALE_WITH_ALPHA :
return true;
- case 6 :
+ case COLOR_TYPE_TRUE_COLOR_WITH_ALPHA :
return false;
}
@@ -362,15 +363,15 @@
// followed by an alpha sample.
switch (colorType)
{
- case 0 :
+ case COLOR_TYPE_GREYSCALE :
return 1;
- case 2 :
+ case COLOR_TYPE_TRUE_COLOR :
return 3;
- case 3 :
+ case COLOR_TYPE_INDEXED_COLOR :
return 1; // is this accurate ? how may bits per index?
- case 4 :
+ case COLOR_TYPE_GREYSCALE_WITH_ALPHA :
return 2;
- case 6 :
+ case COLOR_TYPE_TRUE_COLOR_WITH_ALPHA :
return 4;
}
@@ -397,13 +398,13 @@
{
switch (ColorType)
{
- case 0 : // 1,2,4,8,16 Each pixel is a grayscale sample.
- case 2 : // 8,16 Each pixel is an R,G,B triple.
- case 3 : // 1,2,4,8 Each pixel is a palette index;
+ case COLOR_TYPE_GREYSCALE : // 1,2,4,8,16 Each pixel is a grayscale sample.
+ case COLOR_TYPE_TRUE_COLOR : // 8,16 Each pixel is an R,G,B triple.
+ case COLOR_TYPE_INDEXED_COLOR : // 1,2,4,8 Each pixel is a palette index;
return false;
- case 4 : // 8,16 Each pixel is a grayscale sample,
+ case COLOR_TYPE_GREYSCALE_WITH_ALPHA : // 8,16 Each pixel is a grayscale sample,
// followed by an alpha sample.
- case 6 : // 8,16 Each pixel is an R,G,B triple,
+ case COLOR_TYPE_TRUE_COLOR_WITH_ALPHA : // 8,16 Each pixel is an R,G,B triple,
// followed by an alpha sample.
return true;
default :
@@ -416,16 +417,16 @@
{
switch (ColorType)
{
- case 0 : // 1,2,4,8,16 Each pixel is a grayscale sample.
+ case COLOR_TYPE_GREYSCALE : // 1,2,4,8,16 Each pixel is a grayscale sample.
return "grayscale";
- case 2 : // 8,16 Each pixel is an R,G,B triple.
+ case COLOR_TYPE_TRUE_COLOR : // 8,16 Each pixel is an R,G,B triple.
return "rgb";
- case 3 : // 1,2,4,8 Each pixel is a palette index;
+ case COLOR_TYPE_INDEXED_COLOR : // 1,2,4,8 Each pixel is a palette index;
return "indexed rgb";
- case 4 : // 8,16 Each pixel is a grayscale sample,
+ case COLOR_TYPE_GREYSCALE_WITH_ALPHA : // 8,16 Each pixel is a grayscale sample,
// followed by an alpha sample.
return "grayscale w/ alpha";
- case 6 : // 8,16 Each pixel is an R,G,B triple,
+ case COLOR_TYPE_TRUE_COLOR_WITH_ALPHA : // 8,16 Each pixel is an R,G,B triple,
// followed by an alpha sample.
return "RGB w/ alpha";
default :
@@ -444,14 +445,14 @@
switch (ColorType)
{
- case 0 : // 1,2,4,8,16 Each pixel is a grayscale sample.
+ case COLOR_TYPE_GREYSCALE : // 1,2,4,8,16 Each pixel is a grayscale sample.
return new TransparencyFilterGrayscale(pngChunktRNS.bytes);
- case 2 : // 8,16 Each pixel is an R,G,B triple.
+ case COLOR_TYPE_TRUE_COLOR : // 8,16 Each pixel is an R,G,B triple.
return new TransparencyFilterTrueColor(pngChunktRNS.bytes);
- case 3 : // 1,2,4,8 Each pixel is a palette index;
+ case COLOR_TYPE_INDEXED_COLOR : // 1,2,4,8 Each pixel is a palette index;
return new TransparencyFilterIndexedColor(pngChunktRNS.bytes);
- case 4 : // 8,16 Each pixel is a grayscale sample,
- case 6 : // 8,16 Each pixel is an R,G,B triple,
+ case COLOR_TYPE_GREYSCALE_WITH_ALPHA : // 8,16 Each pixel is a grayscale sample,
+ case COLOR_TYPE_TRUE_COLOR_WITH_ALPHA : // 8,16 Each pixel is an R,G,B triple,
default :
throw new ImageReadException(
"Simple Transparency not compatible with ColorType: "
@@ -580,14 +581,14 @@
int ColorType;
switch (pngChunkIHDR.colorType)
{
- case 0 : // 1,2,4,8,16 Each pixel is a grayscale sample.
- case 4 : // 8,16 Each pixel is a grayscale sample,
+ case COLOR_TYPE_GREYSCALE : // 1,2,4,8,16 Each pixel is a grayscale sample.
+ case COLOR_TYPE_GREYSCALE_WITH_ALPHA : // 8,16 Each pixel is a grayscale sample,
// followed by an alpha sample.
ColorType = ImageInfo.COLOR_TYPE_GRAYSCALE;
break;
- case 2 : // 8,16 Each pixel is an R,G,B triple.
- case 3 : // 1,2,4,8 Each pixel is a palette index;
- case 6 : // 8,16 Each pixel is an R,G,B triple,
+ case COLOR_TYPE_TRUE_COLOR : // 8,16 Each pixel is an R,G,B triple.
+ case COLOR_TYPE_INDEXED_COLOR : // 1,2,4,8 Each pixel is a palette index;
+ case COLOR_TYPE_TRUE_COLOR_WITH_ALPHA : // 8,16 Each pixel is an R,G,B triple,
// followed by an alpha sample.
ColorType = ImageInfo.COLOR_TYPE_RGB;
break;
@@ -720,7 +721,7 @@
// System.out.println("color_type: " + color_type);
// System.out.println("BitDepth: " + BitDepth);
- int transfer_type;
+// int transfer_type;
// int BytesPerSample;
int bitsPerSample = bitDepth;
@@ -728,7 +729,7 @@
throw new ImageReadException("PNG: unknown FilterMethod: "
+ pngChunkIHDR.filterMethod);
- transfer_type = DataBuffer.TYPE_BYTE;
+// transfer_type = DataBuffer.TYPE_BYTE;
// switch (BitDepth)
// {
// case 1 :
@@ -822,36 +823,37 @@
// cm = ColorModel.getRGBdefault();
//
-
+
int bitsPerPixel = bitsPerSample * samplesPerPixel;
- Debug.debug("bitsPerSample", bitsPerSample);
- Debug.debug("samplesPerPixel", samplesPerPixel);
+// Debug.debug("bitsPerSample", bitsPerSample);
+// Debug.debug("samplesPerPixel", samplesPerPixel);
+
+ boolean hasAlpha = colorType == COLOR_TYPE_GREYSCALE_WITH_ALPHA
+ || colorType == COLOR_TYPE_TRUE_COLOR_WITH_ALPHA;
-
- //
- // WritableRaster raster = cm.createCompatibleWritableRaster(width,
- // height);
- //
- // boolean premult = cm.isAlphaPremultiplied();
- //
- // BufferedImage result = new BufferedImage(cm, raster, premult, null);
BufferedImage result;
if (isGrayscale)
result = getBufferedImageFactory(params)
- .getGrayscaleBufferedImage(width, height);
+ .getGrayscaleBufferedImage(width, height, hasAlpha);
else
result = getBufferedImageFactory(params).getColorBufferedImage(
- width, height);
+ width, height, hasAlpha);
ByteArrayInputStream bais = new ByteArrayInputStream(compressed);
InflaterInputStream iis = new InflaterInputStream(bais);
+
+ byte bytes[] = IOUtils.getInputStreamBytes(iis);
+
+ bais = new ByteArrayInputStream(compressed);
+ iis = new InflaterInputStream(bais);
+
// ZInputStream iis = new ZInputStream(bais);
// ByteArrayInputStream iis = new ByteArrayInputStream(uncompressed);
- int bitsPerScanLine = bitsPerPixel * width;
+// int bitsPerScanLine = bitsPerPixel * width;
- Debug.debug("bitsPerScanLine", bitsPerScanLine);
- Debug.debug("bitsPerPixel", bitsPerPixel);
+// Debug.debug("bitsPerScanLine", bitsPerScanLine);
+// Debug.debug("bitsPerPixel", bitsPerPixel);
ScanExpediter scanExpediter;
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/PngWriter.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/PngWriter.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/PngWriter.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/PngWriter.java Sat Nov 17 15:30:11 2007
@@ -337,7 +337,6 @@
colorType = getColourType(hasAlpha, isGrayscale);
if (verbose)
Debug.debug("colorType", colorType);
-
}
byte bit_depth = getBitDepth(colorType, params);
@@ -401,6 +400,10 @@
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ boolean useAlpha = colorType == COLOR_TYPE_GREYSCALE_WITH_ALPHA
+ || colorType == COLOR_TYPE_TRUE_COLOR_WITH_ALPHA;
+
+
int row[] = new int[width];
for (int y = 0; y < height; y++)
{
@@ -444,12 +447,16 @@
baos.write(green);
baos.write(blue);
}
+ if (useAlpha)
+ baos.write(alpha);
+
+
}
}
}
uncompressed = baos.toByteArray();
}
- // Debug.debug("uncompressed", uncompressed.length);
+// Debug.debug("uncompressed", uncompressed.length);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DeflaterOutputStream dos = new DeflaterOutputStream(baos);
@@ -459,13 +466,16 @@
int end = Math.min(uncompressed.length, index + chunk_size);
int length = end - index;
+
dos.write(uncompressed, index, length);
+ dos.flush();
+ baos.flush();
byte compressed[] = baos.toByteArray();
baos.reset();
if (compressed.length > 0)
{
- // Debug.debug("compressed", compressed.length);
+// Debug.debug("compressed", compressed.length);
writeChunkIDAT(os, compressed);
}
@@ -475,7 +485,7 @@
byte compressed[] = baos.toByteArray();
if (compressed.length > 0)
{
- // Debug.debug("compressed", compressed.length);
+// Debug.debug("compressed final", compressed.length);
writeChunkIDAT(os, compressed);
}
}
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/ScanExpediter.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/ScanExpediter.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/ScanExpediter.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/ScanExpediter.java Sat Nov 17 15:30:11 2007
@@ -64,8 +64,8 @@
this.gammaCorrection = gammaCorrection;
this.transparencyFilter = transparencyFilter;
- Debug.debug("BitDepth", bitDepth);
- Debug.debug("bitsPerPixel", bitsPerPixel);
+// Debug.debug("BitDepth", bitDepth);
+// Debug.debug("bitsPerPixel", bitsPerPixel);
// Debug.debug("colorType", colorType);
// buffer = bi.getRaster().getDataBuffer();
@@ -275,6 +275,7 @@
throw new ImageReadException("PNG: missing filter type");
// System.out.println("\t" + "filter: " + filter_type);
+
// byte unfiltered[] = new byte[length];
byte scanline[] = this.readByteArray("scanline", length, is,
"PNG: missing image data");
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/ScanExpediterSimple.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/ScanExpediterSimple.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/ScanExpediterSimple.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/png/ScanExpediterSimple.java Sat Nov 17 15:30:11 2007
@@ -39,15 +39,18 @@
public void drive() throws ImageReadException, IOException
{
+// Debug.debug("width", width);
int bitsPerScanLine = bitsPerPixel * width;
- Debug.debug("bitsPerPixel", bitsPerPixel);
- Debug.debug("bitsPerScanLine", bitsPerScanLine);
+// Debug.debug("bitsPerPixel", bitsPerPixel);
+// Debug.debug("bitsPerScanLine", bitsPerScanLine);
int pixelBytesPerScanLine = getBitsToBytesRoundingUp(bitsPerScanLine);
- Debug.debug("pixelBytesPerScanLine", pixelBytesPerScanLine);
+// Debug.debug("pixelBytesPerScanLine", pixelBytesPerScanLine);
byte prev[] = null;
for (int y = 0; y < height; y++)
{
+// Debug.debug("getNextScanline", y + "/" + height + ", " + pixelBytesPerScanLine);
+
byte unfiltered[] = getNextScanline(is, pixelBytesPerScanLine,
prev, bytesPerPixel);
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/pnm/PNMImageParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/pnm/PNMImageParser.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/pnm/PNMImageParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/pnm/PNMImageParser.java Sat Nov 17 15:30:11 2007
@@ -286,8 +286,9 @@
int width = info.width;
int height = info.height;
+ boolean hasAlpha = false;
BufferedImage result = getBufferedImageFactory(params)
- .getColorBufferedImage(width, height);
+ .getColorBufferedImage(width, height, hasAlpha);
info.readImage(result, is);
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/psd/PsdImageParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/psd/PsdImageParser.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/psd/PsdImageParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/psd/PsdImageParser.java Sat Nov 17 15:30:11 2007
@@ -706,8 +706,9 @@
// transfer_type = DataBuffer.TYPE_BYTE;
+ boolean hasAlpha = false;
BufferedImage result = getBufferedImageFactory(params)
- .getColorBufferedImage(width, height);
+ .getColorBufferedImage(width, height, hasAlpha);
DataParser dataParser;
switch (imageContents.header.Mode)
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/tiff/TiffImageParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/tiff/TiffImageParser.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/tiff/TiffImageParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/formats/tiff/TiffImageParser.java Sat Nov 17 15:30:11 2007
@@ -1050,9 +1050,10 @@
throw new ImageReadException("Tiff: fSamplesPerPixel ("
+ samplesPerPixel + ")!=fBitsPerSample.length ("
+ bitsPerSample.length + ")");
-
+
+ boolean hasAlpha = false;
BufferedImage result = getBufferedImageFactory(params)
- .getColorBufferedImage(width, height);
+ .getColorBufferedImage(width, height, hasAlpha);
PhotometricInterpreter photometricInterpreter = getPhotometricInterpreter(
entries, photometricInterpretation, bitsPerPixel,
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/sampleUsage/ImageReadExample.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/sampleUsage/ImageReadExample.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/sampleUsage/ImageReadExample.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/sampleUsage/ImageReadExample.java Sat Nov 17 15:30:11 2007
@@ -55,7 +55,7 @@
IBufferedImageFactory
{
- public BufferedImage getColorBufferedImage(int width, int height)
+ public BufferedImage getColorBufferedImage(int width, int height, boolean hasAlpha)
{
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
@@ -65,9 +65,9 @@
Transparency.TRANSLUCENT);
}
- public BufferedImage getGrayscaleBufferedImage(int width, int height)
+ public BufferedImage getGrayscaleBufferedImage(int width, int height, boolean hasAlpha)
{
- return getColorBufferedImage(width, height);
+ return getColorBufferedImage(width, height, hasAlpha);
}
}
Modified: incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/util/IOUtils.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/util/IOUtils.java?rev=596023&r1=596022&r2=596023&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/util/IOUtils.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/cmc/sanselan/util/IOUtils.java Sat Nov 17 15:30:11 2007
@@ -17,11 +17,15 @@
package org.cmc.sanselan.util;
import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import org.cmc.sanselan.SanselanConstants;
@@ -100,4 +104,108 @@
}
}
}
+
+ public static void writeToFile(byte[] src, File file) throws IOException
+ {
+ ByteArrayInputStream stream = null;
+
+ try
+ {
+ stream = new ByteArrayInputStream(src);
+
+ putInputStreamToFile(stream, file);
+ }
+ finally
+ {
+ try
+ {
+ if (stream != null)
+ stream.close();
+ }
+ catch (Exception e)
+ {
+ Debug.debug(e);
+
+ }
+ }
+ }
+
+ public static void putInputStreamToFile(InputStream src, File file)
+ throws IOException
+ {
+ FileOutputStream stream = null;
+
+ try
+ {
+ if (file.getParentFile() != null)
+ file.getParentFile().mkdirs();
+ stream = new FileOutputStream(file);
+
+ copyStreamToStream(src, stream);
+ }
+ finally
+ {
+ try
+ {
+ if (stream != null)
+ stream.close();
+ }
+ catch (Exception e)
+ {
+ Debug.debug(e);
+ }
+ }
+ }
+
+ public static void copyStreamToStream(InputStream src, OutputStream dst)
+ throws IOException
+ {
+ copyStreamToStream(src, dst, true);
+ }
+
+ public static void copyStreamToStream(InputStream src, OutputStream dst,
+ boolean close_streams) throws IOException
+ {
+ BufferedInputStream bis = null;
+ BufferedOutputStream bos = null;
+
+ try
+ {
+ bis = new BufferedInputStream(src);
+ bos = new BufferedOutputStream(dst);
+
+ int count;
+ byte[] buffer = new byte[4096];
+ while ((count = bis.read(buffer, 0, buffer.length)) > 0)
+ dst.write(buffer, 0, count);
+
+ bos.flush();
+ }
+ finally
+ {
+ if (close_streams)
+ {
+ try
+ {
+ if (bis != null)
+ bis.close();
+ }
+ catch (IOException e)
+ {
+ Debug.debug(e);
+ }
+ try
+ {
+ if (bos != null)
+ bos.close();
+ }
+ catch (IOException e)
+ {
+ Debug.debug(e);
+ }
+ }
+ }
+
+ }
+
}