/**
* 画像ファイル情報基本データクラス
*/
package jp.crwdev.app.container;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import jp.crwdev.app.imagefilter.ImageFilterParam;
import jp.crwdev.app.interfaces.IImageFileInfo;
public abstract class ImageFileInfoBase implements IImageFileInfo {
/** 個別フィルタパラメータ */
protected ImageFilterParam mPrivateFilter = new ImageFilterParam();
/** 画像フォーマット */
protected String mFormat;
/** 画像幅 */
protected int mWidth;
/** 画像高さ */
protected int mHeight;
/** 画像サイズ */
protected long mSize;
/** TOCテキスト */
protected String mTocText = null;
/** 編集フラグ */
private boolean mIsModify = false;
/** 有効フラグ */
protected boolean mIsEnable = true;
/** ソート用テキスト */
protected String mSortText;
/** 並び順(ソート無効時) */
protected int mSortOrder = -1;
/**
* 基本データの読み込み
* @throws Exception getFullPath(),getInputStream()の実装必須
*/
protected void loadBasicParams() throws Exception{
String suffix = getSuffix(getFullPath());
mFormat = getFormat(suffix);
mSize = 0;
mWidth = 0;
mHeight = 0;
// Iterator readers = ImageIO.getImageReadersBySuffix(suffix);
// if (readers.hasNext()) {
// ImageReader reader = (ImageReader)readers.next();
// try {
// //InputStream in = getInputStream();
// //ImageInputStream stream = ImageIO.createImageInputStream(in);
// //reader.setInput(stream);
// mFormat = getFormat(suffix);
// //mWidth = reader.getWidth(0);
// //mHeight = reader.getHeight(0);
// mSize = 0;//in.available();//stream.length();
// //} catch (IOException e) {
// // throw e;
// } finally {
// reader.dispose();
// }
// }
// else{
// throw new Exception("No image");
// }
}
@Override
public String getSortString(){
if(mSortText == null){
String regex = "(\\d+)";
Pattern p = Pattern.compile(regex);
String filename = getFileName();
Matcher m = p.matcher(filename);
if(m.find()){
String value = m.group();
try{
value = String.format("%05d", Integer.parseInt(value));
}catch(Exception e){
}
String result = m.replaceFirst(value);
mSortText = result;
}
else{
mSortText = filename;
}
}
return mSortText;
}
@Override
public ImageFilterParam getFilterParam(){
return mPrivateFilter;
}
@Override
public void setFilterParam(ImageFilterParam param){
mPrivateFilter = param;
}
@Override
public String getFormat(){
return mFormat;
}
@Override
public int getWidth(){
return mWidth;
}
@Override
public int getHeight(){
return mHeight;
}
@Override
public long getSize(){
return mSize;
}
@Override
public boolean isJpeg() {
return "jpeg".equals(mFormat);
}
@Override
public void update() {
if(mWidth != 0 && mHeight != 0){
// 読み込み済み
return;
}
String suffix = getSuffix(getFullPath());
Iterator<ImageReader> readers = ImageIO.getImageReadersBySuffix(suffix);
if (readers.hasNext()) {
ImageReader reader = readers.next();
try {
InputStream in = getInputStream();
ImageInputStream stream = ImageIO.createImageInputStream(in);
reader.setInput(stream);
//mFormat = getFormat(suffix);
mWidth = reader.getWidth(0);
mHeight = reader.getHeight(0);
//mSize = 0;//in.available();//stream.length();
} catch (IOException e) {
} finally {
reader.dispose();
}
}
}
@Override
public BufferedImage getImage(boolean preview){
return null;
}
@Override
public void setTocText(String text){
mTocText = text;
}
@Override
public String getTocText(){
return mTocText;
}
@Override
public void setEnable(boolean enable){
mIsEnable = enable;
}
@Override
public boolean isEnable(){
return mIsEnable;
}
@Override
public void setModify(boolean modify){
mIsModify = modify;
}
@Override
public boolean isModify(){
return mIsModify || (mTocText != null && mTocText.length() > 0);
}
@Override
public void setSortOrder(int order){
mSortOrder = order;
}
@Override
public boolean isBlankPage(){
return false;
}
@Override
public int getSortOrder(){
return mSortOrder;
}
/**
* ファイル名から拡張子を取得
* @param fileName
* @return "."を含まない拡張子。拡張子が無い場合は入力をそのまま返す
*/
protected static String getSuffix(String fileName) {
if (fileName == null)
return null;
fileName = fileName.toLowerCase();
int point = fileName.lastIndexOf(".");
if (point != -1) {
return fileName.substring(point + 1);
}
return fileName;
}
/**
* 拡張子からフォーマットを取得
* @param suffix
* @return "jpeg" or "png" or "gif"
*/
protected static String getFormat(String suffix){
if(suffix.equalsIgnoreCase("jpg")){
return "jpeg";
}
else if(suffix.equalsIgnoreCase("png")){
return "png";
}
else if(suffix.equalsIgnoreCase("gif")){
return "gif";
}
return "jpeg";
}
}