如何让你的图片服务也有类似OSS的图片处理功能

这篇具有很好参考价值的文章主要介绍了如何让你的图片服务也有类似OSS的图片处理功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文链接

前言

有自己机房的公司一般都有一套存储系统用于存储公司的图片、视频、音频、文件等数据,常见的存储系统有以NAS、FASTDFS为代表的传统文件存储,和以Minio为代表的对象存储系统,随着云服务的兴起很多公司逐渐将数据迁移到以阿里云OSS为代表的云对象存储,OSS的好处是不但解决了数据的存储还自带的很多文件的处理功能,如图片的缩放、打水印、裁剪等功能,例如我们要获获取一张宽为200大小的图片只需要在原图后面增加?x-oss-process=image/resize,w_200这个参数就可以了,处理图片确实非常方便。
https://oss-console-img-demo-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_200。
传统的NAS、FASTDFS只有存储功能,没有文件处理能力的,我们可以使用图片处理软件给它加上类似的图片处理功能。常用的图片处理软件有ImagemagickGraphicsMagickOpenCV对应的JAVA操作库为im4javaJMagickJavacv。用上这些图片处理软件再配置Nginx+Lua或者OpenResty就可以让你的传统NAS存储也也有像OSS一样的图片处理能力。

ImageMagick、GraphicsMagick的安装

ImageMagick官网下载

官网下载地址:https://imagemagick.org/script/download.php
以windows为例,下载ImageMagick-7.1.1-15-Q16-HDRI-x64-dll.exe ,然后下一步、下一步安装就好了,安装完成后输入magick -version检查是否安装成功:

PS C:\Users\Administrator> magick -version
Version: ImageMagick 7.1.1-15 Q16-HDRI x64 a0a5f3d:20230730 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenCL OpenMP(2.0)
Delegates (built-in): bzlib cairo flif freetype gslib heic jng jp2 jpeg jxl lcms lqr lzma openexr pangocairo png ps raqm raw rsvg tiff webp xml zip zlib
Compiler: Visual Studio 2022 (193532217)

GraphicsMagick官网下载

GraphicsMagick最初源于ImageMagick5.5.2(2002年11月),但从那时起就完全独立于ImageMagick项目。自从ImageMagick的fork以来,许多作者使用开放的开发模型进行了许多改进(参见新闻),但没有破坏API或实用程序操作。下载地址:
http://www.graphicsmagick.org/download.html
安装完成后输出gm检测是否安装成功。

C:\Users\Administrator>gm
GraphicsMagick 1.3.40 2023-01-14 Q16 http://www.GraphicsMagick.org/
Copyright (C) 2002-2023 GraphicsMagick Group.
Additional copyrights and licenses apply to this software.
See http://www.GraphicsMagick.org/www/Copyright.html for details.
Usage: gm command [options ...]

JAVA操作

JAVA操作GraphicsMagick可以使用im4java
引入POM依赖im4java

        <dependency>
            <groupId>org.im4java</groupId>
            <artifactId>im4java</artifactId>
            <version>1.4.0</version>
        </dependency>

im4java官网地址:
https://im4java.sourceforge.net

im4java源码地址:im4java download | SourceForge.net

JAVA操作ImageMagick可以使用JMagick,引入POM依赖:

<dependency>
    <groupId>jmagick</groupId>
    <artifactId>jmagick</artifactId>
    <version>6.6.9</version>
</dependency>

JMagick官网地址:www.jmagick.org

JMagick源码地址:JMagick download | SourceForge.net

图片信息获取

命令获取图片信息

 magick identify .\1.jpg
.\1.jpg PNG 1920x1080 1920x1080+0+0 8-bit sRGB 1.31707MiB 0.000u 0:00.000

//格式化输出
magick identify -format '%W,%H,%B,%f,%m'  .\1.jpg
1920,1080,1381050,1.jpg,PNG

