草庐IT

Nginx图片剪裁模块探究 http_image_filter_module

煮酒品茶 2023-03-28 原文
官方地址:http://nginx.org/en/docs/http/ngx_http_p_w_picpath_filter_module.html

煮酒品茶:前半部安装和官方说明,后半部分实践

#yum install -y gd-devel


Install add http_p_w_picpath_filter_module Module

#./configure --prefix=/usr/local/nginx_p_w_picpath_filter/ --with-http_p_w_picpath_filter_module

#make && make install


use:


off:关闭模块处理


test:确保图片是jpeg gif png否则返415错误


size:输出有关图像的json格式:如下显示

{ "img" : { "width": 100, "height": 100, "type": "gif" } }

出错显示:

{}


rotate 90|180|270:旋转指定度数的图像,参数可以包括变量,单独或一起与resize crop一起使用。


resize width height:按比例减少图像到指定大小,公减少一个可以另一个用"-"来表示,出错415,参数值可包含变量,可以与rotate一起使用,则两个一起生效。


resize width height:按比例减少图像大小,其它和rotate一样。


crop width height:按比例减少图像比较大的侧面积和另一侧多余的载翦边缘,其它和rotate一样。没太理解


#设置读取图像缓冲的最大大小,超过则415错误。

syntax:p_w_picpath_filter_buffer size;

default:

p_w_picpath_filter_buffer 1M;

context:http, server, location


#如果启用,最终的图像将被交错。对于JPEG,最终的图像将在“渐进式JPEG”格式。

syntax:p_w_picpath_filter_interlace on | off;

default:

p_w_picpath_filter_interlace off;

context:http, server, location

This directive appeared in version 1.3.15.


#设置变换的JPEG图像的期望质量。可接受的值是从1到100的范围内。较小的值通常意味着既降低图像质量,减少传输数据,推荐的最大值为95。参数值可以包含变量。

syntax:p_w_picpath_filter_jpeg_quality quality;

default:

p_w_picpath_filter_jpeg_quality 75;

context:http, server, location


#增加了最终图像的清晰度。锐度百分比可以超过100。零值将禁用锐化。参数值可以包含变量。

syntax:p_w_picpath_filter_sharpen percent;

default:

p_w_picpath_filter_sharpen 0;

context:http, server, location


#定义是否应该透明转换的GIF图像或PNG图像与调色板中指定的颜色时,可以保留。透明度的损失将导致更好的图像质量。在PNG的Alpha通道总是保留透明度。

syntax:p_w_picpath_filter_transparency on|off;

default:

p_w_picpath_filter_transparency on;

context:http, server, location


p_w_picpath_filter resize width height;

Json:


品茶:这比例不知道具体怎么算的测一测。

nginx.conf:

---------------------------------------------------

       location ~* /p_w_picpath {

               p_w_picpath_filter resize 200 200;

       }

---------------------------------------------------


测试数据过程:每次重启nginx 和清浏览器缓存并多次刷新


长>宽

Test1:

Test2:





长<宽


品茶:那么就容易理解了:

1、先进么判断长还是宽哪个像素占的多。

2、长/宽做成一个比例。

3、如果长占像素多就以长为标准,宽为比例。

4、如果宽占像素多就以宽为标准,长为比例。


模拟程序


l = get(jpg.l) w = get(jpg.k) g = l / w if l > w: print nginx.l nginx.l/g else: print nginx.w*w w

p_w_picpath_filter rotate 90 | 180 | 270;

品茶:只能用这三个值,不然nginx启动报错。分别是左转倒转和右转,逆时针的。

nginx.conf

---------------------------------------------------------

       location ~* /p_w_picpath {

               #p_w_picpath_filter resize 500 500;

               p_w_picpath_filter rotate 90;

       }

---------------------------------------------------------

逆时针90度 :90

逆时针180度:180

逆时针270度:270

那就明显了。

resize:图片完整,比例缩小。

crop:图片不完整,但完全按我们提供的来。

rotate:旋转图片。

测试一下test


test:

{ "img" : { "width": 1920, "height": 1200, "type": "jpeg" } }

test2:

{ "img" : { "width": 1920, "height": 1080, "type": "jpeg" } }

test3:

{ "img" : { "width": 354, "height": 586, "type": "png" } }

输出json格式,可以用来调用。


p_w_picpath_filter_buffer size;

我们试试超过1M的文件

415 Unsupported Media Type

品茶:这个值看你怎么设了,因为iphone现在拍的原图基本上是4-8M左右


p_w_picpath_filter_interlace on

品茶:渐进式jpeg没懂啥意思


p_w_picpath_filter_jpeg_quality quality; #quality:1-100

品茶:这个值控制图片的质量,影响清晰度


nginx.conf

-----------------------------------------------------------------

       location ~* /p_w_picpath {

               p_w_picpath_filter_jpeg_quality 20;

               p_w_picpath_filter resize 500 500;

               p_w_picpath_filter_buffer 10M;

               p_w_picpath_filter_interlace on;

               #p_w_picpath_filter rotate 20;

               #p_w_picpath_filter crop 200 200;

               #p_w_picpath_filter size;

               #p_w_picpath_filter test;

       }

------------------------------------------------------------------



品茶:这就是效果


p_w_picpath_filter_sharpen percent;

品茶:锐化比


p_w_picpath_filter_transparency on|off;

品茶:透明损失度


品茶:想了一下写几个规则,可能有用。


比如匹配全站所有的结尾图片

----------------------------------------------

       location ~* \.(jpg|gif|png)$ {

               p_w_picpath_filter resize 500 500;

       }

----------------------------------------------


匹配某个目录所有图片

----------------------------------------------

       location ~* /p_w_picpath/.*\.(jpg|gif|png)$ {

               p_w_picpath_filter resize 500 500;

       }

----------------------------------------------


再比如用url来指定

---------------------------------------------------

       location ~* (.*\.(jpg|gif|png))!(.*)!(.*)$ {

               set $width      $3;

               set $height     $4;

               rewrite "(.*\.(jpg|gif|png))(.*)$" $1;

       }


       location ~* .*\.(jpg|gif|png)$ {

               p_w_picpath_filter resize $width $height;

       }

---------------------------------------------------

那么效果是:

品茶:是不是很cool,哈哈,更新完毕了。

有关Nginx图片剪裁模块探究 http_image_filter_module的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  6. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  7. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  8. ruby - 为什么人们使用 `Module.send(:prepend, …)` ? - 2

    我正在学习如何在我的Ruby代码中使用Module.prepend而不是alias_method_chain,我注意到有些人使用send调用它(example):ActionView::TemplateRenderer.send(:prepend,ActionViewTemplateRendererWithCurrentTemplate)而其他人直接调用它(example):ActionView::TemplateRenderer.prepend(ActionViewTemplateRendererWithCurrentTemplate)而且,虽然我还没有看到任何人使用这种风格,但我从

  9. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  10. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

随机推荐