JAVA 后端 图片压缩

第一次写博客  有点小紧张...

最近负责一个图片合成的功能,因为商品主图太大,合成后的图片有1MB多。

首先我得感谢一位大佬,如果没有他Image类转换BufferedImage类的工具,我可能明天早上才能睡觉了。

我推荐使用:谷歌图片处理插件(Thumbnailator)

pom的jar包依赖:

<!-- 图片处理 -->
<dependency>
   <groupId>net.coobird</groupId>
   <artifactId>thumbnailator</artifactId>
   <version>0.4.8</version>
</dependency>

添加jar包后,编写工具类:

/**
 * @author kcy
 * @version 2018-11-8
 * @param imgsrc   原图片路径
 * @param imgdist  压缩后新文件路径
 * @param width    宽
 * @param height   高
 * @param quality  图片质量 (0 - 1.0f)浮点型
 */
public void ImageCompression(String oldImg,String newsImg,int width, int height, Float quality) throws IOException {
    /**
       Thumbnails.of() <- 这个方法虽然可以直接使用原图路径读取图片,但是有很大几率会使压缩后的图片颜色失真。
       也建议不要用ImageIO.read()这种方法读取图片,灰常容易失真!
    **/
    //使用Toolkit.getDefaultToolkit().getImage()读取图片,防止图片颜色失真。
    Image image = Toolkit.getDefaultToolkit().getImage(oldImg);

    //Image转换BufferedImage
    BufferedImage bufferedImage = this.toBufferedImage(image);
    
    //图片压缩
    Thumbnails.of(bufferedImage).
               //新图片宽高
               size(width, height).
               //新图片后缀
               outputFormat(“jpg”).
               //保持长宽比例
               keepAspectRatio(false).
               //压缩质量
               outputQuality(quality).
               //新图片路径
               toFile(newsImg);
}
再加上Image转换BufferedImage的方法:
public BufferedImage toBufferedImage(Image image) {
    if (image instanceof BufferedImage) {
        return (BufferedImage) image;
    }
    // This code ensures that all the pixels in the image are loaded
    image = new ImageIcon(image).getImage();
    BufferedImage bimage = null;
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    try {
        int transparency = Transparency.OPAQUE;
        GraphicsDevice gs = ge.getDefaultScreenDevice();
        GraphicsConfiguration gc = gs.getDefaultConfiguration();
        bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
    } catch (HeadlessException e) {
        // The system does not have a screen
    }
    if (bimage == null) {
        // Create a buffered image using the default color model
        int type = BufferedImage.TYPE_INT_RGB;
        bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
    }
    // Copy image to buffered image
    Graphics g = bimage.createGraphics();
    // Paint the image onto the buffered image
    g.drawImage(image, 0, 0, null);
    g.dispose();
    return bimage;
}

压缩完成,减小图片颜色失真率,可以下班啦,美滋滋。

再次感觉编写Image类转换BufferedImage类的工具的大佬,谢谢,谢谢!。

 

 

 

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要将前端上传的图片存储到 OSS 上,需要进行以下步骤: 1. 前端上传图片。可以使用 HTML5 的 FormData API 或者第三方库,如 axios、jquery 等来实现图片上传功能。 2. 后端接收图片并上传到 OSS。可以使用阿里云 OSS 的 Java SDK,将图片上传到 OSS。 以下是一个简单的示例代码: ```java import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; public class OSSUtil { private static final String ENDPOINT = "oss-cn-hangzhou.aliyuncs.com"; private static final String ACCESS_KEY_ID = "***"; private static final String ACCESS_KEY_SECRET = "***"; private static final String BUCKET_NAME = "***"; /** * 上传文件到 OSS * * @param file 文件对象 * @return 文件访问路径 */ public static String upload(MultipartFile file) throws IOException { // 创建 OSS 客户端实例 OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET); // 获取文件名 String originalFilename = file.getOriginalFilename(); // 生成文件名,避免重名 String fileName = UUID.randomUUID().toString().replaceAll("-", "") + originalFilename.substring(originalFilename.lastIndexOf(".")); // 获取文件输入流 InputStream inputStream = file.getInputStream(); // 上传文件到 OSS ossClient.putObject(BUCKET_NAME, fileName, inputStream); // 关闭 OSS 客户端 ossClient.shutdown(); // 返回文件访问路径 return "https://" + BUCKET_NAME + "." + ENDPOINT + "/" + fileName; } } ``` 在上面的代码中,我们使用了阿里云 OSS 的 Java SDK,通过构建 OSS 客户端实例,实现了将文件上传到 OSS 的功能。其中,我们需要替换代码中的 ENDPOINT、ACCESS_KEY_ID、ACCESS_KEY_SECRET 和 BUCKET_NAME 参数为自己阿里云账号的相关信息。 3. 返回图片访问路径。上传成功后,需要将图片在 OSS 上的访问路径返回给前端,以便前端可以通过该路径访问图片。 以上就是将前端上传的图片存储到 OSS 的整个流程。需要注意的是,建议在后端上传图片时,对图片进行压缩和校验,以提高上传效率和安全性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值