专业的编程技术博客社区

网站首页 > 博客文章 正文

解决JAVA压缩图片变色问题(java压缩图片至指定大小)

baijin 2024-11-12 09:38:26 博客文章 7 ℃ 0 评论

在对接第三方平台上传商品时,会遇到平台上传图片有大小限制,聪明如我so easy,压缩一下图片再上传,但用JAVA图片压缩时,本地好好的,但在服务器实测竟然出现变色问题,在网上查了很多资料,各种方法都尝试过也无法解决。具体尝试过方案我就不多说,自行百度,都是泪,关键词:【JAVA图片压缩变色】。

最终在老运维的指导下,发现了一款越用越顺手的工具,可以绕过JAVA处理图片产生的各种问题。唯一缺点项目依赖了系统功能,在扩展程序时需要注意。

ImageMagick

ImageMagick可以调整图像大小,翻转,镜像,旋转,变形,剪切和变换图像,调整图像颜色,应用各种特殊效果或绘制文本,线条,多边形,椭圆和贝塞尔曲线。

ImageMagick是免费软件,可以即用型二进制分发形式提供,也可以作为源代码提供,您可以在开放应用程序和专有应用程序中使用,复制,修改和分发它们。它是在派生的Apache 2.0 许可下分发的。

可以运行平台:Linux, Windows, Mac Os X, iOS, Android OS, and others.

免费,多平台 ,搞他。

安装方法 下载 下一步 下一步 下一步 能不思考就不思考,有问题再说。

废话不多说,直接测试效果(具体有好多用法,自行百度一下)

直接上命令 压缩大小

magick convert 1.jpg -quality 80 2.jpg

压缩前后数据效果对比


在JAVA项目中使用

JAVA库中有 im4java、jmagick 等库,使用比较复杂,我更加倾向于使用命令行的方式去执行处理

引入hutool,不得不说,优秀的框架。

File file = null,tempFile = null;
try {
    tempFile = File.createTempFile("image_temp", ".jpg");
    file = File.createTempFile("image", ".jpg");
    downloadPicture( url , tempFile);
    if(isWindows()){ //判断平台 由于服务器用的是6 开发用7 命令行有变化
        Process process =  RuntimeUtil.exec( "magick" , "convert", tempFile.getAbsolutePath(),"-quality" ,"80"  , file.getAbsolutePath() );
         process.waitFor(30L,TimeUnit.SECONDS);
    }else{
        Process process =  RuntimeUtil.exec("convert", tempFile.getAbsolutePath(),"-quality" ,"80"  , file.getAbsolutePath() );
         process.waitFor(30L,TimeUnit.SECONDS);
    }

} catch (Exception e) {
    logger.info("url={},e={}",url,e.getMessage());
    e.printStackTrace();
} finally {
  
}

搞掂。发版完美运行,收工。

彩蛋

附上小实验,长图切图功能

根据图片的宽度 按照高1000px等比例切,全程自动完成,免计算,方便。

BufferedImage bfimg = ImageIO.read(new FileInputStream(sourceImg));
Process process =  RuntimeUtil.exec( "magick" , "convert",
        sourceImg.getAbsolutePath() ,"-crop" ,
        bfimg.getWidth() + "x1000"  ,
        tgFile.getAbsolutePath() + "\\"+code+".jpg");
System.out.println( info );
process.waitFor(30L,TimeUnit.SECONDS);

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表