图片即时优化的三种简单解决方案

快速排序及优化方案 文章目录快速排序及其优化方案1. 快速排序的流程2. 快速排序的实现时间复杂度计算3. 快速排序优化随机获取基准值进行优化3.2二路快速排序原理:思想:4. 总结 快速排序及其优化方案 1. 快速排序的流程 首先设定一个分界值,通过该分界值将数组分成左右两部分。 将大于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边,而等于分分界值的部分放在相对中间的部分。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于分界值,相对中间的部分的的数据等于分界值。 然后,左边和右边的数据可以独立排序 阅读详情

本文要点

  • Web页面中的图片往往是页面加载缓慢的最主要原因;
  • 图片优化很复杂,涉及大小调整、裁剪、格式转换及质量参数微调;
  • 如今,有的云服务可以即时优化图片,极大地改善用户浏览包含图片的Web页面时的体验;
  • 云服务提供了简单的API用于操作图片;
  • 读者可以立即应用其中的一项服务,毫不费力地提升网站性能。

图片往往是导致页面加载缓慢的最主要原因。一些研究表明,以兆字节计的Web页面还在稳步增加,图片更是其中最大的部分。显然,大部分网站可以通过图片优化大幅提升性能。

本文将介绍如何使用Kraken.io、Cloudinary和Imgix三种不同的云服务,借助几行代码轻松实现图片的自动优。你可以立即使用这些服务中的一种减少网站图片文件的大小,大幅提高页面加载速度和带宽使用率。

图片优化涉及哪些方面?

在开始介绍如何自动优化图片之前,首先让我们了解下图片优化的基本要素:图片大小及调整、图片格式、图片质量或压缩。下面是图片优化的常见步骤,每一步对应其中一项要素:

  • 根据图片在Web页面上实际占用的空间调整图片大小及裁剪图片。我们认为,在浏览器端调整大小是不好的做法,因为那会强制用户无谓地下载大图片。
  • 将图片转换成最恰当的文件格式。对于不同类型的图片,情况可能会有所差别;在某些情况下,PNG是最优的格式,而在其他情况下则是JPEG。如果用户有一个现代浏览器,则可以使用那个浏览器支持的新文件格式。例如,只有Chrome支持的WebP格式,或者IE9及以上版本支持的JPEG-XR格式。
  • 优化目标文件格式的压缩。例如,JPEG图片有一个质量设置。指定一个小于100%的质量百分比会压缩图片,但同时也会降低视觉品质。优化的艺术是找出不会导致可见质量损失的最高压缩水平(图片质量确实降低了,但只是轻微的,所以人根本注意不到)。确切的压缩阈值会因图片和格式的不同而有所差别。

另外一种优化是去掉文件中不必要的元数据。大部分照片都包含相机和图形应用存储的元数据,这增加了图片的大小,而且终端用户并不需要。本文将要介绍的所有图片优化服务都会同时去掉这类元数据。

上述步骤非常耗时,而且需要具备专业知识才能达到理想的效果。对于只有几张图片的网站而言,也许可以手工优化图片。不过,在现代网站上,一个页面就有几十或者几百张图片,所以,自动化是有必要的。

首先让我们看下如何手工优化图片。然后,我们将向你展示如何使用其中每一种云图片服务自动实现同样的优化。

下面是参考图片。这是一个2048 X 1365像素的PNG文件,大小为3975KB。

图片来源:Marika Mariani on Flickr

为了让情况更复杂一些并充分利用不同工具的功能,我们假设这个横向图片需要刚好放入网页上用于放置肖像的纵向区域。下面是示例Web网页,借用了Wikipedia上的Parrots条目:

(点击查看大图)

为了优化这个图片并将其放到网页上,我们需要执行以下步骤:

  • 调整图片大小并进行裁剪,保证鹦鹉在可用区域里可见,而又不损失原始图片的长宽比。图片会明显变小。

  • 从PNG转换成一个对这个图片而言更有效的文件格式,如JPEG。
  • 压缩图片,减少文件大小,而又不降低图片的视觉品质。

