/**
* 画像ファイルWriter for Folder
*/
package jp.crwdev.app.container.folder;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
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 FolderImageFileWriter implements IImageFileWriter {
/** 出力先フォルダ */
private File mOutputFolder = null;
/** 画像フィルタ */
private IImageFilter mBaseFilter = null;
/** 処理中断フラグ */
private boolean mIsCancel = false;
/**
* コンストラクタ
*/
public FolderImageFileWriter(){
}
/**
* コンストラクタ
* @param filter 画像フィルタ
*/
public FolderImageFileWriter(IImageFilter filter){
setImageFilter(filter);
}
@Override
public void setImageFilter(IImageFilter filter){
mBaseFilter = filter;
}
@Override
public boolean open(String filepath) {
File file = new File(filepath);
if(!file.exists()){
if(!file.mkdirs()){
return false;
}
}
if(!file.isDirectory()){
return false;
}
mOutputFolder = file;
return true;
}
@Override
public boolean write(IImageFileInfoList list, OnProgressListener listener) {
mIsCancel = false;
if(listener != null){
listener.onProgress(0, null);
}
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());
}
try {
if(in != null){
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
File file = new File(mOutputFolder, String.format("P%04d.jpg", i));
try {
FileOutputStream outStream = new FileOutputStream(file);
BufferedImageIO.write(image, "jpeg", Constant.jpegQuality, outStream);
outStream.flush();
outStream.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
if(listener != null){
listener.onProgress((int)((i+1)*progressOffset), null);
}
}
return true;
}
public boolean write(IImageFileInfo info) {
mIsCancel = false;
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());
}
try {
if(in != null){
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
String filename = getUniqueFileName(mOutputFolder);
if(filename == null){
return false;
}
File file = new File(filename);
try {
FileOutputStream outStream = new FileOutputStream(file);
BufferedImageIO.write(image, "jpeg", Constant.jpegQuality, outStream);
outStream.flush();
outStream.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
private String getUniqueFileName(File outputFolder){
try {
File tmpFile = File.createTempFile("image", ".jpg", outputFolder);
return tmpFile.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public void close() {
if(mIsCancel){
// NOP
}
}
@Override
public void cancel() {
mIsCancel = true;
}
@Override
public String getSuffix() {
return "";
}
}