JavaScript 图像替换

JavaScript 图像替换技术检查设备能力,然后“做正确的事”。 您可以通过 window.devicePixelRatio 确定设备像素比,获取屏幕的宽度和高度,甚至可通过 navigator.connection 或发出假请求来执行某种网络连接嗅探。收集了所有这些信息后,您就可以决定加载哪个图像。

此方法的一大缺陷是,使用 JavaScript 意味着您将延迟加载图像,至少要等到先行解析器结束。 这意味着,图像要等到pageload 事件触发后才能开始下载。此外,浏览器很可能会同时下载 1x 和 2x 图像,导致页面重量增加。

内联图像:光栅图像和矢量图像

创建和存储图像有两种全然不同的方式,这将决定您如何以自适应方式部署图像。

光栅图像:如相片及其他通过单个颜色点网格表示的图像。光栅图像可来自照相机或扫描仪,也可以借助 HTML canvas 元素创建。可使用 PNG、JPEG 和 WebP 之类的格式存储光栅图像。

矢量图像:如徽标和艺术线条,是由一系列的曲线、直线、形状、填充色和渐变色定义的。矢量图像可通过 Adobe Illustrator 或 Inkscape 之类的程序创建,或使用 SVG 等矢量格式在代码中手动写入。

SVG

使用 SVG 可在网页中包含自适应矢量图像。矢量文件格式比光栅文件格式有优势的地方在于,浏览器可以渲染任何大小的矢量图像。矢量格式描述的是图像的几何图形,即该图像是如何通过线条、曲线和颜色等构造的。而光栅格式仅提供与单个颜色点有关的信息,因此,在进行缩放时,浏览器必须猜测如何填充空白。

内联的优缺点

图像的内联代码可能很冗长,特别是 Data URI 格式的图像,那么您为什么要使用它呢?为了减少 HTTP 请求!SVG 和 Data URI 可实现通过一个请求检索整个网页,包括图像、CSS 和 JavaScript。

缺点:

  • 与来自外部 src 的图像相比,在移动设备上 Data URI 格式图像的显示速度要慢得多。
  • Data URI 会显著增加 HTML 请求的大小。
  • Data URI 会增加标记和工作流的复杂性。
  • Data URI 格式的图像比二进制格式的图像大很多(最多大 30%),因此不会减小总下载大小。
  • Data URI 无法缓存,因此必须为使用它们的每一个页面分别进行下载。
  • IE 6 和 7 不支持 Data URI,IE8 仅提供有限支持。
  • 对于 HTTP/2,减少资产请求的次数将使优先级下降。

由于所有格式都可以自适应,因此,您需要测试哪一种格式效果最佳。使用开发者工具衡量下载文件大小、请求的次数以及总延迟时间。对于光栅图像,Data URI 有时候非常有用,例如,如果主页只有一两张图像且这些图像没有在其他地方使用,则可使用 Data URI。如果您需要内联矢量图像,SVG 是一个比较好的选择。

选择正确的格式

有两种图像类型可以考虑:矢量图像与光栅图像。对于光栅图像,您还需要选择正确的压缩格式,例如:GIF、PNG、JPG。

光栅图像,如相片及其他通过单个的点或像素网格表示的图像。 光栅图像通常来自照相机或扫描仪,也可以在浏览器中借助 canvas 元素创建。 随着图像尺寸的增加,文件大小也相应地增加。 如果光栅图像放大时超过其初始尺寸,则会变得模糊,因为浏览器需要猜测如何填补缺失的像素。

矢量图像,如徽标和艺术线条,是由一系列的曲线、直线、形状和填充色定义的。 矢量图像使用 Adobe Illustrator 或 Inkscape 之类的程序创建,并保存为矢量格式,如 SVG。由于矢量图像是建立在简单基元上的,因此,可以进行无损质量的缩放,且文件大小不变。在选择正确的格式时,务必综合考虑图像的源格式(光栅图像还是矢量图像)及内容(颜色、动画、文本等等)。没有一种格式能够适用所有图像类型,它们各有优劣。

在选择正确的格式时,先参考以下指导准则:

  • 摄影图像使用 JPG。
  • 徽标和艺术线条等矢量插画及纯色图形使用 SVG。 如果矢量插画不可用,试试 WebP 或 PNG。
  • 使用 PNG 而非 GIF,因为前者可以提供更丰富的颜色和更好的压缩比。
  • 长动画考虑使用 <video>,它能提供更好的图像质量,还允许用户控制回放。