每个步骤都会明显减少文件大小,而又不会在视觉上降低质量。总之,如果我们调整图片大小,转换到一个更精简的文件格式,优化该格式的压缩参数,那么结果图片会是原始图片的一小部分。

现在让我们看下,如何使用三种图片管理服务的其中一种自动实现这种转换,并且看下它们在每个阶段可以将文件缩小多少。

请记住:这不是一个基准。图片内容不同,构图不同,优化后的文件大小可能会有差异。因此,这不是在对不同服务的有效性进行绝对测试,其有效性可能会因为图片类型的不同而不同。

使用Kraken.io优化图片

Kraken.io是一项专门针对图片优化的云服务。其免费方案提供100MB的图片存储。

Kraken提供一个API,你可以通过编程上传图片,或者提供一个指向该图片的URL。在调用这个API时,你可以给服务发送指令,让其对图片执行特定的优化,并下载优化后的新版本。

下面是使用Kraken优化鹦鹉图片的步骤:

1.注册Kraken账户,安装相关SDK,验证自己的身份,并使用POST请求将图片上传到Kraken。

使用Kraken的PHP SDK,上传代码如下:

$kraken = new Kraken("your-api-key", "your-api-secret");

$params = array(
    "file" => "/path/to/image/parrot.jpg",
    "wait" => true
);

$data = $kraken->upload($params);

2.上述代码只是上传图片。我们需要将图片大小调整到要求的尺寸(190 X 270 px),同时,我们还需要裁剪图片,以便我们可以把注意力集中在鹦鹉上,而又不损失长宽比;我们不能只是按照尺寸要求拉伸图片,因为那会使图片失真。

为了调整图片大小及裁剪,我们将修改上述代码,增加一些新参数。"strategy" => "fit"是指将图片大小调整到要求的尺寸,并保留原来的长宽比。"crop_mode" => "e"或"East"是说图片裁剪要以鹦鹉所在的右侧为重点。

$params = array(
       …
        "resize" => array(
        "width" => 190,
        "height" => 270,
        "strategy" => "fit",
        "crop_mode" => "e"
    )
);

API调用的响应中包含一个URL,你可以通过它下载优化后的文件。它看起来是下面这样:

文件大小已经降至105KB,除了调整大小,还没有做其他任何优化。

注意:在默认情况下,Kraken API会去掉图片的所有元数据,因为,当我们调整文件大小时,它会自动删除元数据,将文件大小降得更低一点。我们考察过的其他服务也是如此。

3.现在,让我们把格式从PNG转换成JPEG:

$params = array(
    …
    "convert" => array(
       "format" => "jpeg",
       "background" => "#ff0000"
    )
)

修改后的API调用会返回一个不同的下载URL,图片格式为JPEG:

文件大小现在降至88KB。

4.最后,我们会优化JPEG图片的质量。这是像Kraken这样的图片优化解决方案的亮点所在。Kraken提供了一个简单的参数lossy。把这个参数添加到API调用的图片参数里,我们可以告诉Kraken将JPEG质量将至最低,而这种质量上的差异是人眼感觉不到的。

$params = array(
    …
    "lossy" => true
)

结果看上去和上面的图片非常相似,但JPEG质量降低了:

新文件仅有29KB,比PNG图片调整大小后减少了72%。这只是由图片压缩带来的改善,因为我们之前已经调整了PNG图片的大小。

这是Kraken在不损失视觉感知品质的情况下所能做的最大压缩。原始文件大小为3975KB,也就是说,在文件大小方面,新文件减少为原来的1/137。

5.一种更进一步的优化方法是将图片转换成最为优化的WebP文件格式,而不是JPEG。不足之处是,只有Chrome浏览器支持WebP。为此,我们将转换参数替换为webp参数,并保留lossy参数,将WebP图片的大小尽可能将至最低。

$params = array(
    …
    "webp" => true,
    "lossy" => true
)

结果看起来是这个样子(只有在Chrome浏览器上可见)。

最终的WebP文件只有11KB,比调整大小后的PNG文件小89%,是原始文件的1/361。

下面是使用Kraken API生成这个结果的完整PHP代码。最后一行代码获取URL下载优化后的图片。

