Author: lryan
Date: Wed Mar 18 07:01:04 2009
New Revision: 755492

URL: http://svn.apache.org/viewvc?rev=755492&view=rev
Log:
Bug in VM for JPEG image output of RGBA colorspace images caused them to be 
output as CMYK. Force opaque JPEG images to RGB colorspace to fix.

Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java?rev=755492&r1=755491&r2=755492&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/PNGOptimizer.java
 Wed Mar 18 07:01:04 2009
@@ -80,12 +80,21 @@
       if (isOpaque) {
         byte[] lastBytes = minBytes;
         int prevReductionPct = reductionPct;
+
+        // Workaround for bug in JPEG image writer
+        // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6444933
+        // Writer seems to think color space is CMYK and not RGBA. In this
+        // case the image is fully opaque so we can just down-convert to just 
RGB.
+        BufferedImage rgbOnlyImage = new 
BufferedImage(bufferedImage.getWidth(),
+            bufferedImage.getHeight(),
+            BufferedImage.TYPE_INT_RGB);
+        rgbOnlyImage.getGraphics().drawImage(bufferedImage, 0, 0, null);
         ImageWriter writer = 
ImageIO.getImageWritersByFormatName("jpeg").next();
         ImageWriteParam param = writer.getDefaultWriteParam();
         param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
         param.setCompressionQuality(config.getJpegCompression());
         outputter = new ImageIOOutputter(writer, param);
-        write(bufferedImage);
+        write(rgbOnlyImage);
         // Only use JPEG if it offers a significant reduction over other 
methods
         if (reductionPct > prevReductionPct + 20) {
           useJpeg = true;


Reply via email to