大家好,欢迎来到IT知识分享网。
应用场景
在和腾讯广点通交互生成视频的智能封面时,由于返回的智能封面图片的大小太大超出了限制,因此需要把图片压缩大小后再上传至腾讯
关于图片压缩的解决方案
在这里我主要使用的是Thumbnails来进行图片的压缩,下面会简单介绍一下工具类的使用。
- 依赖
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
- 指定大小进行缩放
/* * size(width,height) 若图片横比200小,高比300小,不变 * 若图片横比200小,高比300大,高缩小到300,图片比例不变 若图片横比200大,高比300小,横缩小到200,图片比例不变 * 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300 */
Thumbnails.of("images/test.jpg").size(200, 300).toFile("image/image_200x300.jpg");
Thumbnails.of("images/test.jpg").size(2560, 2048).toFile("image/image_2560x2048.jpg");
- 按照比例进行缩放
/** * scale(比例) */
Thumbnails.of("images/test.jpg").scale(0.25f).toFile("images/image_25%.jpg");
Thumbnails.of("images/test.jpg").scale(1.10f).toFile("images/image_110%.jpg");
- 不按照比例,指定大小进行缩放
/** * keepAspectRatio(false) 默认是按照比例缩放的 */
Thumbnails.of("images/test.jpg").size(120, 120).keepAspectRatio(false).toFile("images/image_120x120.jpg");
- 旋转
/** * rotate(角度),正数:顺时针 负数:逆时针 */
Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(90).toFile("images/image+90.jpg");
Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(-90).toFile("images/iamge-90.jpg");
- 水印
/** * watermark(位置,水印图,透明度) */
Thumbnails.of("images/test.jpg").size(1280, 1024).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("images/watermark.png")), 0.5f)
.outputQuality(0.8f).toFile("images/image_watermark_bottom_right.jpg");
Thumbnails.of("images/test.jpg").size(1280, 1024).watermark(Positions.CENTER, ImageIO.read(new File("images/watermark.png")), 0.5f)
.outputQuality(0.8f).toFile("images/image_watermark_center.jpg");
- 裁剪
/** * 图片中心400*400的区域 */
Thumbnails.of("images/test.jpg").sourceRegion(Positions.CENTER, 400, 400).size(200, 200).keepAspectRatio(false)
.toFile("images/image_region_center.jpg");
/** * 图片右下400*400的区域 */
Thumbnails.of("images/test.jpg").sourceRegion(Positions.BOTTOM_RIGHT, 400, 400).size(200, 200).keepAspectRatio(false)
.toFile("images/image_region_bootom_right.jpg");
/** * 指定坐标 */
Thumbnails.of("images/test.jpg").sourceRegion(600, 500, 400, 400).size(200, 200).keepAspectRatio(false).toFile("images/image_region_coord.jpg");
- 转化图像格式
/** * outputFormat(图像格式) */
Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("png").toFile("images/image_1280x1024.png");
Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("gif").toFile("images/image_1280x1024.gif");
具体使用
- 根据图片的url获取HttpConnection
private HttpURLConnection getImageInputStream(String imageUrl) {
try {
URL url = new URL(imageUrl);
URLConnection urlConnection = url.openConnection();
HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
httpURLConnection.setConnectTimeout(1000 * 5);
httpURLConnection.connect();
return httpURLConnection;
} catch (Exception e) {
e.printStackTrace();
throw new ManageException("获取图片HttpConnection失败");
}
}
- 获取图片大小
在这里我们使用httpURLConnection.getContentLength()获取图片的总大小
而不是使用httpURLConnection.getInputStream().available()获取图片大小,因为可能存在网络波动从流中获取数据的大小只是一部分,并不能获取总的大小,但是如果是把图片先下载下来再用这个方法获取大小,那是可以的
- 压缩图片
Thumbnails.of(httpURLConnection.getInputStream()).scale(1f).outputQuality(qulity).toFile(dirPath + fileName);
分享几个经常用的转换工具
- 根据url获取对应的base64
public static String getBase64ByUrl(String urlPath) {
ByteArrayOutputStream data = new ByteArrayOutputStream();
try {
URL url = new URL(urlPath);
byte[] by = new byte[1024];
URLConnection urlConnection = url.openConnection();
HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
httpURLConnection.setConnectTimeout(1000 * 5);
httpURLConnection.connect();
InputStream inputStream = httpURLConnection.getInputStream();
int len;
while ((len = inputStream.read(by)) != -1) {
data.write(by, 0, len);
}
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
return Base64.getMimeEncoder().encodeToString(data.toByteArray());
}
- 文件转字节数组
public static byte[] fileToBytes(File file) {
byte[] fileBytes = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
fileBytes = new byte[(int) file.length()];
fis.read(fileBytes);
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
return fileBytes;
}
- 根据字节数组获取MD5
public static String getFileSignature(byte[] fileBytes) {
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance("MD5");
digest.update(fileBytes);
byte[] encryptBytes = digest.digest();
return HexHelper.toHexString(encryptBytes);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24101.html