Package com.liusoft.dlog4j.util

Source Code of com.liusoft.dlog4j.util.ImageUtils

/*
*  ImageUtils.java
*  This program is free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU Library General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program; if not, write to the Free Software
*  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*  Author: Winter Lau (javayou@gmail.com)
*  http://dlog4j.sourceforge.net
*/
package com.liusoft.dlog4j.util;

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.upload.FormFile;

import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.ExifDirectory;
import com.gif4j.GifDecoder;
import com.gif4j.GifEncoder;
import com.gif4j.GifImage;
import com.gif4j.GifTransformer;
import com.liusoft.dlog4j.photo.FileSystemSaver;
import com.liusoft.dlog4j.photo.Photo;

/**
* ͼ��������
* TODO: ������ͼ�󾭹������ʧEXIF�����⡣
* @author liudong
*/
public class ImageUtils {
 
  private static Log log = LogFactory.getLog(FileSystemSaver.class);

  /**
   * ��������ͼ
   * @param orig_img
   * @param obj_filename
   * @param p_width
   * @param p_height
   * @throws IOException
   */
  public static String createPreviewImage(InputStream orig_img,
      String obj_filename, int p_width, int p_height) throws IOException {
    String extendName = StringUtils.getFileExtend(obj_filename)
        .toLowerCase();

    FileOutputStream newimage = null;
    InputStream fis = orig_img;
    try {
      if ("gif".equalsIgnoreCase(extendName)) {
        GifImage gifImage = GifDecoder.decode(fis);
        fis.close(); fis = null;
        GifImage newGif = GifTransformer.resize(gifImage, p_width,p_height, false);
        newimage = new FileOutputStream(obj_filename);
        GifEncoder.encode(newGif, newimage);
      } else {
        BufferedImage orig_portrait = (BufferedImage) ImageIO.read(fis);
        fis.close(); fis = null;
        // ͳһת��JPG��ʽ
        BufferedImage bi = new BufferedImage(p_width, p_height,BufferedImage.TYPE_INT_RGB);
        bi.getGraphics().drawImage(orig_portrait, 0, 0, p_width,p_height, null);
        if(!obj_filename.endsWith(".jpg"))
          obj_filename += ".jpg";
        newimage = new FileOutputStream(obj_filename);
        ImageIO.write(bi, "jpg", newimage);
      }
    } finally {
      if (newimage != null)
        newimage.close();
      if (fis != null)
        fis.close();
    }
    return obj_filename;
  }
 
  /**
   * ���ϴ���ͼƬ���浽������
   * @param imgFile
   * @param origionalPath
   * @throws IOException
   */
  public static void writeToFile(FormFile imgFile, String origionalPath) throws IOException{
    //�����ϴ����ļ�
    FileOutputStream oldimage = null;
    InputStream fin = null;
    byte[] data = new byte[8192];
    try {
      fin = imgFile.getInputStream();
      oldimage=new FileOutputStream(origionalPath);
      do{
        int rc = fin.read(data);
        if(rc == -1)
          break;
        oldimage.write(data, 0, rc);
        if(rc < data.length)
          break;
      }while(true);
    }finally{
      data = null;
      if(oldimage!=null)
        oldimage.close();
      if(fin!=null)
        fin.close();
    }
  }
 
  /**
   * ��ԭ��Ƭ�ļ������Ͻ�����ת
   * @param img_fn
   * @param orient
   * @return
   * @throws IOException
   */
  public static boolean rotateImage(String img_fn, int orient) throws IOException{
    return rotateImage(img_fn, orient, img_fn);
  }
 
  /**
   * ������Ƭ���������Ƭ���з���У��
   * Ŀǰֻ֧�����ַ������ת
   * 3: 180��
   * 6: ˳ʱ����ת90��
   * 8: ˳ʱ����ת270�Ȼ�����ʱ����ת90��
   * @param img_fn
   * @param orient
   * @throws IOException
   */
  public static boolean rotateImage(String img_fn, int orient, String dest_fn) throws IOException{
    double radian = 0;
    switch(orient){
    case 3:
      radian = 180.0;
      break;
    case 6:
      radian = 90.0;
      break;
    case 8:
      radian = 270.0;
      break;
    default:
      return false;
    }
    BufferedImage old_img = (BufferedImage)ImageIO.read(new File(img_fn))
    int width = old_img.getWidth();
    int height = old_img.getHeight();
   
    BufferedImage new_img = new BufferedImage(height,width,BufferedImage.TYPE_INT_RGB);       
        Graphics2D g2d =new_img.createGraphics();
       
        AffineTransform origXform = g2d.getTransform();
        AffineTransform newXform = (AffineTransform)(origXform.clone());
        // center of rotation is center of the panel
        double xRot = 0;
        double yRot = 0;
    switch(orient){
    case 3:
      xRot = width/2.0;
      yRot = height/2.0;
    case 6:
          xRot = height/2.0;
          yRot = xRot;
      break;
    case 8:
          xRot = width/2.0;
          yRot = xRot;
          break;
        default:
          return false;
    }
        newXform.rotate(Math.toRadians(radian), xRot, yRot);

        g2d.setTransform(newXform);  
        // draw image centered in panel
        g2d.drawImage(old_img, 0, 0, null);
        // Reset to Original
        g2d.setTransform(origXform);

        FileOutputStream out = new FileOutputStream(dest_fn);
        try{
          ImageIO.write(new_img, "JPG", out);
        }finally{
          out.close();
        }
        return true;
  }

