java 根据坐标和宽高对图片做剪切

Wesley13
• 阅读 630
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

import com.lg.res.bean.common.FileData;




public class ImageTailorUtil {

    
    private static String DEFAULT_THUMB_PREVFIX = "thumb_";
    private static String DEFAULT_CUT_PREVFIX = "cut_";
    private static Boolean DEFAULT_FORCE = false;
    
    
    /**
    
     * @param srcImg    源图片
     * @param output    图片输出流
     * @param rect      需要截取部分的坐标和大小
     */
    public boolean cutImage(File srcImg, OutputStream output, Rectangle rect){
        if(srcImg.exists()){
            FileInputStream fis = null;
            ImageInputStream iis = null;
            try {
                fis = new FileInputStream(srcImg);
                // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
                String types = Arrays.toString(ImageIO.getReaderFormatNames()).replace("]", ",");
                String suffix = null;
                // 获取图片后缀
                if(srcImg.getName().indexOf(".") > -1) {
                    suffix = srcImg.getName().substring(srcImg.getName().lastIndexOf(".") + 1);
                }// 类型和图片后缀全部小写,然后判断后缀是否合法
                if(suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()+",") < 0){
                    System.out.println("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);
                    return false;
                }
                // 将FileInputStream 转换为ImageInputStream
                iis = ImageIO.createImageInputStream(fis);
                // 根据图片类型获取该种类型的ImageReader
                ImageReader reader = ImageIO.getImageReadersBySuffix(suffix).next();
                reader.setInput(iis,true);
                ImageReadParam param = reader.getDefaultReadParam();
                param.setSourceRegion(rect);
                BufferedImage bi = reader.read(0, param);
                ImageIO.write(bi, suffix, output);
                return true;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(fis != null) fis.close();
                    if(iis != null) iis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }else {
            System.out.println("the src image is not exist.");
        }
        return false;
    }
    
    public void cutImage(File srcImg, OutputStream output, int x, int y, int width, int height){
        cutImage(srcImg, output, new Rectangle(x, y, width, height));
    }
    
    public FileData cutImage(File srcImg, String destImgPath, Rectangle rect){
        FileData fd = new FileData();
        String middledir = "cut_pic/"+SimpleDate.getCurDateLong();//中间路径
        File destImg = new File(destImgPath+"/"+middledir);
        if(!destImg.exists()){
            System.out.println("the dest "+destImgPath+"  folder is not exist.");
            destImg.mkdirs();
            System.out.println("create "+destImgPath+" folder ");
        }
        String cutFolderPath = destImg.getPath();
        try {
            
            if(!destImg.isDirectory()) cutFolderPath = destImg.getParent();
            if(!cutFolderPath.endsWith(File.separator)) cutFolderPath = cutFolderPath + File.separator;
            String fileName = srcImg.getName();
            String suffix = fileName.substring(fileName.lastIndexOf("."));
            String newfileName = DEFAULT_CUT_PREVFIX + "_" + new Date().getTime() + suffix;
            String outPutFilePath =cutFolderPath+ newfileName;
            System.out.println(outPutFilePath);
            boolean b = cutImage(srcImg, new FileOutputStream(outPutFilePath), rect);
            if (b) {
                fd.setTailorPicPath(middledir+"/"+newfileName);
                return fd;
            }
        } catch (FileNotFoundException e) {
            System.out.println("the dest "+destImgPath+"  is not exist.");
        }
        return null;
    }
    /**
     * 
     * @param srcImg  原图片
     * @param destImg 存放新生成的图片的文件夹路径
     * @param x    左上角 x轴坐标
     * @param y    左上角 y轴坐标
     * @param width 宽
     * @param height 高
     */
    public FileData cutImage(File srcImg, String destImg, int x, int y, int width, int height){
        if (!srcImg.exists()) {
            return null;
        }
        return cutImage(srcImg, destImg, new Rectangle(x, y, width, height));
    }
    /**
     * 
     * @param srcImg  原图片
     * @param destImg 存放新生成的图片的文件夹路径
     * @param x    左上角 x轴坐标
     * @param y    左上角 y轴坐标
     * @param width 宽
     * @param height 高
     */
    public FileData cutImage(String srcImg, String destImg, int x, int y, int width, int height){
        return cutImage(new File(srcImg), destImg, new Rectangle(x, y, width, height));
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
Wesley13 Wesley13
3年前
java游戏开发杂谈
在Eclipse里,编写如下两个类:packagegame2;importjava.awt.Color;importjava.awt.Graphics;importjavax.swing.JPanel;/java游戏开发杂谈demo2:画
Wesley13 Wesley13
3年前
java验证码
packagecn.edu.pdsu.action;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.image.BufferedImage;importjava.uti
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
CentOS6.7 i686上安装JDK7
内核版本:root@heima01javaunameaLinuxheima012.6.32573.el6.i6861SMPThuJul2312:37:35UTC2015i686i686i386GNU/Linux发行版本:root@heima01java
Wesley13 Wesley13
3年前
35岁,真的是程序员的一道坎吗?
“程序员35岁是道坎”,“程序员35岁被裁”……这些话咱们可能都听腻了,但每当触及还是会感到丝丝焦虑,毕竟每个人都会到35岁。而国内互联网环境确实对35岁以上的程序员不太友好:薪资要得高,却不如年轻人加班猛;虽说经验丰富,但大部分公司并不需要太资深的程序员。但35岁危机并不是不可避免的,比如你可以不断精进技术,将来做技术管理或者
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
暗箭伤人 暗箭伤人
1年前
【www.ithunter.club】 20230922下午
不容易的2023年,我们一起努力【www.ithunter.club】(2023092208:00:00.8872062023092216:00:00.887206)1.人事招聘专员数名(可选远程或入职)2.招聘向坐标东京Yahoo、Shift、L