一,前言

最近在不断地扩充自己web开发的知识面,看得比较泛,难得五一假期就在学习之余实践一下,毕竟纸上得来终觉浅,况且“纸上”的不一定都对,之前看了一篇博客讲图片加载的,博主大概是淘宝前端团队的吧,讲得很透彻,分享一下:

图片格式与设计那点事儿

虽然是10年的文章了,但是鉴于图片格式近几年并没有大的改动,而且博主讲得比较透彻,所以很有参考价值。

本篇博客只是对上面博客的验证以及在rails上的实践,推荐阅读上面那篇博客。

二,图片加载中的扫描方式

在带宽有限的时候显示大图片始终是个问题,特别在移动设备上,长加载时间导致了长白屏时间,用户体验不好。

如果细心观察各类网页上图片的加载,你会发现有从上到下(逐行扫描)的加载和先加载模糊的照片再逐渐变清晰(交错扫描)两种方式(网速不好时特别明显)。

可见,为了效果明显,特地选了一张2M左右的照片,同样图片,同样大小(其实为了实验的可靠性,第二张特意调得大一些,多个20k吧),第二种方式的加载看似更快,先交错加载出图片轮廓,再慢慢填充细节,GIF动图可能不是太明显,大家可以自己去试一下。

上面两张图片都是JPG格式的,只是有个属性(interlace【译:交错】)不同,造成了两种图片编码格式,对应两种浏览器的图片解码方式,也就会产生上面的两种视觉效果。

关于两种扫描方式的底层的不同大家可以去看JPG或者PNG的编码方式,这里有个图片供参考,注意红框部分。标准模式下,存储时时将图片从左上角到右下角的像素点存下来,每个像素点有RGB三个值,以一行有三个像素点为例:

正常:RGBRGBRGB(一次显示完)
交错:RRR(第一次显示)GGG(第二次显示)BBB(第三次显示)


因为假期还有许多学习任务,所以图片存储这一部分并没有深入了解,上面的存储方式只是猜测,也算是提供了一个思路,更多信息请自行谷歌(关键词:interlace PNG 或者 progressive JPEG),欢迎回来分享。

三,生成interlace PNG、progressive JPEG

①Photoshop处理

在前端开发中,许多图片都是从美工图片中切下来的,然后在PS上进行简单的处理作为静态资源使用。

其实上面那篇博客就有相关的内容,不过既然自己实践了一下,也为了保证阅读的连续性,还是上一下图片吧。

②rails中使用MiniMagick处理

好,重点来了,怎么用代码来处理图片呢?在图片上传这个环节,涉及到服务器对图片的修改及保存。因为web后台使用了rails,所以图片处理库也就用了MiniMagick:

MiniMagick的安装使用

因为MiniMagick其实是调用了ImageMagick(或者GraphicsMagick,取决于你安装了哪个软件)来进行图片处理,所以我们要先安装ImageMagick。

1,安装ImageMagick

#Mac OS X (本地开发环境)
brew install ImageMagick#ubuntu(产品部署环境)
apt-get install software-properties-common
sudo apt-get update
sudo apt-get install imagemagick libmagickwand-dev

2,在rails中安装MiniMagick
在Gemfile文件中加入下面一行,然后执行bundle命令来安装gem包即可:

# image process
gem 'mini_magick'

3,rails使用MiniMagick来生成交错扫描的图片

image = MiniMagick::Image.open(image_path)
# => format之后就不是交错的模式了,所以要先format再设置交错模式
image.format 'png'
image.interlace "plane" #选择交错模式
image.write image_path

4,enjoy it!
在终端中执行下面命令,检查图片是否是交错扫描的,返回None代表不是交错扫描的,否则是交错扫描。

identify -verbose filename.jpg | grep Interlace

注意:identify命令是安装ImageMagick之后才有的。

ImageMagick是一个很强大的软件处理工具,裁剪、放大缩小、图片加文字这些根本不在话下,有兴趣可以研究一下,日后有空看看图片处理的源码也是蛮有意思的。

四,一些想法

其实4G网络下,一般的web图片(40k)左右,上述两种图片加载方式其实差别不大,而且有一部分人认为,先加载模糊的图片其实用户体验也并不好,所以怎么选择就见仁见智了。

我在最近写的一个作品展示页面(有大量图片)上遇到了图片逐行加载时间比较久(有几秒时间图片只有一截,下面空白等待加载)影响用户体验的问题,因此换成交错扫描的加载方式,起码页面打开会在极短时间内显示模糊图片,当用户认真看的时候,图片早就变清晰了。

