Author: lryan
Date: Mon Mar 9 18:09:06 2009
New Revision: 751782
URL: http://svn.apache.org/viewvc?rev=751782&view=rev
Log:
Move image reading to optimizing class associated with image type.
Clarify failure mode for reading ICC profiles from JPEG's. Dont rely on
Sanselan brittle exception for this case.
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java
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/BMPOptimizer.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java?rev=751782&r1=751781&r2=751782&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BMPOptimizer.java
Mon Mar 9 18:09:06 2009
@@ -17,19 +17,26 @@
*/
package org.apache.shindig.gadgets.rewrite.image;
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.Sanselan;
import org.apache.shindig.gadgets.http.HttpResponse;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.InputStream;
/**
* Optimize BMP by converting to PNG
*/
public class BMPOptimizer extends PNGOptimizer {
+ public static BufferedImage readBmp(InputStream is)
+ throws ImageReadException, IOException {
+ return Sanselan.getBufferedImage(is);
+ }
+
public BMPOptimizer(OptimizerConfig config, HttpResponse original)
throws IOException {
super(config, original);
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java?rev=751782&r1=751781&r2=751782&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/BasicImageRewriter.java
Mon Mar 9 18:09:06 2009
@@ -36,8 +36,6 @@
import java.util.logging.Level;
import java.util.logging.Logger;
-import javax.imageio.ImageIO;
-
/**
* Rewrite images to more efficiently compress their content. Can rewrite
images
* from one format to another for better efficiency.
@@ -187,22 +185,18 @@
// image reading mechanisms
protected BufferedImage readBmp(HttpResponse response) throws
ImageReadException, IOException {
- return Sanselan.getBufferedImage(response.getResponse());
+ return BMPOptimizer.readBmp(response.getResponse());
}
protected BufferedImage readPng(HttpResponse response) throws
ImageReadException, IOException {
- return Sanselan.getBufferedImage(response.getResponse());
+ return PNGOptimizer.readPng(response.getResponse());
}
protected BufferedImage readGif(HttpResponse response) throws
ImageReadException, IOException {
- return Sanselan.getBufferedImage(response.getResponse());
+ return GIFOptimizer.readGif(response.getResponse());
}
protected BufferedImage readJpeg(HttpResponse response) throws
ImageReadException, IOException {
- // We cant use Sanselan to read JPEG but we can use it to read all the
metadata which is
- // where most security issues reside anyway in ImageIO
- Sanselan.getMetadata(response.getResponse(), null);
- Sanselan.getICCProfile(response.getResponse(), null);
- return ImageIO.read(response.getResponse());
+ return JPEGOptimizer.readJpeg(response.getResponse());
}
}
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java?rev=751782&r1=751781&r2=751782&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/GIFOptimizer.java
Mon Mar 9 18:09:06 2009
@@ -17,18 +17,25 @@
*/
package org.apache.shindig.gadgets.rewrite.image;
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.Sanselan;
import org.apache.shindig.gadgets.http.HttpResponse;
+import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
-
-import javax.imageio.ImageIO;
+import java.io.InputStream;
/**
* Optimize GIF images by converting them to PNGs or even JPEGs depending on
content
*/
public class GIFOptimizer extends PNGOptimizer {
+ public static BufferedImage readGif(InputStream is)
+ throws ImageReadException, IOException {
+ return Sanselan.getBufferedImage(is);
+ }
+
private boolean usePng;
public GIFOptimizer(OptimizerConfig config, HttpResponse original)
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java?rev=751782&r1=751781&r2=751782&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/image/JPEGOptimizer.java
Mon Mar 9 18:09:06 2009
@@ -17,11 +17,17 @@
*/
package org.apache.shindig.gadgets.rewrite.image;
+import org.apache.commons.io.IOUtils;
import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.Sanselan;
import org.apache.shindig.gadgets.http.HttpResponse;
+import javax.imageio.ImageIO;
+import java.awt.color.ICC_Profile;
import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
+import java.io.InputStream;
/**
* Optimize JPEG images by either converting them to PNGs or re-encoding them
with a more
@@ -29,6 +35,22 @@
*/
public class JPEGOptimizer extends BaseOptimizer {
+ public static BufferedImage readJpeg(InputStream is)
+ throws ImageReadException, IOException {
+ byte[] bytes = IOUtils.toByteArray(is);
+ // We cant use Sanselan to read JPEG but we can use it to read all the
metadata which is
+ // where most security issues reside anyway in ImageIO
+ Sanselan.getMetadata(bytes, null);
+ byte[] iccBytes = Sanselan.getICCProfileBytes(bytes);
+ if (iccBytes != null && iccBytes.length > 0) {
+ ICC_Profile iccProfile = Sanselan.getICCProfile(bytes, null);
+ if (iccProfile == null) {
+ throw new ImageReadException("Image has ICC but it is corrupt and
cannot be read");
+ }
+ }
+ return ImageIO.read(new ByteArrayInputStream(bytes));
+ }
+
private boolean usePng;
public JPEGOptimizer(OptimizerConfig config, HttpResponse original)
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=751782&r1=751781&r2=751782&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
Mon Mar 9 18:09:06 2009
@@ -17,21 +17,28 @@
*/
package org.apache.shindig.gadgets.rewrite.image;
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.Sanselan;
import org.apache.shindig.gadgets.http.HttpResponse;
-import java.awt.image.BufferedImage;
-import java.awt.image.ColorModel;
-import java.io.IOException;
-
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.io.IOException;
+import java.io.InputStream;
/**
* Optimize a PNG image and possibly convert it to a JPEG.
*/
class PNGOptimizer extends BaseOptimizer {
+ public static BufferedImage readPng(InputStream is)
+ throws ImageReadException, IOException {
+ return Sanselan.getBufferedImage(is);
+ }
+
private boolean useJpeg;
public PNGOptimizer(OptimizerConfig config, HttpResponse original)