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);
+				}
+			}
+		}
+
+	}
+
 }