  /**
   * ���ͼƬ��EXIF��Ϣ
   * @param img_path
   * @param photo
   * @return �Ƿ���EXIF��Ϣ
   */
  public static boolean fillExifInfo(String img_path, Photo photo){
    //Reading EXIF
    try {
      Metadata metadata = JpegMetadataReader.readMetadata(new File(img_path));
      if(!metadata.containsDirectory(ExifDirectory.class))
        return false;
      Directory exif = metadata.getDirectory(ExifDirectory.class);
      if(exif!=null){
        if(exif.containsTag(ExifDirectory.TAG_ORIENTATION))
          photo.setOrientation(exif.getInt(ExifDirectory.TAG_ORIENTATION));
        if(exif.containsTag(ExifDirectory.TAG_MAKE))
          photo.setManufacturer(exif.getString(ExifDirectory.TAG_MAKE));
        if(exif.containsTag(ExifDirectory.TAG_MODEL))
          photo.setModel(exif.getString(ExifDirectory.TAG_MODEL));
        if(exif.containsTag(ExifDirectory.TAG_APERTURE))
          photo.setAperture(exif.getDescription(ExifDirectory.TAG_APERTURE));
        if(exif.containsTag(ExifDirectory.TAG_COLOR_SPACE))
          photo.setColorSpace(exif.getDescription(ExifDirectory.TAG_COLOR_SPACE));
        if(exif.containsTag(ExifDirectory.TAG_EXPOSURE_BIAS))
          photo.setExposureBias(exif.getDescription(ExifDirectory.TAG_EXPOSURE_BIAS));
        if(exif.containsTag(ExifDirectory.TAG_FOCAL_LENGTH))
          photo.setFocalLength(exif.getDescription(ExifDirectory.TAG_FOCAL_LENGTH));
        if(exif.containsTag(ExifDirectory.TAG_ISO_EQUIVALENT))
          photo.setISO(exif.getInt(ExifDirectory.TAG_ISO_EQUIVALENT));
        if(exif.containsTag(ExifDirectory.TAG_SHUTTER_SPEED))
          photo.setShutter(exif.getDescription(ExifDirectory.TAG_SHUTTER_SPEED))
        if(exif.containsTag(ExifDirectory.TAG_EXPOSURE_TIME))
          photo.setExposureTime(exif.getDescription(ExifDirectory.TAG_EXPOSURE_TIME));
        return true;
      }
    } catch (Exception e) {
      log.error("Reading EXIF of "+img_path+" failed.", e);
    }
    return false;
  }

  /**
   * �ж��Ƿ�ΪͼƬ
   * @param extendName
   * @return
   */
  public static boolean isImage(String extendName){
    return "png".equalsIgnoreCase(extendName) ||
         "jpg".equalsIgnoreCase(extendName) ||
         "jpeg".equalsIgnoreCase(extendName)||
         "bmp".equalsIgnoreCase(extendName) ||
         "gif".equalsIgnoreCase(extendName);
  }
 
  /**
   * �ж��Ƿ�ΪJPGͼƬ
   * @param fn
   * @return
   */
  public static boolean isJPG(String fn){
    if(fn==null)
      return false;
    String s_fn = fn.toLowerCase();
    return s_fn.endsWith("jpg")||s_fn.endsWith("jpge");
  }

  /**
   * �ж��Ƿ�ΪJPGͼƬ
   * @param fn
   * @return
   */
  public static boolean isBMP(String fn){
    if(fn==null)
      return false;
    String s_fn = fn.toLowerCase();
    return s_fn.endsWith("bmp");
  }
 
  public static String BMP_TO_JPG(String imgPath) throws IOException{
    File fOrigionalImage = new File(imgPath);
    BufferedImage oldImage = (BufferedImage)ImageIO.read(fOrigionalImage);
    String jpgName = imgPath+".jpg";
    FileOutputStream newimage = new FileOutputStream(jpgName);
    try{
      if(ImageIO.write(oldImage, "jpg", newimage))
        return jpgName;
    }finally{
      if(newimage!=null)
        newimage.close();
    }
    return null;
  }

}
TOP

Related Classes of com.liusoft.dlog4j.util.ImageUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.