JAVA获取图片信息

    @Test
    public void info() throws IOException, InterruptedException, IM4JavaException {
        String iImageDir = "C:\\Users\\Administrator\\Desktop\\img\\1.jpg";
        IMOperation operation = new IMOperation();
        //格式化输出
        //operation.format("%W,%H,%B,%f,%m");
        operation.addImage(iImageDir);
        IdentifyCmd indentity = new IdentifyCmd();
        ArrayListOutputConsumer output = new ArrayListOutputConsumer();
        indentity.setOutputConsumer(output);
        indentity.run(operation);
        ArrayList<String> cmdOutput = output.getOutput();
        String line = cmdOutput.get(0);
        System.out.println(line);
        //C:\Users\Administrator\Desktop\img\1.jpg PNG 1920x1080 1920x1080+0+0 8-bit sRGB 1.31707MiB 0.000u 0:00.000
    }

注意事项

  1. 如果运行代码报org.im4java.core.CommandException: java.io.IOException: Cannot run program "identify": CreateProcess error=2, 系统找不到指定的文件。是因为刚安装软件,系统没找到命令,重启电脑后就可以解决。

  2. 可以使用-format '%W,%H,%B,%f,%m'来格式化图片信息的输出 ,具体的格式化参数有很多,详细可以参考官方文档,你想要的图片信息应该都是有的。https://imagemagick.org/script/escape.phps

图片缩放

命令图片缩放

magick .\1.jpg -resize 200x100 1_w200h100.jpg
magick identify -format '%W,%H,%B,%f,%m'  .\1_w200h100.jpg
输出:
178,100,8003,1_w200h100.jpg,JPEG

JAVA图片缩放

    @Test
    public void resizeImg() throws IOException, InterruptedException, IM4JavaException {
        String srcImagePath = "C:\\Users\\Administrator\\Desktop\\img\\1.jpg";
        Integer width = 200;
        Integer height = 100;
        String newImagePath = "C:\\Users\\Administrator\\Desktop\\img\\1_w200h100.jpg";
        IMOperation op = new IMOperation();
        op.addImage(srcImagePath);
        op.resize(width, height);
        op.addImage(newImagePath);
        ImageCommand convert = new ConvertCmd();
        convert.run(op);
    }

注意事项

这里我们使用 -resize 200x100 想生成一张200x100的图片,结果输出图片是178x100,因为原始图片为1920x1080为了保持图片宽高比例,做了等比例缩放,防止图片变形。

图片打水印

命令图片打水印

 magick composite  -geometry  '200x200+100+50'  -gravity  'center'  .\avatar.png .\1.jpg  1_avater.jpg

JAVA图片打水印

    @Test
    public void testaddImgWatermark() throws Exception {
        String srcImagePath="D://img/1.jpg";
        String destImagePath="D://img/1_avater.jpg";
        String waterImgPath="D://img/avatar.png";
        IMOperation op = new IMOperation();
        //水印大小
        op.geometry(1000,1000,1000,500);
        // 水印图片位置NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast
        op.gravity("NorthEast");
        // 水印透明度
        op.dissolve(100);
        // 水印
        op.addImage(waterImgPath);
        // 原图
        op.addImage(srcImagePath);
        // 目标
        op.addImage(destImagePath);
        ImageCommand cmd = new CompositeCmd();
        cmd.run(op);
    }

注意事项

  1. -geometry '200x200+100+50' 中的200x200是设置水印图片的大小,+200+50设置水印图片相对于gravity的位置
  2. -gravity 'center'是给定水印的相对原图的位置,支持NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast,这个参数和阿里OSS加水印的也是一样的。

最终打出水印的效果如下:

如何让你的图片服务也有类似OSS的图片处理功能,工具,WEB开发,Java,java,图像处理

图片裁剪

命令图片裁剪

magick convert -gravity  'center'   .\1_avater.jpg -crop  200x200+100+50 1_cut.jpg

JAVA图片裁剪

    @Test
    public  void testCrop()  throws Exception {
        String srcImagePath="D://img//1.jpg";
        String destImagePath="D://img/1_cut.jpg";
        IMOperation op = new IMOperation();
        op.gravity("center");
        op.addImage(srcImagePath);
        op.crop( 200,200,100,50);
        op.addImage(destImagePath);
        ImageCommand cmd  = new ConvertCmd();
        cmd.run(op, srcImagePath, destImagePath);
    }