chromium源码阅读--图片处理的更多相关文章

  1. [原创]chromium源码阅读-进程间通信IPC.消息的接收与应答

    chromium源码阅读-进程间通信IPC.消息的接收与应答   chromium源码阅读-进程间通信IPC.消息的接收与应答 介绍 chromium进程间通信在win32下是通过命名管道的方式实现的 ...

  2. chromium源码阅读--Browser进程初始化

    最近在研读chromium源码,经过一段懵懂期,查阅了官网和网上的技术文章,是时候自己总结一下了,首先IPC message loop开始吧,这是每个主线程必须有的一个IPC消息轮训主体,类似之前的q ...

  3. chromium源码阅读--HTTP Cache

    最近积累了一些关于HTTP缓存的知识,因此结合Chromium的实现总结一下,主要从如下2个分面: 1.HTTP缓存的基础知识 2.Chromium关于HTTP缓存的实现分析 一.HTTP缓存的基础知 ...

  4. chromium源码阅读--进程的Message Loop

    上一篇总结了chromium进程的启动,接下来就看线程的消息处理,这里的线程包含进程的主进程. 消息处理是由base::MessageLoop中实现,消息中的任务和定时器都是异步事件的. 主要如下几点 ...

  5. chromium源码阅读--进程间通信(IPC)

    第一篇就有提到Chromium是目前默认是采用多进程架构,当然,chromium有singe-process的版本. 多进程与多线程的区别,确实有很多可以讲的,我的另一篇博客也讲了一些,这里是从浏览器 ...

  6. chromium源码阅读--V8 Embbeding

    V8是google提供高性能JavaScript解释器,嵌入在chromium里执行JavaScript代码. V8本身是C++实现的,所有嵌入本身毫无压力,一起编译即可,不过作为一个动态语言解释器, ...

  7. chromium源码阅读

    linux下chromium的入口函数在文件:src/chrome/app/chrome_exe_main_aura.cc 中 int main(int argc, const char** argv ...

  8. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  9. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

随机推荐

  1. C++ push方法与push_back方法

    [转载他人的文章,下午在搞c++,谢谢共享] [摘要] push与push_back是STL中常见的方法,都是向数据结构中添加元素.初识STL,对于添加元素的方法以产生混淆,这里暂对两种方法作出比较分 ...

  2. datatable根据条件设置表格行中字的颜色或背景

    使用row回调函数 "rowCallback": function (row, data) { if (xxx) { //给行添加背景色 $(row).css("back ...

  3. thinkphp5 分页带参数的解决办法

    文档有说可以在paginate带参数,然后研究了下,大概就是这样的: $list=Db::name('member') ->where('member_name|member_mobile|se ...

  4. myEclipse 常用快捷键,工具等记录

    小的不才,从北大青鸟毕业,出来之后到第一家公司进行工作,当时认为自己很牛逼,很无敌,但是出来之后发现在学校里学的那些东西,在工作中,除了会写一点if...else之外,连循环都很少写. 然而有用的工具 ...

  5. flask之route中的参数

    flask的路由中有一些参数 使用案例 from flask import Flask, render_template, url_for, session, request, redirect ap ...

  6. scala成长之路(4)compaion object——伴生对象的使用

    虽然java一直声称自己是完全面向对象的语言,但一直以来都被很多人所质疑,其中java的静态成员函数就是主要的“罪魁祸首”.由于java中保留了静态方法的调用,导致其编程模式依然有过程式编程的可能,尤 ...

  7. 网站漏洞修复之最新版本UEditor漏洞

    UEditor于近日被曝出高危漏洞,包括目前官方UEditor 1.4.3.3 最新版本,都受到此漏洞的影响,ueditor是百度官方技术团队开发的一套前端编辑器,可以上传图片,写文字,支持自定义的h ...

  8. LeetCode:24. Swap Nodes in Pairs(Medium)

    1. 原题链接 https://leetcode.com/problems/swap-nodes-in-pairs/description/ 2. 题目要求 给定一个链表,交换相邻的两个结点.已经交换 ...

  9. Django admin操作

      无名小妖     昵称:无名小妖园龄:1年6个月粉丝:22关注:1 +加关注 搜索     常用链接 我的随笔 我的评论 我的参与 最新评论 我的标签 我的标签 Python(1) python3 ...

  10. 解决上传app store卡在正在通过iTunes Store鉴定

    打开终端输入代码即可 cd ~ mv .itmstransporter/ .old_itmstransporter/ "/Applications/Xcode.app/Contents/Ap ...