java图片高质量缩放类

摘要:
Imagetemp=newImageIcon。getImage();//2创建缓冲图像。BufferedImagebufferedImage=新缓冲图像;//3将图像复制到缓冲图像。Graphicsg=缓冲图像。createGraphics();//4背景清晰的图像和绘画。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.swing.ImageIcon;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

@SuppressWarnings("restriction")
public class PictrueScaleUtils {
/**
* jpg图片的缩放
* @param originalFile 原图片路径
* @param resizedFile 缩放后图片的路径
* @param newWidth 缩放后图片的宽度
* @param newHeight 缩放后图片的高度【当isScale为false时newHeight不起作用】
* @param isScale 是否按比例缩放
* @param quality 缩放质量
* @throws IOException
*/
public static void jpgScalePicture(File originalFile, File resizedFile,
int newWidth, int newHeight, Boolean isScale,
float quality) throws IOException {
if (quality > 1) {
throw new IllegalArgumentException("图片质量是0和1之间");
}

ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
Image i = ii.getImage();
Image resizedImage = null;

int iWidth = i.getWidth(null);
int iHeight = i.getHeight(null);

if(isScale){
if (iWidth > iHeight) {
resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight)/ iWidth, Image.SCALE_SMOOTH);
} else {
resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight, newWidth, Image.SCALE_SMOOTH);
}
} else {
resizedImage = i.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
}

// 1这个代码确保图像中的所有像素的加载。
Image temp = new ImageIcon(resizedImage).getImage();

// 2创建缓冲的图像。
BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null), temp.getHeight(null), BufferedImage.TYPE_INT_RGB);

// 3将图像复制到缓冲的图像。
Graphics g = bufferedImage.createGraphics();

// 4背景清晰的图像和画。
g.setColor(Color.white);
g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
g.drawImage(temp, 0, 0, null);
g.dispose();

// 4软化。
float softenFactor = 0.05f;
float[] softenArray = { 0, softenFactor, 0, softenFactor, 1 - (softenFactor * 4), softenFactor, 0, softenFactor, 0 };
Kernel kernel = new Kernel(3, 3, softenArray);
ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
bufferedImage = cOp.filter(bufferedImage, null);

// 6写的JPEG文件。
FileOutputStream out = new FileOutputStream(resizedFile);

// 7作为一个JPEG编码图像数据流
@SuppressWarnings("restriction")
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

@SuppressWarnings("restriction")
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);

param.setQuality(quality, true);

encoder.setJPEGEncodeParam(param);
encoder.encode(bufferedImage);
}

/**************************************************************************************************************************/
public static void main(String[] args) throws IOException {
File originalImage = new File("E:/aaa/png - 副本.png");
File resizedFile = new File("E:/aaa/png - 副本aaaaaaaaaaaaaa.png");
jpgScalePicture(originalImage, resizedFile, 200, 200, true, 1f);

System.err.println("转化成功''''''''''''''''''");
}
}

Java中的类JPEGImageEncoder,JPEGCodec和JPEGEncodeParam的导入问题

java的图片压缩,需要用这三个类,默认这三个类在eclipse是导不进来,直接报错的。

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

解决办法:
Eclipse默认把这些受访问限制的API设成了ERROR。只要把Windows-Preferences-Java-Complicer-Errors/Warnings里面的Deprecated and restricted API中的Forbidden references(access rules)选为Warning就可以编译通过。

免责声明:文章转载自《java图片高质量缩放类》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇利用css3制作的几个loading图IDEA 这么设置 Maven,再也不用担心依赖下载失败了下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

吐槽下若依(RuoYi)系统的权限系统(shiro和spring-security)

spring-security以RuoYi-Vue为例,当前版本是3.1.0。然后是系统中很多地方用LoginUserloginUser=tokenService.getLoginUser来获取当前用户数据,这个需要再解析token,然后从redis缓存中读取的数据,不明白为什么不直接从SecurityUtils.getLoginUser()中获取,明明已经...

IntelliJ idea设置显示错误代码提示

idea默认关闭自动编译,所以一些编译错误只有在编译的时候才会提示,例如修改了引用类。按图中设置打开自动编译:注意:idea默认打开省电模式,自动编译在省电模式下被禁用,所以需要在file˃powersavemode关闭省电模式。...

【Mybatis-Plus】使用updateById()、update()将字段更新为null或者空

我检查了以下项目的配置,发现字段级别设置为NOT_由空引起。2不为空,但默认更新策略为Not_ NULL:解决方案1。设置全局字段策略加:classpath:#字段策略IGNORED:NOT_NULL:NOT_EMPTY:NOT_Null2。为所需字段设置单独的字段策略很麻烦。...

ubuntu死机怎么办

在使用ubuntu时,如果由于各种复杂因素导致系统崩溃,例如软件不兼容和误操作,我们该怎么办?让我们看看如何解决这个问题……您可以打开终端模拟器1 ctrl+alt+t,看看是否可以调出终端模拟窗口2并进入终端模拟窗口。您可以$top(ctrl+c退出top)查看最近使用的应用程序。您可以通过$sudokillpid结束可能导致“崩溃”的软件进程。等一下,看...

Frp内网穿透安装教程#Frpc OpenWrt客户端安装#图形化管理

最新版本为0.33.0-1 II。路由器安装Frp图形操作界面luci-app-frpc1。通过SSH登录路由器后台。并将文件下载到路由器中的项目下载地址:https://github.com/kuoruan/luci-app-frpc/releases2.安装软件#安装luci app frpcopkinstallluci app frpc_1.2.1-1...

Vue中在移动端如何判断设备是安卓还是ios

u、 匹配(/(i[^;]+;(U;)?CPU+MacOSX/);如果(isiOS){return“ios”;}否则{return“android”;}},...