require_once("Kraken.php");

$kraken = new Kraken("your-api-key", "your-api-secret");

$params = array(
    "file" => "/path/to/image/parrot.jpg",
    "wait" => true
    "resize" => array(
        "width" => 190,
        "height" => 270,
        "strategy" => "fit",
        "crop_mode" => "e"
        "webp" => true,
        "lossy" => true
);

$data = $kraken->upload($params);

$result = $data["kraked_url"];

注意:Kraken郑重声明,结果URL不应该直接用在网站上,应用程序应该下载图片,保存在本地,并通过一个本地URL提供。

使用Cloudinary优化图片

Cloudinary是一项执行图片优化的云图片服务,还提供各种各样的图片操作、云存储和CDN分发。Cloudinary的免费方案提供2GB的云存储,75000张图片,每月7500次图片转换。

Cloudinary使用一种不同于Kraken的架构。在Cloudinary中,你将图片上传到永久云存储,然后Cloudinary服务会将图片直接分发给你的网站用户。

一个动态URL语言指定需要的图片操作或优化。当URL中有参数变化了,图片会即时调整,用户会看到调整后的图片。我们考察的另外一项服务Imgix,使用了类似的方法。

下面是使用Cloudinary优化鹦鹉图片的步骤:

1.注册Cloudinary账户,使用管理UI上传图片,或者安装Cloudinary SDK,并使用upload函数。在PHP SDK中,代码类似下面这样:

public static function upload($file, $options = array())

注意:和Kraken不同,我们不用在选项数组中传递图片操作参数,因为图片操作后续是即时完成的。Cloudinary提供了额外的上传选项,包括客户端上传,让用户可以上传他们自己的图片。更多信息,请查看Cloudinary的PHP图片上传文档。

2.让我们将图片调整并裁剪至190 X 270px,并保持长宽比不变。

cl_image_tag(
     "parrot.png", 
     array(
          "width"=>190, 
          "height"=>270, 
          "crop"=>"fill",
          "gravity"=>"auto")
     )
)

参数"gravity" => "auto"是Cloudinary的一项特性,即使用对象检测自动定位图片中最突出的的物体上。这是一种扩展性更好的方法,不需要针对每张图片调整参数。

上述代码生成了一个HTML图片标签,指向动态图片URL,例如:

<img src=”http://res.cloudinary.com/agile-seo/image/upload/h_270,w_190,c_fill,g_auto/parrot_marika_mariani.png”>

新文件大小为103KB。

3.我们将文件从PNG转换成JPEG。在Cloudinary中,这只需要改变文件扩展名:

cl_image_tag(
     "parrot.jpg", 
     array(
           "width"=>190, 
           ...
     )
)

现在,文件只有27KB了。这已经远远低于我们对于全品质JPEG图片的预期了,这表明,Cloudinary已经对图片进行了某些优化。

4.接下来,我们将通过添加"quality"=>"auto"参数全面优化JPEG质量:

cl_image_tag(
     "parrot.jpg", 
     array(
          …
          "quality"=>"auto"
          )
     )
)

现在,文件大小是15KB,比调整大小后的PNG图片小了85%。

总得来说,Cloudinary将原始文件的大小缩减为原来的1/265。

5.让我们将图片转换为更优化的文件格式。Cloudinary提供了参数"format"=>"auto",可以根据用户的浏览器动态设置图片格式(将图片即时转换成那种格式)。在Chrome浏览器上会自动生成WebP格式的图片。在新版本的Explorer上会生成JPEG-XR格式的。

请注意:文件扩展名仍然是“.jpg”,但实际上,文件格式是根据图片分析和用户浏览器自动确定的。如果你查看Chrome中的URL并下载图片,你就会看到,图片是WebP格式的。

经过质量优化的WebP格式的图片大小为12KB。Cloudinary的WebP优化在文件大小上比优化后的JPEG小20%。

还有一点需要特别注意,就是Cloudinary通过CDN分发图片。这只是一种为了让用户更快地取回图片的额外优化,不会影响文件大小。

使用Imgix优化图片