最张裁剪效果:

如何让你的图片服务也有类似OSS的图片处理功能,工具,WEB开发,Java,java,图像处理

注意事项

  1. -crop 200x200+100+50 结合 -gravity 'center'刚好可以把我们打上的水印裁剪出来;
  2. 裁剪出的图片在左右两边还是有一点红色边框,这个可能是计算有一两个像素误差。

图片加参数自动处理

有了以上的图片处理命令之后想要实现OSS ?x-oss-process=image/resize,w_200这样加参数处理图片可以使用Nginx+Lua来实现,集成了Lua模块的Nginx项目OpenResty

例如我们原始图片地址:

http://127.0.0.1/img/1.jpg

自动缩放图片尺寸:

http://127.0.0.1/img/1_400x400.jpg

  1. 下载安装 OpenResty - Download
  2. 下载安装LUA Release Lua for Windows v5.1.5-52 Released · rjpcomputing/luaforwindows · GitHub

Nginx配置引入Lua:

http {
    lua_package_path 'D:\software\openresty\lualib\\?.lua;;';
    lua_package_cpath 'D:\software\openresty\lualib\\?.so;;';
}

Nginx配置文件中可以写成这样:

 location ~ '/img/(\d+)_(\d+)x(\d+).jpg$' {
	            root D:/img;
		    set $img_root  "D:/img/img";
		    set $fileName  ngx.arg[1];
		    set $width  ngx.arg[2];
		    set $height  ngx.arg[3];
		    set $origin "${img_root}/${fileName}.jpg" ;
		    set $file  "${img_root}/${fileName}_${width}x${height}.jpg";
		    if (!-f $file) {
			rewrite_by_lua '
			    local command = "magick  "..ngx.var.origin.." -resize "..ngx.var.width.."x" ..ngx.var.height.." "..ngx.var.file;
			    os.execute(command);
			 ';
		 }

	 }

