中作中由于需要对图片进行压缩和裁剪,因此参考网上的各种方法写了以下工具类
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;
}
}
}
分享到:
相关推荐
"图片处理工具类"就是为了解决这些问题而设计的,它集成了多种常用的图片操作功能,如图片压缩、格式转换和尺寸调整等。下面将详细阐述这些知识点。 1. **图片压缩**: 在Android中,图片压缩主要目的是减小图片的...
在Java编程语言中,处理图片是一项常见的任务,尤其在网页开发、移动应用或者图形用户界面设计中。本篇文章将深入探讨如何使用Java...通过深入理解这些技术,我们可以创建出强大的图片处理工具类,满足日常开发需求。
这个"Android项目源码获取照片裁剪图片压缩图片工具库"提供了一整套解决方案,旨在帮助开发者高效地处理图像,提高应用性能,同时节省存储空间。下面我们将详细探讨这些知识点。 1. **照片裁剪**: - 裁剪功能通常...
这个"java裁剪、缩放图片工具类"提供了这样的功能。它包含两个主要的组件:一个工具类(ImgUtils.java)和一个测试类(Test.java)。让我们深入探讨这两个类及其背后的图像处理原理。 首先,`ImgUtils.java`是核心...
"图片压缩工具类"的标题暗示了这是一个专门用于处理图像压缩的软件或代码库,旨在提供多样的图片压缩方法,追求快速高效的同时,还能保证图片的质量。描述中提到“无损”压缩,意味着该工具在压缩图片时不会降低原始...
kotlin 图片压缩工具类 1.比例缩放图片 2.质量压缩 3.图片按比例大小压缩方法 4.把字节数组保存为一个文件 5. 旋转图片 6.设置缩略图 7.按宽/高缩放图片到指定大小并进行裁剪得到中间部分图片
"图片压缩小工具"就是这样一个专门用于图像处理的应用,它的主要功能是按照原宽高比将图片压缩到用户指定的大小,适合于创建头像或者其他需要限制尺寸的场景。这种工具对于优化网站性能、节省存储空间以及提高数据...
“图片压缩.exe”是一个用于处理图片的实用工具,很可能支持多种压缩格式和参数调整。通常,用户可以通过界面选择图片文件,设定压缩级别,工具会自动应用最佳策略进行压缩。高级设置可能包括颜色模式选择、质量调整...
在移动端应用开发中,图片处理是一项常见的需求,尤其是在社交媒体、电商或者个人相册类的应用中。Vue.js作为一款轻量级且功能强大的前端框架,提供了丰富的插件和库来支持图片裁剪和压缩处理。本篇文章将深入探讨...
【Android图片处理工具类BitmapUtils】是Android应用开发中用于高效管理和操作Bitmap对象的一个实用工具类。Bitmap在Android系统中是表示图像数据的核心类,它提供了丰富的图像处理功能,但处理不当可能导致内存溢出...
这类工具通常包括调整尺寸、裁剪、颜色校正、滤镜应用等功能,同时也提供图片压缩功能,减少存储空间占用和网络传输时间。 描述中提到的"将需要处理的图片或者存储图片的文件夹直接拖到压缩.bat",这表明提供的是一...
`Android图片处理工具类`是开发者必备的利器,能够帮助我们有效地管理图片资源,提高应用性能。以下是一些关于这个主题的关键知识点: 1. **图片查看**: - `ImageView`:Android自带的用于显示图片的基础组件,...
8. **性能优化**:在大量图片处理时,要考虑性能优化,比如使用队列处理、缓存中间结果、压缩处理后的图片等方法。 总的来说,"php图片裁剪的类"是一个结合了PHP后端处理和HTML5前端技术的解决方案,用于实现图片的...
本压缩包提供的"ffmpeg java 封装工具类"正是为了解决这个问题,它将FFmpeg的功能与Java编程语言相结合,提供了一套易于使用的API。 一、FFmpeg Java 封装工具类介绍 这个工具类通常包括以下核心功能: 1. **命令...
此外,一些高级的图片压缩工具还可能支持自定义输出格式、尺寸调整、裁剪等功能,以满足不同场景的需求。 总的来说,这个“小巧实用的图片压缩工具”是一个便捷的解决方案,能够有效地帮助用户管理和优化他们的图片...
这个工具类库不仅高效,而且易于集成到Java项目中,大大简化了图片压缩的流程。 thumbnailator库的核心功能是生成缩略图,但同时也支持多种图像处理操作,如旋转、裁剪、调整大小和质量等。它基于Java的`java.awt....
在Android开发中,图片处理是不可或缺的一部分,无论是加载网络图片、裁剪图片、调整尺寸、压缩质量,还是进行各种特效处理,都需要用到相应的图片工具类。本篇将围绕"android 图片工具类"这一主题,详细介绍Android...
总结,阿里云SimpleImage是Java开发者的强大图片处理工具,能够轻松实现图片压缩和裁剪,帮助优化图片质量和大小,适用于各种需要处理图片的场景。通过简单易懂的API,开发者可以快速集成到自己的项目中,提高图片...
"图片压缩"这个文件名可能是指该压缩工具提供的默认设置或示例压缩结果。 总之,"图片超级压缩工具"提供了一种快速、高效的方式来管理和优化图像文件,使得在保持可接受的视觉质量的同时,减少存储空间的需求。在...