Imgix的工作原理与Cloudinary类似:上传图片,然后在你的代码中生成一个动态URL,对图片执行不同的优化。和Cloudinary一样,Imgix是一个全功能的图片管理解决方案,提供很多图片操作、云存储和CDN分发。

Imgix提供了免费试用方案,允许用户基于API进行大约3000次图片操作。

下面是使用Imgix优化鹦鹉图片的步骤:

1.注册Imgix账户。Imgix不支持直接上传图片,因此,我们需要将图片放到一个已有的Web文件夹下,并从Imgix控制板连接过去。然后,就可以通过Imgix子域名访问该图片了,即agileseo.imgix.com/my_image.png。

2.让我们裁剪并调整图片大小。使用Imgix PHP SDK,生成动态图片URL的代码如下:

use Imgix\UrlBuilder;

$builder = new UrlBuilder("demos.imgix.net");
    $params = array(
           "w" => 190, 
           "h" => 270,
           "fit" => "crop",
           "crop" => "edges",
     );
echo $builder->createURL("parrot_marika_mariani.png", $params);

w、h、fit和crop参数调整图片的大小,并聚焦于鹦鹉。Imgix有一个“边缘检测”特性(由"crop" => "edges"激活),在裁剪图片的同时,可以聚焦于图片上最重要的部分。

结果图片的大小为119KB。

3.现在,我们将添加参数"fm" => "jpeg",将图片转换成JPEG格式。

结果文件大小为24KB。

4.添加参数"auto" => "compress",优化JPEG压缩。

最后,经过优化的JPEG文件大小为13KB,比调整大小后的PNG图片小89%。

5.和Cloudinary一样,Imgix提供了一个参数,可以根据图片和用户的浏览器自动选择最佳图片格式。参数是"auto" => "format"。

WebP格式的文件竟然比压缩过的JPEG大,为24KB。这有点奇怪,但在我们看来,Imgix不允许同时使用compress和format选项(我们试过了,没有效果),因此,当选择auto=format时,Imgix会提供一张WebP图片,但没有优化压缩。

即使不进行WebP压缩,使用JPEG格式,Imgix也可以将文件大小降至1/305。

和Cloudinary一样,Imgix通过CDN分发图片,这会额外提升用户取回图片的速度。

结果汇总:图片文件大小缩减了250倍

如上所述,本文不是为了提供一个基准,只是让你对自动化图片优化可以达到怎么样的文件大小缩减有一些认识。

下表汇总了我们使用这三种工具的优化结果。如上所述,虽然文件大小大幅缩减,图片质量有所下降,但所有服务生成的图片在视觉上都相当不错。

(点击放大图像)

有趣的是,对于这张特定的参考图片,Cloudinary和Imgix的JPEG转换非常高效,它们几乎将文件大小降至WebP图片的水平。图片内容、构图和复杂度不同,效果可能会有所差异。

实现图片自动优化的动机很明确:毫不费力地即时缩减图片大小,大幅提升网站的性能。我们考察的三项服务全都非常简单,并且提供了免费试用方案,我们建议你试下这些服务,让你的网站保持良好的状态。


转载地址:http://www.infoq.com/cn/articles/optimize-image-solutions

cloudinary迁移以及前端上传 1.简介 最近做了一次本地文件到cloudinary迁移以及前端上传到cloudinary的改动,这里记录以下问题: 本地目录上传到cloudinary目录 上传后保证url与目录结构相似 前端上传渲染标签以及监听函数 2.上传本地目录到cloudinary 可以直接打开:https://cloudinary.com/console/xxxxxx/media_library/folders/home,进入Cloudinary Management Console / Me... 阅读详情

相关推荐

实现图片上传即时预览功能的全面教程

HTML5标签允许用户从设备中选择文件,并上传到服务器。这是一个简单的表单控件,但其背后的功能远比我们看到的要复杂。云存储是一种通过互联网提供的数据存储服务,它将数据存储在网络连接的远程服务器上,由服务提供商管理。云存储可以提供极高的弹性和可扩展性,同时降低了本地存储设备的维护成本。在文件上传和管理方面,云存储技术为用户提供了如下优势:可访问性:用户可以随时随地通过网络访问文件。灵活性:云服务可以根据需要轻松扩展或缩减。可靠性。