其实解决方法还有很多,例如图片我应该处理成缩略图和原图两种,在index页面显示缩略图(因为足够小,所以加载速度足够快,两种图片加载方式没有明显区别),点击进去再显示原图。以后还会涉及到展示页超过一页,设置延时加载图片的问题,以后有实践的话会分享记录一下。

希望自己能尽快拓展知识面(有利于更好地理解学习更多的内容),同时也能挤出时间深入研究某一两个点,逝者如斯夫,加油,在有限的时间内尽可能多做事,多学习才是关键,多花时间最多算努力,虽然努力也很重要。

浅谈图片加载:逐行扫描VS交错扫描相关推荐

  1. php项目css加载失败,浅谈CSS加载失败的6个原因

    在页面布局时,都主张结构与样式分离,但是有些时候,css样式不能成功加载,这是为什么呢?这篇文章主要讲了CSS加载失败的6个原因,有需要的朋友可以参考一下,希望对你有用. 有很多刚刚接触css的新手有 ...

  2. 从UIL库谈Android图片加载中需要注意的事情

    Android Universal Image Loader 算是Android中最流行的图片加载库了,作者Sergey的确牛逼,能将整个Android图片加载的点点滴滴考虑的如此全面.网上研究这个开 ...

  3. Android平滑图片加载和缓存库Glide使用详解

    在图片加载库烂大街的今天,选择一个适合自己使用的图片加载库已经成为了每一个Android开发者的必经之路.现在市面上知名的图片加载库有UIL,Picasso,Volley ImageLoader,Fr ...

  4. Android Glide图片加载框架(二)源码解析之with()

    文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...

  5. Android 强大的图片加载缓存— Glide

    在图片加载库烂大街的今天,选择一个适合自己使用的图片加载库已经成为了每一个Android开发者的必经之路.现在市面上知名的图片加载库有UIL,Picasso,Volley ImageLoader,Fr ...

  6. android教你打造独一无二的图片加载框架

    前言 首先,最近是在忙okhttp没错.不过或许有人问为什么忙着okhttp怎么又扯到了图片加载上了.其实,最近想实现下断点续传以及多文件下载,但并不知道怎么搞.群里有小伙伴提出了控制线程池来实现.然 ...

  7. 图片加载用Fresco,网络请求用OKhttp+Retrofit实现

    --------------清单文件------------------- AndroidManifest <manifest xmlns:android="http://schema ...

  8. Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53939176 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

  9. 优雅地实现Android主流图片加载框架封装,可无侵入切换框架

    项目开发中,往往会随着需求的改变而切换到其它图片加载框架上去.如果最初代码设计的耦合度太高,那么恭喜你,成功入坑了.至今无法忘却整个项目一行行去复制粘贴被支配的恐惧.:) 那么是否存在一种方式 能够一 ...

最新文章

  1. 【转载】常用DOS命令(包括创建删除文件夹/文件)
  2. 【django】关联查询
  3. 更新yum源并重建缓存
  4. 坚持做一件事情真的很不容易,首先必须要克服惰性!
  5. koa --- koa-bouncer验证
  6. Canvas制作动态进度加载水球
  7. 添加class值_Java 虚拟机(二) - Class 文件结构
  8. 2013中国足球的温柔处罚
  9. [转载] python| map()函数应用详解
  10. Java自学要多久?
  11. 微信小程序位置定位php,【微信开发】微信小程序通过经纬度计算两地距离php代码实现...
  12. redfish_Redfish和Ansible的带外管理
  13. 网络监控软件百络网警 v6.6b 家庭版 下载
  14. ATE软件测试工程师,ATE软硬件测试开发工程师/高级工程师
  15. 八爪鱼批量爬取html中的数据,批量采集网页数据 - 八爪鱼采集器
  16. WiFi 5G频段差分巴伦电路对接收灵敏度的影响
  17. python批量图片合并
  18. 阿里云CDN介绍以及如何配合OSS使用
  19. 4g手机关闭4g信号显示无服务器,手机4G信号栏为什么突然出现“HD”?原来开通了这个业务,望周知...
  20. 软件环境:安装报Error opening file for writing

热门文章

  1. jquery 做一个小的倒计时效果
  2. 负载均衡、DNS、F5、反向代理、LVS、四层与七层、CDN
  3. 信创蓝海 合作共赢:统信UOS代理商推介会(郑州站)成功举行
  4. STM32f1之简单控制继电器模块(附源码)
  5. 留良乡投资理财只需做到这五点
  6. 如何更方便的探讨技术
  7. 物联网开放平台使用总结
  8. NLP基本功-文本相似度 | AI产品经理需要了解的AI技术通识
  9. 最新计算机学术研讨会,TC预告|CCF 2020第十届全国文字与计算学术研讨会
  10. 买手机看性能看处理器还是内存?