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图片缩放与裁剪的更多相关文章

  1. java图片缩放

    package com.rubekid.springmvc.utils; import java.awt.AlphaComposite; import java.awt.Graphics2D; imp ...

  2. php使用imagick模块实现图片缩放、裁剪、压缩示例

    PHP 使用Imagick模块 缩放,裁剪,压缩图片 包括gif图片 缩放 裁剪 复制代码代码如下: /**  * 图片裁剪  * 裁剪规则:  *   1. 高度为空或为零   按宽度缩放 高度自适 ...

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

    前言 (突然发现断更有段时间了 最近在做博客的时候,需要实现一个类似Lorempixel.LoremPicsum这样的随机图片功能,图片有了,还需要一个根据输入的宽度高度获取图片的功能,由于之前处理图 ...

  4. java 图片缩放

    使用java自带的图片处理api,也可以使用(GraphicsMagick + im4j) import java.awt.Image; import java.awt.image.BufferedI ...

  5. java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。

    java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...

  6. 用Js+css3实现图片旋转,缩放,裁剪,滤镜

    还是前端图片的老话题,花了半天时间,东拼西凑,凑出个demo,优点在于代码少,核心代码就6行,目前刚做了旋转,缩放,裁剪,滤镜要js做,网络上也有现成的代码, 但是想做到自定义的滤镜咋办呢?这还要从底 ...

  7. java 图片裁剪

    图片裁剪功能,我一直以为是前端那边去做,后台不用做过多的考虑,现在我发现,前端去做裁剪好像不是太理想,我在这里简单地介绍一下我们大java的裁剪功能 前端只需要上传,x (x轴),y(y轴) , h( ...

  8. PHP图片裁剪_图片缩放_PHP生成缩略图

    在制作网页过程中,为了排版整齐美观,对网页中的图片处理成固定大小尺寸的图片,或是要截去图片边角中含有水印的图片,对于图片量多,每天更新大量图,靠人工PS处理是不现实的,那么有没有自动处理图片的程序了! ...

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

    C#图片处理示例(裁剪,缩放,清晰度,水印) 吴剑 2011-02-20 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的一些应用,比 ...

随机推荐

  1. [BZOJ 3992] [SDOI 2015] 序列统计

    Description 传送门 Solution [一] 设 \(f[i][j]\) 表示前 \(i\) 个数的乘积在模 \(p\) 意义下等于 \(j\) 的方案数,有 \[ f[i][j]=\su ...

  2. 【LOJ6067】【2017 山东一轮集训 Day3】第三题 FFT

    [LOJ6067][2017 山东一轮集训 Day3]第三题 FFT 题目大意 给你 \(n,b,c,d,e,a_0,a_1,\ldots,a_{n-1}\),定义 \[ \begin{align} ...

  3. 2.5 time 模块

  4. [bilibili]弹幕屏蔽列表

    <filters> <item enabled="true">t=定单身</item> <item enabled="true& ...

  5. Luogu P3227 [HNOI2013]切糕 最小割

    首先推荐一个写的很好的题解,个人水平有限只能写流水账,还请见谅. 经典的最小割模型,很多人都说这个题是水题,但我还是被卡了=_= 技巧:加边表示限制 在没有距离\(<=d\)的限制时候,我们对每 ...

  6. python中的装饰器迭代器生成器

    装饰器: 定义:本质是函数(装饰其它函数) 为其它函数添加附加功能 原则: 1 不能修改被装饰函数源代码    2 不修改被装饰函数调用方式 实现装饰器知识储备: 1 函数即‘’变量‘’ 2 高阶函数 ...

  7. 第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍

    一. 原生态接口 1. 从默认路由开始分析 在WebApiConfig.cs类中的Register方法中,我们可以看到默认路由如下: 分析:请求地址在 controller 前面需要加上 api/,c ...

  8. 使用Maven插件构建Spring Boot应用程序镜像

    使用Maven插件构建Spring Boot应用程序的Docker镜像. 环境准备 1.Linux系统 2.安装JDK,Maven 3.安装Docker 应用实践 1.在应用程序根目录下添加Docke ...

  9. C++-int类型整数超出范围后的处理

    最近做了一道题目: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: ...

  10. Design Principles and Design Patterns

    设计原则解读. 设计原则是对设计模式的约束性要求,属于设计中基本的四项特征,不符合此四项特征的设计,不具有生命力. 设计模式也是在此四项设计原则上的具体化实例化衍生物. Martin原文: http: ...