Thumbnails压缩图片

Thumbnails压缩图片应用场景在和腾讯广点通交互生成视频的智能封面时,由于返回的智能封面图片的大小太大超出了限制,因此需要把图片压缩大小后再上传至腾讯关于图片压缩的解决方案在这里我主要使用的是Thumbnails来进行图片的压缩,下面会简单介绍一下工具类的使用。依赖<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId>

大家好,欢迎来到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");

具体使用

  1. 根据图片的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失败");
        }
    }
  1. 获取图片大小
在这里我们使用httpURLConnection.getContentLength()获取图片的总大小
而不是使用httpURLConnection.getInputStream().available()获取图片大小,因为可能存在网络波动从流中获取数据的大小只是一部分,并不能获取总的大小,但是如果是把图片先下载下来再用这个方法获取大小,那是可以的
  1. 压缩图片
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

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信