`
wuzhihui001
  • 浏览: 19632 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

图片处理工具类(图片压缩与图片裁剪)

阅读更多
中作中由于需要对图片进行压缩和裁剪,因此参考网上的各种方法写了以下工具类

package com.qxgf.xyz0.utils;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.Kernel;
import java.io.File;

import javax.imageio.ImageIO;

/**
 * 图片处理工具类
 * @author Administrator
 * 
 */
public class ImgUtil {

	/**
	 * 图片压缩
	 * @param srcImgFile 原始图片文件
	 * @param toImgFile 压缩后保存的目标图片文件
	 */
	public static void compress(File srcImgFile, File toImgFile) {
		try {
			Image image = ImageIO.read(srcImgFile);
			int imageWidth = image.getWidth(null);
			int imageHeight = image.getHeight(null);
			float scale = 1.0f;
			if (imageWidth > 1280 || imageHeight > 1024) { //宽或高大于一定值,则进行尺寸上的压缩
				scale = getRatio(imageWidth, imageHeight, 1280, 1024);
			}
			imageWidth = (int) (scale * imageWidth);
			imageHeight = (int) (scale * imageHeight);

			image = image.getScaledInstance(imageWidth, imageHeight,Image.SCALE_AREA_AVERAGING);
			BufferedImage bufferedImage = new BufferedImage(imageWidth,imageHeight, BufferedImage.TYPE_INT_RGB);
			Graphics2D g2 = bufferedImage.createGraphics();

			g2.drawImage(image, 0, 0, imageWidth, imageHeight, Color.white,null);
			g2.dispose();

			// 以下代码用于提高图片清晰度
			float[] kernelData2 = { -0.125f, -0.125f, -0.125f, -0.125f, 2,-0.125f, -0.125f, -0.125f, -0.125f };
			Kernel kernel = new Kernel(3, 3, kernelData2);
			ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
			bufferedImage = cOp.filter(bufferedImage, null);

			ImageIO.write(bufferedImage, "jpeg", toImgFile);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("图片压缩失败....");
		}
	}

	/**
	 * 获取压缩比率值
	 * @param currWidth
	 * @param currHeight
	 * @param afterWidth
	 * @param afterHeight
	 * @return
	 */
	private static float getRatio(int currWidth, int currHeight,int afterWidth, int afterHeight) {
		float ratio = 1.0f;
		float widthRatio = (float) afterWidth / currWidth;
		float heightRatio = (float) afterHeight / currHeight;
		if (widthRatio < 1.0 || heightRatio < 1.0) {
			ratio = widthRatio <= heightRatio ? widthRatio : heightRatio;
		}
		return ratio;
	}

	/**
	 * 图片裁切
	 * @param srcImgFile 原始图片文件
	 * @param toImgFile 裁切后保存的目标文件
	 * @param imgCrop 裁剪参数对象实例
	 */
	public static void crop(File srcImgFile, File toImgFile, ImgCrop imgCrop) {
		try {
			BufferedImage srcBufferedImg = ImageIO.read(srcImgFile);
			int srcWidth = srcBufferedImg.getWidth();
			int srcHeight = srcBufferedImg.getHeight();
			//由于比率精确度原因,允许20像素的误差
			int cropImgTotalWidth = imgCrop.getX() + imgCrop.getWidth();
			int cropImgTotalHeight = imgCrop.getY() + imgCrop.getHeight();
			if (srcWidth >= cropImgTotalWidth-20 && srcHeight >= cropImgTotalHeight-20) {
				ImageFilter cropFilter = null;
				if(srcWidth < cropImgTotalWidth && srcHeight < cropImgTotalHeight) {//纠正X,Y误差
					cropFilter = new CropImageFilter(imgCrop.getX(),imgCrop.getY(), srcWidth-imgCrop.getX(), srcHeight-imgCrop.getY());
				}else if(srcWidth < cropImgTotalWidth) {//纠正X误差
					cropFilter = new CropImageFilter(imgCrop.getX(),imgCrop.getY(), srcWidth-imgCrop.getX(), imgCrop.getHeight());
				}else if(srcHeight < imgCrop.getHeight()) {//纠正Y误差
					cropFilter = new CropImageFilter(imgCrop.getX(),imgCrop.getY(), imgCrop.getWidth(), srcHeight-imgCrop.getY());
				}else {
					cropFilter = new CropImageFilter(imgCrop.getX(),imgCrop.getY(), imgCrop.getWidth(), imgCrop.getHeight());
				}
				Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(srcBufferedImg.getSource(),cropFilter));
				BufferedImage toBufferedImg = new BufferedImage(imgCrop.getWidth(), imgCrop.getHeight(),BufferedImage.TYPE_INT_RGB);
				Graphics g = toBufferedImg.getGraphics();
				g.drawImage(img, 0, 0, null);
				g.dispose();
				ImageIO.write(toBufferedImg,FunctionUtil.getFileSuffix(toImgFile.getName()),toImgFile);
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("图片裁剪失败....");
		}
	}

	/**
	 * 图片裁剪信息包装类
	 * @author Administrator
	 */
	public static class ImgCrop {
		private Integer x; //起点X坐标
		private Integer y; //起点Y坐标
		private Integer width;//宽度
		private Integer height;//高度
		private Float ratio = 1.0f; //参数比率(因为图片的裁剪可能并不是在原图大小上进行的)
		
		public ImgCrop() {}

		public ImgCrop(Integer x, Integer y, Integer width, Integer height, Float ratio) {
			this.x = x;
			this.y = y;
			this.width = width;
			this.height = height;
			this.ratio = ratio == null ? this.ratio : ratio;
		}

	

		public Integer getX() {
			//取最小整数,不可用四舍五入法,否则可能导致裁剪值超出范围
			return Math.round(ratio*x - 0.5f); 
		}

		public void setX(Integer x) {
			this.x = x;
		}

		public Integer getY() {
			//取最小整数,不可用四舍五入法,否则可能导致裁剪值超出范围
			return Math.round(ratio*y - 0.5f);
		}

		public void setY(Integer y) {
			this.y = y;
		}

		public Integer getWidth() {
			//取最小整数,不可用四舍五入法,否则可能导致裁剪值超出范围
			return Math.round(ratio*width - 0.5f);
		}

		public void setWidth(Integer width) {
			this.width = width;
		}

		public Integer getHeight() {
			//取最小整数,不可用四舍五入法,否则可能导致裁剪值超出范围
			return Math.round(ratio*height - 0.5f);
		}

		public void setHeight(Integer height) {
			this.height = height;
		}

		public Float getRatio() {
			return ratio;
		}

		public void setRatio(Float ratio) {
			this.ratio = ratio;
		}

	}

}
0
0
分享到:
评论

相关推荐

    java图片处理工具类

    图片压缩(把比较大的图片压小),缩放,文本水印,图片水印,旋转,裁剪

    android kotlin语言 图片压缩工具类

    kotlin 图片压缩工具类 1.比例缩放图片 2.质量压缩 3.图片按比例大小压缩方法 4.把字节数组保存为一个文件 5. 旋转图片 6.设置缩略图 7.按宽/高缩放图片到指定大小并进行裁剪得到中间部分图片

    java图片处理类

    这是一个java生成随即图片验证码,java图片压缩,java图片水印 ,java图片裁剪 ,java图片旋转 ,java图片放大缩小等工具类,里面有测试方法,欢迎使用!

    图片压缩 thumbnailator

    功能强大的图片压缩工具类。支持比例缩放,指定大小进行缩放,旋转,水印,裁剪,转化图像格式等。

    安卓拍照选择图库裁剪(带权限工具类)之后设置头像并上传到服务器

    Android开发中拍照,选择图库后并且裁剪 然后压缩图片之后将头像上传到服务器,里面有适配6.0权限工具类,上传文件工具类,拍照设置头像功能,很简单的实现。

    ImageUtils.java

    当前类是通过对图片进行处理,主要是进行将图片压缩,为了防止源文件过大,可以进行图片旋转,裁剪,转话图像格式,水印处理等,封装为一个简单的工具类,希望可以帮助到您,谢谢

    多功能工具箱-2023最新工具类微信小程序

    二维码生成丨文字九宫格 | 手持弹幕丨照片压缩 | 照片编辑丨照片裁剪 | 照片拼图丨长图拼接 | 图片格式转换丨图片批量加文字 | 图片加马赛克丨图片文字识别 | 九宫格切图 文字转图片 | 花式字体丨翅膀昵称 | 彩色...

    洋芋田图像工具箱3.5一个专为摄影师设计的图像工具箱.rar

    软件功能  图片加水印工具  能够为单张图片添加水印,也可以手动为多张图片依次添加水印,还可以设置好水印参数后自动批量添加水印。可以自行设置水印内容、颜色、字体、... 图片裁剪工具  支持自由裁剪、使用

    ArcGIS超级工具1.7.zip

    里面有就是多种数据处理工具,非常便利。具体如下: 文本文件操作 征地部标准坐标导出 征地部标准坐标导入 线封闭 点集转面 数据转换  SHP转数据库  批量数据库转数据库  栅格彩色转黑白 数据检查和数据信息获得 ...

    ArcGIS超级工具v1.7

    2.9 批量mxd导出图片 2.10 批量mxd压缩 2.11 转到XY 3.编号工具 3.1 按图形自动编号 3.2 更新BSM 3.3 整库更新BSM 3.4 字符串前补零 4.剪切和合并 4.1 按属性裁剪 4.2 矢量数据批量裁剪 4.3 矢量数据批量裁剪按...

    Android代码-PicCrop

    甚至,切换其他图片裁剪框架,也是改方法内部实现即可,不用更换各处已调用的api. 说明 此项目从https://github.com/glassLake/CropUtils迁移而来,已更新ucrop 依赖和api命名,原项目不再更新. uCrop主项目地址: ...

    云开发超多功能工具箱组合微信小程序源码附带流量主

    二维码生成丨文字九宫格 | 手持弹幕丨照片压缩 | 照片编辑丨照片裁剪 | 照片拼图丨长图拼接 | 图片格式转换丨图片批量加文字 | 图片加马赛克丨图片文字识别 | 九宫格切图 文字转图片 | 花式字体丨翅膀昵称 | 彩色...

    全新云开发工具箱:融合多项功能的微信小程序源码

    这些功能包括证件照制作、垃圾分类查询、个性签名制作、二维码生成、文字九宫格、手持弹幕、照片压缩、照片编辑、照片裁剪、照片拼图、长图拼接、图片格式转换、图片批量加文字、图片加马赛克、图片文字识别、九宫格...

    最新多功能魔盒工具箱小程序源码

    二维码生成丨文字九宫格 | 手持弹幕丨照片压缩 | 照片编辑丨照片裁剪 照片拼图丨长图拼接 | 图片格式转换丨图片批量加文字 | 图片加马赛克丨图片文字识别 | 九宫格切图 文字转图片 | 花式字体丨翅膀昵称 | 彩色...

    超多功能工具箱组合微信小程序源码_支持流量主.zip

    超多功能工具箱组合微信小程序功能实用性质特别的高,用户还能覆盖的广一些具体功能列表如下: 1.证件照制作 2.垃圾分类查询 3.个性签名制作 4.二维码生成丨文字九宫格 5.手持弹幕丨照片压缩 6.照片编辑丨照片...

    目前功能最多的带流量主微信工具箱小程序

    这是一款云开发超多功能工具箱组合微信小程序源码附带流量主功能,小程序内包含了40余个功能,堪称全能工具箱了,大致功能如下: 证件照制作 垃圾分类查询 个性签名制作 二维码生成丨文字九宫格 手持弹幕丨照片...

    CoolxLib:很早的,android 内部使用基础框架 网络请求、数据库操作、通用基础工具类、日志系统、缓存

    CoolxLib主要模块功能:网络请求模块,数据库操作模块,万能工具类模块,上传头像模块,网络请求模块: 支持自动解析JSON数据 支持可配置缓存 支持网络异常自动重试机制 支持网络错误自动处理 无缝的支持GZIP来减少数据...

    目前功能最多的带流量主微信工具箱小程序.zip

    这是一款云开发超多功能工具箱组合微信小程序源码附带流量主功能,小程序内包含了40余个功能,堪称全能工具箱了,大致功能如下: 证件照制作 垃圾分类查询 个性签名制作 二维码生成丨文字九宫格 手持弹幕丨照片...

    ArcGIS超级工具1.7.exe

    里面有就是多种数据处理工具,非常便利。 1.文本文件操作 1.1征地部标准坐标导出... 2 1.2征地部标准坐标导入... 6 1.3线封闭... 6 1.4点集转面... 7 2. 数据转换... 8 2.1 SHP转数据库... 8 ...

Global site tag (gtag.js) - Google Analytics