/** * 画像ファイルWriter for Zip */ package jp.crwdev.app.container.zip; import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import jp.crwdev.app.BufferedImageIO; import jp.crwdev.app.constant.Constant; import jp.crwdev.app.interfaces.IImageFileInfo; import jp.crwdev.app.interfaces.IImageFileInfoList; import jp.crwdev.app.interfaces.IImageFileWriter; import jp.crwdev.app.interfaces.IImageFilter; public class ZipImageFileWriter implements IImageFileWriter { /** 出力先Zipファイル */ private File mOutputZipFile = null; /** 画像フィルタ */ private IImageFilter mBaseFilter = null; /** 圧縮率(0-10) */ private int mCompressLevel = 0; /** 処理中断フラグ */ private boolean mIsCancel = false; /** * コンストラクタ */ public ZipImageFileWriter(){ } /** * コンストラクタ * @param filter 画像フィルタ */ public ZipImageFileWriter(IImageFilter filter){ setImageFilter(filter); } /** * 圧縮レベル設定 * @param level - the compression level (0-9) */ public void setCompressLevel(int level){ if(level < 0){ level = 0; } if(level > 9){ level = 9; } mCompressLevel = level; } @Override public void setImageFilter(IImageFilter filter){ mBaseFilter = filter; } @Override public boolean open(String filepath) { File file = new File(filepath); if(file.exists()){ if(!file.delete()){ return false; } } mOutputZipFile = file; return true; } @Override public boolean write(IImageFileInfoList list, OnProgressListener listener) { if(list == null && mOutputZipFile != null){ return false; } mIsCancel = false; if(listener != null){ listener.onProgress(0, null); } ZipOutputStream zipOut = null;; try { zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(mOutputZipFile))); zipOut.setLevel(mCompressLevel); int size = list.size(); float progressOffset = 100 / (float)size; for(int i=0; i<size; i++){ if(mIsCancel){ return false; } IImageFileInfo info = list.get(i); BufferedImage image = null; synchronized(info){ if(!info.isEnable()){ continue; } InputStream in = info.getInputStream(); if(in != null){ image = BufferedImageIO.read(in, info.isJpeg()); } else{ image = info.getImage(false); } if(mBaseFilter != null){ image = mBaseFilter.filter(image, info.getFilterParam()); } } String filename = String.format("P%04d.jpg", i); zipOut.putNextEntry(new ZipEntry(filename)); BufferedImageIO.write(image, "jpeg", Constant.jpegQuality, zipOut); zipOut.flush(); zipOut.closeEntry(); if(listener != null){ listener.onProgress((int)((i+1)*progressOffset), null); } } } catch (Exception e) { e.printStackTrace(); return false; } finally{ try { if(zipOut != null){ zipOut.close(); zipOut = null; } } catch (IOException e) { e.printStackTrace(); return false; } } return true; } @Override public void close() { if(mIsCancel){ if(mOutputZipFile != null){ if(mOutputZipFile.exists()){ mOutputZipFile.delete(); } } } if(mOutputZipFile != null){ mOutputZipFile = null; } } @Override public void cancel() { mIsCancel = true; } @Override public String getSuffix(){ return ".zip"; } }