/** * BufferedImageサポート関数 */ package jp.crwdev.app; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.stream.ImageOutputStream; import com.sun.image.codec.jpeg.ImageFormatException; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageDecoder; public class BufferedImageIO { private static final List<String> SUPPORT_PREFIX = new ArrayList<String>(); static{ SUPPORT_PREFIX.add("jpg"); SUPPORT_PREFIX.add("png"); SUPPORT_PREFIX.add("gif"); } public static synchronized BufferedImage read(InputStream stream, boolean isJpeg){ if(isJpeg){ JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(stream); try { return prepareBufferedImage(decoder.decodeAsBufferedImage()); } catch (ImageFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } else{ try { return prepareBufferedImage(ImageIO.read(stream)); } catch (IOException e) { e.printStackTrace(); } } return null; } public static BufferedImage prepareBufferedImage(BufferedImage image){ int type = image.getType(); if(type == BufferedImage.TYPE_BYTE_INDEXED || type == BufferedImage.TYPE_BYTE_GRAY || type == BufferedImage.TYPE_BYTE_BINARY || type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_CUSTOM){ BufferedImage dest = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); Graphics2D g = dest.createGraphics(); g.drawImage(image, 0, 0, null); g.dispose(); image = null; return dest; } return image; } public static BufferedImage copyBufferedImage(BufferedImage image){ BufferedImage dest = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); Graphics2D g = dest.createGraphics(); g.drawImage(image, 0, 0, null); g.dispose(); return dest; } public static boolean write(BufferedImage image, String format, float quality, OutputStream out){ Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(format); if (writers.hasNext()) { try { ImageWriter writer = writers.next(); ImageOutputStream stream = ImageIO.createImageOutputStream(out); writer.setOutput(stream); ImageWriteParam param = writer.getDefaultWriteParam(); if (param.canWriteCompressed()) { param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(quality); } else { System.out.println("Compression is not supported."); } writer.write(null, new IIOImage(image, null, null), param); writer.dispose(); return true; }catch(IOException e){ e.printStackTrace(); } } return false; } public static boolean isSupport(String suffix){ return SUPPORT_PREFIX.contains(suffix.toLowerCase()); } }