weixin_42551310的博客 1461

使用Cloudinary向每个用户提供完美的图像

什么是Cloudinary? ( What is Cloudinary? ) Cloudinary has reinvented the way that media is managed online. It provides a comprehensive cloud-based image and video management solution used by web and mobi...

culiu9261的博客 2039

实现Java图片即时上传并显示功能

Servlet是Java EE规范之一,它定义了一套接口,用于处理客户端请求,并生成响应。Servlet运行在服务器上,能够响应客户端的请求并动态生成页面。在文件上传的场景中,Servlet可以处理HTTP POST请求,从而接收和处理用户上传的文件数据。Apache Commons FileUpload是Apache的一个开源项目,它简化了文件上传的处理过程。

weixin_36474001的博客 1149

快速排序的4种优化

快排思想 快排基准的选择 固定基准 随机基准 三数取中 快速排序的优化 优化1:序列长度达到一定大小时,使用插入排序 优化2:尾递归优化 优化3:聚集元素 优化4:多线程处理快排 快排思想 快排算法是基于分治策略的排序算法,其基本思想是,对于输入的数组a[low, high],按以下三个步骤进行排序。 (1)分解:以a[...

Tyler_Zx的博客 5万+

企业即时通讯:263软件解决方案的全面剖析

htmltable {th, td {th {pre {简介:在信息时代,企业内部沟通效率和安全对组织运行至关重要。”263即时通讯软件”应运而生,提供基础与高级功能,包括文本、语音、视频通讯,文件传输,邮件管理等,以实现企业内部高效协作。软件设计考虑了安全性,通过权限控制等措施保护信息安全,并通过简单的安装程序实现快速部署,为企业提供一站式沟通解决方案,降低成本并提高运营效率。

weixin_33481022的博客 758

js-core:用于使用 imgix 生成图像 URL 的 JavaScript 客户端库

@imgix/js-core是一个 JavaScript 库,用于使用生成可用于浏览器或服务器端设置的图像 URL。 ImgixClient.buildSrcSet(path, params, options) 固定图像渲染 自定义宽度 宽度公差 最小和最大宽度范围 可变品质 Web 代理源 每个请求的Ixlib参数是什么? 测试 执照 安装 @imgix/js-core 可以通过 npm 安装: npm install @imgix/js-core 用法 根据你的模块系统,使用 @imgix/js-core 有几种不同的方式。 最常见的入口点是ImgixClient类。 每当您向ImgixClient提供数据时,请确保它尚未进行 URL 编码,因为库会在内部处理正确的编码。 通用JS const ImgixClient = require ( "@imgix/js-co

赞助商:imgix —实时图像调整服务

想要利用srcset属性或<picture>元素,但是不想存储每个图像的不同版本? 想要对不固定浏览器的图像应用模糊处理吗? imgix可以提供帮助。 imgix是实时图像大小调整服务和CDN。 只需更改其URL,即可调整图像大小,裁剪和处理图像。 混合和匹配超过90个URL参数,以无限多种方式处理图像。 它是免费注册的,每个新帐户均可获得10美元的信用额。 不要让工程约束...

CSS 初学者指南 661

DAGGER vs 传统模仿学习:为什么数据聚合能提升模型性能?

本文深入对比了DAGGER与传统模仿学习,揭示了传统方法因“分布不匹配”导致性能下降的根源。DAGGER通过动态的**数据聚合**机制,在智能体自身策略产生的状态分布上收集专家数据,从根本上解决了误差累积问题,从而显著提升了模型在实际部署中的鲁棒性和性能。

weixin_29170327的博客 234

iOS即时通讯发送图片消息内存暴涨优化

优化IMSDK发送图片导致的内存上涨过快。

gavincarter 820

lgv20刷twrp_LG港版v20 root

这是LG港版v20 root,整理了一下有关LG港版v20的官方固件包了,有没有需要的呢,这里把固件包整理一下也是方便大家以后好下载了,因此有一些机友还是不知道在哪里下载官方的rom包,在这里说的固件rom包也就是原版的系统包了,大家可以放心的使用,这些系统包也都是支持线刷的,大家下载下来解压出来根据里面的相关教程来操作就可以了,很简单的,如果你也需要的话就一起来看看吧。软件提示注意!! 此过程会...

weixin_33212263的博客 5387

使用TinyProxy搭建代理服务器

背景 办公电脑所在网络无法连接外网,机房服务器可以连接外网,通过服务器代理上网; 一、CentOS下TinyProxy安装–搭建代理服务器 TinyProxy是个轻量级简单的HTTP/HTTPS代理程序,GitHub和官网,安装方式这里主要介绍两种 CentOS下yum安装,参考:TinyProxy安装 Docker安装 先安装docker环境yum install docker -y 二、Win10下使用 ...

椰汁菠萝 1万+

JVM系列之:关于即时编译器的优化措施

本文为《深入学习 JVM 系列》第十七篇文章 我们来继续讲解 Java 虚拟机中的即时编译。 Profiling 上篇文章中介绍了关于分层编译的交互关系图,这里再贴一遍。 对于图片中描述的四种编译途径做过详细介绍,这里就不重复介绍了,其中提到了如下内容:分层编译中的 0 层、2 层和 3 层都会进行 profiling,收集能够反映程序执行状态的数据。其中,最为基础的便是 2层进行的 profiling,它只需要统计方法的调用次数以及循环回边的执行次数,当统计之和超过阈值就会触发即时编译。 0 层和 .

Herishwater的博客 873

一文告诉你:如何在trae中编译运行GD32程序,并让AI帮你修改代码

本文详细介绍了如何将GD32程序如何用官方固件库构建出来,然后从Keil迁移到国产免费工具Trae,并利用AI进行代码修改的全过程。

水滴爬呀爬 2661

web资源优化之图片加载的时机

前言 图片资源是WEB项目中很重要的组成部分,也是交互设计中一个很重要的体现,往往一张图能胜过千言万语,所谓“一图胜白言”就是这个道理。然后大量的图片也会给服务器带来很大的压力,据统计:图片内容已经占到了互联网内容总量的62%,也就是说超过一半的流量和时间都用来下载图片,那么问题就来了。如何最大化优化图片资源,图片优化的手段有那些?本章就首先谈谈通过图片的加载时机来优化WEB性能。 即时加

a0100034930的专栏 758

【重启后nvidia-smi 命令出现错误】

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

qq_44769377的博客 5211

Ubuntu系统等保3级配置核查与加固

虽然这种方法在某些老旧的系统中仍然有效,但现代Linux发行版通常不推荐使用hosts.deny和hosts.allow文件来管理防火墙规则,因为它们的功能已经被更现代的防火墙管理工具(如iptables或firewalld)所取代。如果你想禁止特定的环境变量,可以从这个列表中移除它们,或者如果你想完全阻止所有环境变量的传递,可以将其设置为空。你可以通过ssh-keygen生成密钥对,并将公钥添加到用户的~/.ssh/authorized_keys文件中。修改配置后,需要重启SSH服务以使更改生效。

悦分享 183

即时通讯项目

即时通讯项目

weixin_51332735的博客 1375

点云中概念:匹配、配准、融合

匹配,是寻找与一幅图相似的图像(不对寻找到的图像做矫正)。 配准,是寻找相似图像但是变形后的图像(需要做一些旋转之类的校正变换)。 融合,是多幅图像连接成一幅大图,视频集成中用的比较多。 1)匹配: 2)配准: 比如由于固定式激光雷达受测量方式的限制和被测物体集合形状的限制,固定的话一次只能扫描被测物体有限范围的点云数据(比如一个面??),这需要在多个视角下进行多次扫描(就是将激光雷达前后左右四个面都扫一下??对的),然而每个视角下得到点云数据都具有独立的坐标系,无法直接进行拼接(拼接就是将四个面

m0_37957160的博客 1万+
上一篇: Spring2.5的新特性:第一部分
下一篇: Java 详解 JVM 工作原理和流程
CZ__
博客等级 码龄9年 97粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值