JAVA 图片压缩 20M->188K
2017-08-23 09:53
441 查看
说明:
本人为什么要用这个,由于服务器尚未搭建完成,图片暂时存于数据库,导致查询奇慢无比,故使用压缩图片。可以解决一部分问题
因为数据库的存取类型是BLOB 所以此方法是从byte[] 压缩到 byte[] 存入数据库 已实验19.6M的世界地图可以压缩至188k ,但是发现小图片貌似不会改变。
代码:压缩工具类
package com.hzcominfo.application.devcenter.core.web.controller.common.util;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
public class ImgTools {
/**
* 按照 宽高 比例压缩
* @param b byte[]
* @param width
* @param height
* @param suf
* @return byte[]
* @throws IOException
*/
public static byte[] getImg(byte[] b, int width, int height,String suf) throws IOException {
InputStream input = new ByteArrayInputStream(b);
BufferedImage bi = ImageIO.read(input);
double srcWidth = bi.getWidth(); // 源图宽度
double srcHeight = bi.getHeight(); // 源图高度
double scale = 1;
if (width > 0) {
scale = width / srcWidth;
}
if (height > 0) {
scale = height / srcHeight;
}
if (width > 0 && height > 0) {
scale = height / srcHeight < width / srcWidth ? height / srcHeight
: width / srcWidth;
}
int w = (int) (srcWidth * (scale >= 1 ? 0.9 : scale));
int h = (int) (srcHeight * (scale >= 1 ? 0.9 : scale));
Image image = bi.getScaledInstance(w, h, Image.SCALE_SMOOTH);
BufferedImage result = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
Graphics g = result.getGraphics();
g.setColor(Color.RED);
g.drawImage(image, 0, 0, null); // 绘制处理后的图
g.dispose();
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ImageIO.write(result, suf, out);
} catch (IOException e) {
e.printStackTrace();
}
return out.toByteArray();
}
}
具体使用:
@ResponseBody
@RequestMapping("importPic")
@Transactional(readOnly = false)
// 需要事务操作必须加入此注解
@SystemLog(module = "服务中心", methods = "接口管理-导入接口申请审批凭证")
// 凡需要处理业务逻辑的.都需要记录操作日志
public String importPic(@RequestParam(value = "file", required = false) MultipartFile file,String ids) throws IOException {
InterfaceApplyFormMap param = new InterfaceApplyFormMap();
if (null != file) {
String fileName =file.getOriginalFilename();
String[] ss = fileName.split("\\.");
param.put("certificate",ImgTools.getImg(file.getBytes(), 1024, 960,ss[1]));//第一个参数原始图片byte[]数组,第二个长,第三个宽,第四个目标图片的文件格式(jpg...)
param.put("fileName",fileName);
}
String[] idss = ids.split(",");
try {
for (String iaid : idss) {
param.put("id", iaid);
applyMapper.interFileByPicFlag(param);
}
return AttrConstants.SUCCESS;
} catch (Exception e) {
return AttrConstants.FAIL;
}
}
本人为什么要用这个,由于服务器尚未搭建完成,图片暂时存于数据库,导致查询奇慢无比,故使用压缩图片。可以解决一部分问题
因为数据库的存取类型是BLOB 所以此方法是从byte[] 压缩到 byte[] 存入数据库 已实验19.6M的世界地图可以压缩至188k ,但是发现小图片貌似不会改变。
代码:压缩工具类
package com.hzcominfo.application.devcenter.core.web.controller.common.util;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
public class ImgTools {
/**
* 按照 宽高 比例压缩
* @param b byte[]
* @param width
* @param height
* @param suf
* @return byte[]
* @throws IOException
*/
public static byte[] getImg(byte[] b, int width, int height,String suf) throws IOException {
InputStream input = new ByteArrayInputStream(b);
BufferedImage bi = ImageIO.read(input);
double srcWidth = bi.getWidth(); // 源图宽度
double srcHeight = bi.getHeight(); // 源图高度
double scale = 1;
if (width > 0) {
scale = width / srcWidth;
}
if (height > 0) {
scale = height / srcHeight;
}
if (width > 0 && height > 0) {
scale = height / srcHeight < width / srcWidth ? height / srcHeight
: width / srcWidth;
}
int w = (int) (srcWidth * (scale >= 1 ? 0.9 : scale));
int h = (int) (srcHeight * (scale >= 1 ? 0.9 : scale));
Image image = bi.getScaledInstance(w, h, Image.SCALE_SMOOTH);
BufferedImage result = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
Graphics g = result.getGraphics();
g.setColor(Color.RED);
g.drawImage(image, 0, 0, null); // 绘制处理后的图
g.dispose();
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ImageIO.write(result, suf, out);
} catch (IOException e) {
e.printStackTrace();
}
return out.toByteArray();
}
}
具体使用:
@ResponseBody
@RequestMapping("importPic")
@Transactional(readOnly = false)
// 需要事务操作必须加入此注解
@SystemLog(module = "服务中心", methods = "接口管理-导入接口申请审批凭证")
// 凡需要处理业务逻辑的.都需要记录操作日志
public String importPic(@RequestParam(value = "file", required = false) MultipartFile file,String ids) throws IOException {
InterfaceApplyFormMap param = new InterfaceApplyFormMap();
if (null != file) {
String fileName =file.getOriginalFilename();
String[] ss = fileName.split("\\.");
param.put("certificate",ImgTools.getImg(file.getBytes(), 1024, 960,ss[1]));//第一个参数原始图片byte[]数组,第二个长,第三个宽,第四个目标图片的文件格式(jpg...)
param.put("fileName",fileName);
}
String[] idss = ids.split(",");
try {
for (String iaid : idss) {
param.put("id", iaid);
applyMapper.interFileByPicFlag(param);
}
return AttrConstants.SUCCESS;
} catch (Exception e) {
return AttrConstants.FAIL;
}
}
相关文章推荐
- Java 压缩图片
- java实现的图片缩放 压缩 裁剪工具!找了很久,市面上再也找不到比它缩放效果还好的代码了
- eclipse下 带图片的java工程-->jar文件-->exe文件
- Java-->利用URL类下载图片
- ImageMagick for java 使用Jmagick压缩高质量图片
- java--图片水印、压缩
- 解决java压缩图片透明背景变黑色的问题
- Java图片上传压缩处理
- Java图片上传压缩处理
- java图片压缩和剪裁示例
- Photoshop脚本 > 压缩并输出JPEG图片
- java 图片压缩和分辨率处理
- java中压缩图片的代码辅助类
- JAVA压缩图片并打成ZIP
- JAVA 图片压缩
- java 图片 批量 压缩 +全部压缩
- Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理
- ImgUtil.java根据长宽压缩图片 根据坐标长宽切图 生成缩率图
- java 后台图片压缩上传png适用
- java下载远程http地址的图片文件到本地-自动处理图片是否经过服务器gzip压缩的问题