CSS image-rendering 属性

这个属性应该是 CSS 里比较冷门的,我是读到这篇文章 六年个人网站改版总结 - 羡辙杂俎 “像素风边框生成” 这节提到的,学习记录一下。

概述

CSS 属性 image-rendering 用于设置图像缩放算法。它适用于元素本身,适用于元素其他属性中的图像,也应用于子元素。

可取值

/* 专有属性值 */
image-rendering: auto;
image-rendering: crisp-edges;
image-rendering: pixelated;

/* 全局属性值 */
image-rendering: inherit;
image-rendering: initial;
image-rendering: unset;

解释

auto:自 Gecko 1.9 (Firefox 3.0)起,Gecko 使用双线性(bilinear)算法进行重新采样(高质量)。

smooth:应使用能最大化图像客观观感的算法来缩放图像。特别地,会“平滑”颜色的缩放算法是可以接受的,例如双线性插值。这适用于照片等类型的图像。

high-quality:Identical to smooth, but with a preference for higher-quality scaling. If system resources are constrained, images with high-quality should be prioritized over those with any other value, when considering which images to degrade the quality of and to what degree.

pixelated(像素化):顾名思义就是设计提供给像素化图片缩放使用的。其实只能放,并不能缩,使用 pixelated 的时候缩小时仍然是用的 auto 模式,因为它的原理只是简单的把 1 个像素扩大到 4 个像素,并没有计算的过程。它可以保证像素图片在放大后仍然保持原样的像素。这就是我们需要的属性了,IE 下则需要使用使用 nearest-neighbor(近邻取样)。

crisp-edges(硬边缘):可以防止图片在缩放的过程中模糊化,区别于 pixelated,他可以使用很多不同的算法来保证图片缩放的质量,如 2xSaI,HQnX,EPX 等。由于不是所有浏览器都支持 pixlated,所以这条属性也要用上。

不同属性的举例

具体使用场景举例

问题场景:在做响应式布局时,img 图片一般会加个 style="width:100%" 进行缩放,但是无论放大还是缩小,图片都会变得模糊,全局加上下面的代码,就可解决。

img {
  image-rendering: -moz-crisp-edges;
  image-rendering: -o-crisp-edges;
  image-rendering: -webkit-optimize-contrast;
  image-rendering: crisp-edges;
  -ms-interpolation-mode: nearest-neighbor;
}

Live Demo

问题场景 2:像素风图案缩放后变模糊(被消除锯齿)

PhotoShop 设置里面的图像插值:【临近(保留硬边缘)】来保证缩放后仍然保持像素风格

img {
  image-rendering: optimizeSpeed;
  image-rendering: -moz-crisp-edges; /* Firefox */
  image-rendering: -o-crisp-edges; /* Opera */
  image-rendering: -webkit-optimize-contrast; /* Webkit (non-standard naming) */
  image-rendering: pixelated;
  -ms-interpolation-mode: nearest-neighbor; /* IE (non-standard property) */
}

Live Demo

兼容性

Internet Explorer 7 和 8 支持非标准的 -ms-interpolation-mode 属性,有两个属性值:bicubicnearest-neighbor,和大量差距:

  • 只应用于 <img> 等元素带的图片
  • IE 7 上此属性只支持无透明度的图片
  • 不能继承
  • IE 7 默认值: nearest-neighbor (低质量)
  • IE 8 默认值: bicubic (高质量)
  • IE 9 不支持此非标准属性
  • WebKit 支持一个非标准属性: -webkit-optimize-contrast.

参考链接