`
wuzhihui001
  • 浏览: 20005 次
  • 性别: 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
分享到:
评论

相关推荐

    图片处理工具类

    "图片处理工具类"就是为了解决这些问题而设计的,它集成了多种常用的图片操作功能,如图片压缩、格式转换和尺寸调整等。下面将详细阐述这些知识点。 1. **图片压缩**: 在Android中,图片压缩主要目的是减小图片的...

    java图片处理工具类

    在Java编程语言中,处理图片是一项常见的任务,尤其在网页开发、移动应用或者图形用户界面设计中。本篇文章将深入探讨如何使用Java...通过深入理解这些技术,我们可以创建出强大的图片处理工具类,满足日常开发需求。

    Android项目源码获取照片裁剪图片压缩图片工具库

    这个"Android项目源码获取照片裁剪图片压缩图片工具库"提供了一整套解决方案,旨在帮助开发者高效地处理图像,提高应用性能,同时节省存储空间。下面我们将详细探讨这些知识点。 1. **照片裁剪**: - 裁剪功能通常...

    java裁剪、缩放图片工具类

    这个"java裁剪、缩放图片工具类"提供了这样的功能。它包含两个主要的组件:一个工具类(ImgUtils.java)和一个测试类(Test.java)。让我们深入探讨这两个类及其背后的图像处理原理。 首先,`ImgUtils.java`是核心...

    图片压缩工具类

    "图片压缩工具类"的标题暗示了这是一个专门用于处理图像压缩的软件或代码库,旨在提供多样的图片压缩方法,追求快速高效的同时,还能保证图片的质量。描述中提到“无损”压缩,意味着该工具在压缩图片时不会降低原始...

    android kotlin语言 图片压缩工具类

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

    图片压缩小工具

    "图片压缩小工具"就是这样一个专门用于图像处理的应用,它的主要功能是按照原宽高比将图片压缩到用户指定的大小,适合于创建头像或者其他需要限制尺寸的场景。这种工具对于优化网站性能、节省存储空间以及提高数据...

    图片压缩工具对图片大小进行压缩

    “图片压缩.exe”是一个用于处理图片的实用工具,很可能支持多种压缩格式和参数调整。通常,用户可以通过界面选择图片文件,设定压缩级别,工具会自动应用最佳策略进行压缩。高级设置可能包括颜色模式选择、质量调整...

    基于vue的移动端图片裁剪压缩处理

    在移动端应用开发中,图片处理是一项常见的需求,尤其是在社交媒体、电商或者个人相册类的应用中。Vue.js作为一款轻量级且功能强大的前端框架,提供了丰富的插件和库来支持图片裁剪和压缩处理。本篇文章将深入探讨...

    Android图片处理工具类BitmapUtils

    【Android图片处理工具类BitmapUtils】是Android应用开发中用于高效管理和操作Bitmap对象的一个实用工具类。Bitmap在Android系统中是表示图像数据的核心类,它提供了丰富的图像处理功能,但处理不当可能导致内存溢出...

    图片处理、图片压缩工具

    这类工具通常包括调整尺寸、裁剪、颜色校正、滤镜应用等功能,同时也提供图片压缩功能,减少存储空间占用和网络传输时间。 描述中提到的"将需要处理的图片或者存储图片的文件夹直接拖到压缩.bat",这表明提供的是一...

    Android图片处理工具类,包括: 图片查看、照片墙、bitmap转存、圆角、剪切、图片加载缓存、图片压缩等

    `Android图片处理工具类`是开发者必备的利器,能够帮助我们有效地管理图片资源,提高应用性能。以下是一些关于这个主题的关键知识点: 1. **图片查看**: - `ImageView`:Android自带的用于显示图片的基础组件,...

    php图片裁剪的类

    8. **性能优化**:在大量图片处理时,要考虑性能优化,比如使用队列处理、缓存中间结果、压缩处理后的图片等方法。 总的来说,"php图片裁剪的类"是一个结合了PHP后端处理和HTML5前端技术的解决方案,用于实现图片的...

    ffmpeg java 封装工具类,音视频处理.zip

    本压缩包提供的"ffmpeg java 封装工具类"正是为了解决这个问题,它将FFmpeg的功能与Java编程语言相结合,提供了一套易于使用的API。 一、FFmpeg Java 封装工具类介绍 这个工具类通常包括以下核心功能: 1. **命令...

    小巧实用的图片压缩工具

    此外,一些高级的图片压缩工具还可能支持自定义输出格式、尺寸调整、裁剪等功能,以满足不同场景的需求。 总的来说,这个“小巧实用的图片压缩工具”是一个便捷的解决方案,能够有效地帮助用户管理和优化他们的图片...

    thumbnailator-0.4.8.jar包,和压缩图片工具类

    这个工具类库不仅高效,而且易于集成到Java项目中,大大简化了图片压缩的流程。 thumbnailator库的核心功能是生成缩略图,但同时也支持多种图像处理操作,如旋转、裁剪、调整大小和质量等。它基于Java的`java.awt....

    android 图片工具类

    在Android开发中,图片处理是不可或缺的一部分,无论是加载网络图片、裁剪图片、调整尺寸、压缩质量,还是进行各种特效处理,都需要用到相应的图片工具类。本篇将围绕"android 图片工具类"这一主题,详细介绍Android...

    阿里云图片压缩SimpleImage jar

    总结,阿里云SimpleImage是Java开发者的强大图片处理工具,能够轻松实现图片压缩和裁剪,帮助优化图片质量和大小,适用于各种需要处理图片的场景。通过简单易懂的API,开发者可以快速集成到自己的项目中,提高图片...

    图片超级压缩工具可以群压缩

    "图片压缩"这个文件名可能是指该压缩工具提供的默认设置或示例压缩结果。 总之,"图片超级压缩工具"提供了一种快速、高效的方式来管理和优化图像文件,使得在保持可接受的视觉质量的同时,减少存储空间的需求。在...

Global site tag (gtag.js) - Google Analytics