当访问(http://127.0.0.1/img/1_400x400.jpg时可动态生成对应尺寸图片,类似OSS的功能:

如何让你的图片服务也有类似OSS的图片处理功能,工具,WEB开发,Java,java,图像处理

生成的文件,当然我们还可以使用Lua+Redis缓存这里生成的文件,如果有CDN还可以配置CDN缓存这些文件,下次就可以从CDN缓存直接取对应尺寸的图片了,减少服务器处理图片的性能消耗。很多大厂不将这种图片处理下沉到CDN边缘节点,利用离用户最近CDN节点完成图片数据的处理,减少数据回源,从而减少中心服务器的性能消耗。

如何让你的图片服务也有类似OSS的图片处理功能,工具,WEB开发,Java,java,图像处理

当然这个只是使用Nginx+Lua+GraphicsMagick来实现简单的图片裁剪功能,如果要实现阿里OSS图片处理要比这个复杂的多,不仅要解决大量文件存储高可要和自动扩容问题,还要解决高并发下图片裁剪的性能问题,们只是通过这个案例了解图片自动缩放的基本原理,原理看起来比较简单,想要做的好而且还要给全国那么多企业用,要保持高可用、高性能就比较有难度了。

总结

本文主要介绍了常用图片处理软件ImageMagick的使用,并通过命令和JAVA代码演示图片信息的获取、缩放、打水印、裁剪功能,在最后通过OpenResty+Lua实现类似OSS的自动图片缩放功能。文章来源地址https://www.toymoban.com/news/detail-647573.html

到了这里,关于如何让你的图片服务也有类似OSS的图片处理功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何在3周让你的工资从5000+变10000+

    做为开发者,若你的工资只有5000+,那么,你就有必要看看我的这篇文章。   女人要想过得好就要选好郎,男人要过得好就要选好行。同为开发者,同样工作经验,别人1w-5w,你却只有5k-1w,那你就要看看你用哪个工具进行开发。   据统计,Java相关职位的薪水在中国 IT 行业中

    2024年02月04日
    浏览(38)
  • CentOS 7 优化指南:让你的服务器跑得更快

    前言 作为一款稳定可靠的操作系统,CentOS 7 它被越来越多的服务器管理员和开发人员所采用。但是,在使用中我们也需要考虑一些优化措施,以使其更加适合我们的应用需求。 本文将介绍一些常见的 CentOS 7 优化方法,不仅可以让你的服务器跑得更快,还可以更好地提高服务

    2024年02月09日
    浏览(39)
  • 15分钟搭建无门槛服务器性能监控系统,让你的服务器运行如飞!

    服务器监控是每个互联网厂商都重视并且想要尽可能做好的事情,从数据收集、数据处理、数据可视化最终再到实时监控告警,这一系列复杂的流程可能耗费企业大量的人力和时间,以至于某些时候因为其复杂性高无法达到预期的监控效果。而当事故发生时才发现,由于监控

    2024年01月22日
    浏览(60)
  • 不用GPT4,如何让你的AI助理更加智能

    小伙伴们新年好啊,颓废的 2023 年总算是过去了,过去这一年因为自己的状态不太好,一直也没怎么更新,2024 年是时候重新拾起行囊再出发啦! 去年年底我写过一篇《大模型小助手,Mac 工程师如何拥有自己的人工智能》,在那篇文章里我介绍了如何利用自己手头的计算资源

    2024年02月22日
    浏览(40)
  • 如何让你的会话更安全,浅析Session与Cookie

            在我们面试的时候,面试官问及 XSS 漏洞的时候,我们常常会说比如劫持 Cookie,问及防御方法的时候,又常常会说设置 httponly ,本篇文章将从代码层面简单的普及 Session 和 Cookie 的生成过程,及防御的方法,希望看到这篇文章后,下一次遇到面试官的时候,你能够

    2024年02月22日
    浏览(53)
  • Animation Rigging 如何让你的Avatar人物更具灵活性

    Animation Rigging 是 Unity 官方发布的可以对 Avatar 人物骨骼进行约束的工具,已经有稳定的经过验证的 Vertified 包体,可以将其理解为一个 IK 工具,使用它可以让我们的人物动作表现更具灵活性。 Rig Builder 依赖 Animator 组件,所以将其与 Avatar 的 Animator 组件挂载于同一个物体上,

    2023年04月21日
    浏览(69)
  • 使用Ftp服务器+快解析软件,让你的文件随时随地可访问

    你是否曾经遇到过这样的情况?你在办公室工作到很晚,突然想起家里的电脑里有重要文件,但却无法立即访问?或者你想要和朋友分享一些照片,却发现你的电脑和他们之间的距离太远,无法直接传输文件?如果你正在为这些问题烦恼,那么Ftp服务器将成为你的救星。 什么

    2024年02月12日
    浏览(40)
  • JAVA Socket实现实时接收TCP消息,让你的服务端通信更高效!

    本文主要介绍如何利用socket实现实时接收服务端发送的TCP消息。 目录 一、需要掌握 二、程序源码 三、运行演示 网络调试助手下载:https://www.aliyundrive.com/s/6Y8L7Wv5sT6 网络通信协议的理解:JAVA socket是基于TCP/IP协议实现的,需要对TCP/IP协议有一定的了解,包括TCP连接的建立、数

    2024年02月11日
    浏览(43)
  • 从零到一,接入广告后如何让你的APP顺利实现冷启动?

    ​很多APP在上线后却面临着变现难的问题。其中一个主要原因就是缺乏有效的广告变现经验。而当这些APP开始接入广告时,又面临着如何顺利冷启动的问题。 本文将为您介绍一些关键的步骤和技巧,帮助您的APP在接入广告后成功实现冷启动。 提高用户留存率 广告变现不仅仅

    2024年02月06日
    浏览(69)
  • Python制作含微软雅黑字体的图片报错,中文字体报错可用类似方式处理

    运行以上代码,关键错误提示见下: FileNotFoundError: [Errno 2] No such file or directory: \\\'C:/windows/fonts/微软雅黑’ 关键错误代码: 可是明明就有这个文件在对应目录呀: 鼠标右键复制以上标红的这个 微软雅黑 文件,然后粘贴这个文件到另一个文件夹,即可发现,这个 微软雅黑 ,其

    2024年02月15日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包