java图片缩放与裁剪

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java图片缩放与裁剪相关的知识,希望对你有一定的参考价值。

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;

import com.alibaba.druid.util.StringUtils;
import com.jfinal.kit.StrKit;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import java.awt.image.BufferedImage;
import java.rmi.registry.Registry;

@SuppressWarnings("restriction")
public class ImageKit {
    private  final static  String[] imgExts=new String[]{"jpg", "jpeg", "png", "bmp"};

    public static  String getExtName(String fileName){
        if(StringUtils.isEmpty(fileName)) return null;
        int idx=fileName.lastIndexOf(‘.‘);
        if(idx!=-1&&(idx+1)<fileName.length()){
            return fileName.substring(idx+1);
        }else{
            return null;
        }
    }
    //通过文件扩展名,是否为支持的图片文件
    public static boolean isImageExtName(String fileName){
        if(StrKit.isBlank(fileName)){
            return false;
        }
        fileName=fileName.trim().toLowerCase();
        String ext=getExtName(fileName);
        if(StringUtils.isEmpty(ext)) return false;
        for (String str:imgExts){
            if(str.equals(ext)){
                return true;
            }
        }
        return false;
    }

    public static  final boolean notImageExtName(String fileName){
        return !isImageExtName(fileName);
    }
    public static BufferedImage loadImageFils(String sourceImageFileName){
        if(notImageExtName(sourceImageFileName)){
            throw new IllegalArgumentException("只支持如下几种类型的图像文件:jpg、jpeg、png、bmp");
        }
        File sourceImageFile=new File(sourceImageFileName);
        if(!sourceImageFile.exists()||!sourceImageFile.isFile()){
            throw new IllegalArgumentException("文件不存在");
        }
        try {
            return ImageIO.read(sourceImageFile);
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }

    public  static  void zoom(int maxWidth,File srcFile,String saveFile){
        float quality=0.8f;
        try {
            BufferedImage srcImage = ImageIO.read(srcFile);
            int srcWidth = srcImage.getWidth();
            int srcHeight = srcImage.getHeight();
            if(srcWidth<=maxWidth){
                saveWithQuality(srcImage, quality, saveFile);
            }else {
                float scalingRatio=(float) maxWidth/(float)srcWidth;
                float maxHeight = ((float)srcHeight * scalingRatio);
                BufferedImage ret=resize(srcImage,maxWidth,(int) maxHeight);
                saveWithQuality(ret, quality, saveFile);
            }
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static  BufferedImage crop(String sourceImageFile,int left, int top, int width, int height){
        if (notImageExtName(sourceImageFile)) {
            throw new IllegalArgumentException("只支持如下几种类型的图像文件:jpg、jpeg、png、bmp");
        }
        try {
              BufferedImage bi= ImageIO.read(new File(sourceImageFile));
              width = Math.min(width, bi.getWidth());
              height = Math.min(height, bi.getHeight());
              if(width <= 0) width = bi.getWidth();
              if(height <= 0) height = bi.getHeight();

              left = Math.min(Math.max(0, left), bi.getWidth() - width);
              top = Math.min(Math.max(0, top), bi.getHeight() - height);

              return bi.getSubimage(left,top,width,height);
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }

    public static  void save(BufferedImage bi,String outputImageFile){
        FileOutputStream newImage=null;
        try {
            ImageIO.write(bi,getExtName(outputImageFile),new File(outputImageFile));
        } catch(Exception e){
            throw new RuntimeException(e);
        } finally {
            if(newImage!=null){
                try {
                    newImage.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

    public static BufferedImage resize(BufferedImage bi, int toWidth, int toHeight) {
           Graphics g=null;
           try {
               Image scaledImage = bi.getScaledInstance(toWidth, toHeight, Image.SCALE_SMOOTH);
               BufferedImage ret = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB);
               g = ret.getGraphics();
               g.drawImage(scaledImage, 0, 0, null);
               return ret;
           } catch (Exception e) {
               throw new RuntimeException(e);
           } finally {
               if (g != null) {
                   g.dispose();
               }
           }
    }

    public static  void saveWithQuality(BufferedImage im, float quality, String outputImageFile){
        FileOutputStream   newImage = null;
        try {
            newImage = new FileOutputStream(outputImageFile);
            JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(newImage);
            JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(im);
            jep.setQuality(quality, true);
            encoder.encode(im, jep);
        }catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            if (newImage != null) {
                try {newImage.close();} catch (IOException e) {throw new RuntimeException(e);}
            }
        }
    }

}

  

以上是关于java图片缩放与裁剪的主要内容,如果未能解决你的问题,请参考以下文章

Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理

.NetCore实现图片缩放与裁剪 - 基于ImageSharp

android 怎么裁剪drawable

php图片上传类(支持缩放裁剪图片缩略功能)

图像缩放、滚动视图、裁剪

C#图片处理示例(裁剪,缩放,清晰度,水印)