ImageUtil图片工具: 压缩/格式转换等

import net.coobird.thumbnailator.Thumbnails;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
* Created by niewj on 2018/9/10.
*/
public class ImgUtil {// @TODO

private static Logger logger = LoggerFactory.getLogger(ImgUtil.class);

public static final String JPG = "jpg";
public static final String GIF = "gif";
public static final String PNG = "png";
public static final String BMP = "bmp";
public static final int K = 1024;

public static final String TYPE_UNKNOWN = "unknown";

/**
* png格式图片转为jpg格式
*
* @param pngFile
* @return
*/
public static File convert2Jpg(File pngFile) {
// #0. 判空
if (pngFile == null || !pngFile.exists() || !pngFile.isFile() || !pngFile.canRead()) {
return null;
}

File jpgFile = null;
BufferedImage image;

try {
//#1. read image file
image = ImageIO.read(pngFile);
String parentPath = pngFile.getParent();

logger.info(ImgUtil.getPicType(new FileInputStream(pngFile)));

// #2. create a blank, RGB, same width and height, and a white background
BufferedImage newBufferedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
newBufferedImage.createGraphics().drawImage(image, 0, 0, Color.WHITE, null);

// #3. create image filename
long currentMillis = System.currentTimeMillis();
jpgFile = new File(parentPath, currentMillis + ".jpg");

// write to jpeg file
ImageIO.write(newBufferedImage, "jpg", jpgFile);

logger.info("Done");

} catch (IOException e) {

e.printStackTrace();

}

return jpgFile;
}

/**
* 旋转图片
*
* @param sourceFile 原图片
* @param degrees 旋转度数
* @throws IOException
*/
public static void rotate(File sourceFile, double degrees) throws IOException {
Thumbnails.of(sourceFile)
.rotate(degrees)//旋转度数
.scale(1)//缩放比例
.toFile(sourceFile);
}

/**
* 根据文件流判断图片类型
*
* @param fis
* @return jpg/png/gif/bmp
*/
public static String getPicType(FileInputStream fis) {
//读取文件的前几个字节来判断图片格式
byte[] b = new byte[4];
try {
fis.read(b, 0, b.length);
String type = bytesToHexString(b).toUpperCase();
if (type.contains("FFD8FF")) {
return JPG;
} else if (type.contains("89504E47")) {
return PNG;
} else if (type.contains("47494638")) {
return GIF;
} else if (type.contains("424D")) {
return BMP;
} else {
return TYPE_UNKNOWN;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}

/**
* byte数组转换成16进制字符串
*
* @param src
* @return
*/
private static String bytesToHexString(byte[] src) {
StringBuilder sBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
sBuilder.append(0);
}
sBuilder.append(hv);
}
return sBuilder.toString();
}

/**
* @param srcFile 待压缩的源文件
* @param desFileSize 限制的文件大小,单位Kb
* @param scale 压缩比例(0, 1.0]
*/
public static void commpressPicForScale(File srcFile, long desFileSize, double scale) {
try {
// #0. 获取文件类型,根据内容而不是后缀名
String type = getPicType(new FileInputStream(srcFile));
// #1. 判空
if (srcFile == null || !srcFile.exists() || !srcFile.isFile()) {
return;
}
// #2.输出大小
long len = srcFile.length();
logger.info("源图片:" + srcFile.getAbsolutePath() + ",大小:" + len / K + "kb");

// #3. 递归方法压缩
compressImage(type, srcFile, desFileSize, scale);
} catch (IOException e) {
e.printStackTrace();
}

}

/**
* 根据照片类型、精确度,上限大小,压缩指定照片
*
* @param type 照片类型:jpg/png (1. type是根据文件的内容定的,而不是名字后缀值; 2. 除了jpg,其他都按照png处理)
* @param srcFile 源文件和目标文件:用的同一个
* @param desFileSize 目标值限制大小,单位Kb
* @param scale 压缩比:(0,1.0]
*/
private static void compressImage(String type, File srcFile, long desFileSize, double scale) {
if (srcFile == null || !srcFile.exists() || !srcFile.isFile()) {
logger.error("_n_待压缩源文件不合要求:srcFile={}", srcFile);
return;
}

try {
long fileSize = srcFile.length();
// 1、判断大小,如果小于500kb,不压缩;如果大于等于500kb,压缩:递归结束条件
if (fileSize <= desFileSize * K) {
return;
}
// 2. jpg格式有不失真的压缩方式;png的没有;
if (JPG.equalsIgnoreCase(type)) {
logger.info("jpg_file_compress:{}", srcFile.getAbsoluteFile());
Thumbnails.of(srcFile).scale(1.0f).outputQuality(scale).toFile(srcFile);
} else { // 其他图片类型,一律按照PNG格式缩放
logger.info("png_file_compress:{}", srcFile.getAbsoluteFile());
Thumbnails.of(srcFile).scale(scale).toFile(srcFile);
}
// 3. 记录下压缩后的大小
logger.info("compressing...{}kb", srcFile.length() / K);
// 4. 递归调用,直到大小符合要求
compressImage(type, srcFile, desFileSize, scale);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 获取base64字符串
*
* @param file
* @return
*/
public static String getImageBase64(File file) {
FileInputStream inputFile = null;
byte[] buffer = new byte[0];

try {
// #1. Base64输入流
inputFile = new FileInputStream(file);
buffer = new byte[(int) file.length()];
inputFile.read(buffer);
inputFile.close();
} catch (IOException e) {
e.printStackTrace();
} finally { // 用完后删除文件
deleteUploadedFile(file);
}

return new BASE64Encoder().encode(buffer);
}

/**
* 返回之前,把生成的文件删除掉
*
* @param file
*/
public static void deleteUploadedFile(File file) {
// 上传完文件之后,照片或视频文件删除掉
if (file != null && file.exists()) {
logger.info("file deleting: ", file.getAbsolutePath());
file.delete();
}
}

// private static String getImageBase64(String imageId) {
// File orgFile = FtpHelper.getFile(imageId);
// File file = renameFile(orgFile);
// ImageUtil.commpressPicForScale(file, 500, 0.9d); // 压缩照片
// Assert.assertion(file != null, ResponseCodeEnum.INTERNAL_HANDLE_ERROR, "file is not exit");
// FileInputStream inputFile = null;
// byte[] buffer = new byte[0];
// try {
// inputFile = new FileInputStream(file);
// buffer = new byte[(int) file.length()];
// inputFile.read(buffer);
// inputFile.close();
// } catch (Exception e) {
// LOGGER.error("Exception->\n {}", e);
// throw new ThirdPartException(ResponseCodeEnum.INTERNAL_HANDLE_ERROR, StringMsg.fmtMsg("*"));
// } finally { // 用完后删除文件
// FtpHelper.deleteUploadedFile(file);
// FtpHelper.deleteUploadedFile(orgFile);
// }
// return new BASE64Encoder().encode(buffer);
// }

public static void main(String[] args) throws FileNotFoundException {
// File f2 = new File("E:\\chrome_download\\1.png");
// String type2 = ImageUtil.getPicType(new FileInputStream(f2));
// System.out.println("type2=" + type2);
//// ImageUtil.compressImage(type2, f2, 500, 0.9d);
// File pngFile = new File("C:\\Users\\weijun.nie\\Desktop\\thinkstats\\test2.png");
// File jpgFile = convert2Jpg(pngFile);
// System.out.println(jpgFile.getAbsolutePath());

System.out.printf("%02X", 125);
}
}

原文地址:http://blog.51cto.com/coffee/2177169

时间: 2024-10-12 12:02:47

ImageUtil图片工具: 压缩/格式转换等的相关文章

对图片的统一格式转换处理

package com.eshore.rbss.commons; import java.awt.Graphics;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.InputStream;import java.io.OutputStream; import javax.imageio.ImageIO; import org.apache.log4j.Logger; /** * 1.对图片时行格式转

开发利器_ImageMagick.基于Linux命令行的图片缩放/编辑/格式转换?

简单介绍: ImageMagick是一系列的用于修改,加工图像的命令行工具,能够快速地使用命令行对图片进行操作,对大量的图片进行批处理,它能执行相当多操作,本文涉及的只是开发中常用的技能. 快速安装: yum -y install epel-release yum install -y ImageMagick ImageMagick-devel 格式转换: convert 1.png 1.jpg 缩放图像: convert 1.jpg -resize 499x 1.jpg 说明: ImageMa

利用PhotoShop批量压缩和转换图片格式

[摘要] 从单反相机中导出的照片,为保证照片质量,方便后期调整,摄影爱好者经常会在相机中将照片格式设置为.NEF,现在想转换为JPEG的格式,一张张处理太麻烦,有没有批量处理的方法?强大的PhotoShop可以帮我们自动搞定. [正文] NEF格式照片的调整方式 单反相机照相,为方便后期调整,可以将照片格式设置为NEF格式,这样如果以photoshop方式打开,自动就出现照片处理对话框,如图所示: 右边弹出的调整面板,可以方便调整曝光度和对比度等. 但如果想把照片放到手机内,或者处理好的照片希望

canvas压缩、裁切图片和格式转换的方法

按照大小压缩图片,或者按照特定分辨率裁切图片,转为blob数据.自动处理ios中可能存在的照片偏差90°问题. 例如,获取300*300大小的头像,实现以下效果: 使用方式: <!-- 引入js文件 --> <script type="text/javascript" src="./compressImage.js"></script> <!-- input标签 --> <input type="fil

24.Android 图片工具ImageUtil

24.Android 图片工具ImageUtil Android 图片工具ImageUtil 裁图 Bitmap圆角 缩略图 视频缩略图 各种类型转换 ImageUtil全部源码 裁图 /** * 调用系统自带裁图工具 * * @param activity * @param size * @param uri * @param action * @param cropFile */ public static void cropPicture(Activity activity, int si

分享一个不错的pdf格式转换工具

PDF文档怎么转换成其他的流行格式?PDF作为一种跨平台的电子文档格式,一直深受广大作者的喜爱,可是编辑并不方便.有没有PDF转换成Office之类的转换工具呢?关于这类的软件网上一搜一大推,让人迷茫啊,有木有?下载了一大堆软件后,没有感觉靠谱的有木有? 好吧,不废话不煽情了,现在就分享一个试用过的,感觉非常不错的PDF转Office工具,迅捷PDF转换器.它是一款完全免费的PDF转换器工具,软件体积小巧.操作简单.界面美观大方实用,最主要的是支持批量PDF文件转换,一般网上能搜到的PDF转换器

可以转换图片与PDF格式的软件

pdf转换成JPG转换器是一款功能强大好用的pdf文件转换成JPG文件的软件,界面简单,功能稳定,支持批量转换,操作起来非常方便,完美支持将pdf文档转成JPG文档,使用pdf 转word无需安装Adobe Acrobat,Acrobat Reader pdf软件.功能介绍:pdf转换成JPG软件工具可以帮你将pdf文档转换成JPG文件,减少工作负担,支持图文混合排版,在pdf转成JPG之前请确认pdf文件有没有密码,有则先去除再进行转换效果会更好.应用方案:A公司有1000个项目文档,源文件为

bmp,jpg,png,tif,wmf,emf与eps图片格式转换

wmf/emf是两种Microsoft Windows的图形文件格式.它是一个矢量图格式,但是也允许包含位图.本质上,一个WMF文件保存一系列可以用来重建图片的Windows GDI命令.在某种程度上,它类似于印刷业广泛使用的PostScript格式. 关于wmf2eps安装使用的问题可参考如下两个网页. http://www.kellogg.northwestern.edu/rc/miktex-install.htm http://www.wolf-s.homepage.t-online.de

使用Spire.Office自制一个进行批量格式转换(Pdf转换为Word)的工具

使用Spire.Office自制一个进行批量格式转换(Pdf转换为Word)的工具 本文文末提供一个可将PDF转换为Word的小工具供下载. +BIT祝威+悄悄在此留下版了个权的信说: Spire.Office 我一直想找一个工具能够把我收集的一些PDF资料转换为Word版.最近偶然发现一个超级强大的工具Spire.Office for .NET可以做到这一点. 而且Spire.Office提供C#.VB的DLL供调用,还提供了丰富简洁的示例项目可供学习. 如下图所示,Spire.Office