网站的自动Retina图像


104

使用带有视网膜显示屏的新型Apple MacBook Pro,如果您在网站上提供“标准”图像,将会有些模糊。因此,您必须提供视网膜图像。

有没有办法@2x像iOS(使用Objective-C)那样自动切换到图像?我发现的是:用于移动和视网膜显示器上的高分辨率图像的CSS,但是我希望我可以找到所有图像的自动处理过程,而无需CSS或JavaScript

可能吗?

更新
我会强调@Paul D. Waite推荐的这篇有趣的文章,以及由Sebastian链接的有趣的讨论



3
您可以使用PHP在服务器端进行操作:retina-images.complexcompulsions.com
ReLeaf 2012年

2
@ michaelward82:对于摄影图像,Daan Jobsis建议您通过增加应用于图像的JPG压缩量,向所有人提供视网膜大小的图像,而文件的大小不会比非视网膜图像大。图像按比例缩小或在视网膜显示屏上显示的事实通常意味着压缩伪影不可见。
Paul D. Waite

1
其实这没有,但是我想知道是否有一些技巧可以使用。在iOS中它是自动的...这就是为什么我要它!:)
jan267

2
请注意,“建议的有趣文章”的作者犯了一些重大错误,在这里进行了描述:silev.org/test/Retina-resize.html-因此,必须以大量的盐来对待本文。
塞巴斯蒂安

Answers:


147

img标签有一个新属性,允许您添加视网膜src属性,即srcset。无需JavaScript或CSS,无需重复加载图片。

<img src="low-res.jpg" srcset="high-res.jpg 2x">

浏览器支持:http : //caniuse.com/#search=srcset

其他资源:


<img src =“ LaunchAirportIcon.png” srcset =“ LaunchAirportIcon@2x.png 2x”>
malhal 2015年

7
这不再只是webkit,Edge和Firefox也支持它。caniuse.com/#search=srcset-因此目前全球约有 64%的用户。然后要考虑到,很少有hi-DPI用户将在不受支持的浏览器(IE和旧Android)上使用,最后,它是故障安全的-没有支持的用户只会看到正常的DPI图像。绝对认为它已经可以使用了。
andrewb '16

1
同样,没有双重加载是一个巨大的福音。这意味着您永远不会浪费任何人的带宽。
andrewb '16

IE浏览器再次不足。但是尽管如此,我还是同意@andrewb。根据他的评论,我在内部提供x2,src因此IE / Opera将始终要求更高的DPI版本。
Ricky Boyce

1
这应该是公认的答案。到目前为止,这是此线程最简单的解决方案。
Julien Le Coupanec

14

有不同的解决方案,每种解决方案各有优缺点。哪一种最适合您取决于各种因素,例如网站的设计方式,典型访问者使用的技术等。请注意,视网膜显示器不仅限于Macbook Pro Retina和即将上市的iMac,还包括移动设备,可能会有自己的需求。

通常,该问题还与响应式设计中的图像密切相关。实际上,最好是使用通用的响应式设计技术,而不是针对特定设备进行设计。毕竟,技术在将来也会一直在变化。

我注意到的一些解决方案/讨论:

  • 可能的矢量包括CSS技术(渐变,圆角等),SVG和图标字体。
  • Yoav Weiss所建议的那样,提供高分辨率(“视网膜”)图像,但对其进行更多压缩(JPEG质量),或者如Paul Boag所建议,让移动网络在真正需要时(即,当移动时)对其进行压缩。
  • Adaptive Images,(主要是)服务器端解决方案。它基于存储屏幕分辨率的cookie,配置为从PHP脚本提供图像的Web服务器以及命名脚本以读取cookie并提供适当的图像。
  • 在《Smashing Magazine》中充分描述和讨论了许多可能性
  • 正如Paul Boag的视频中所建议的那样,可以提供稍高的分辨率以使视网膜的轮廓稍微平滑一些。
  • A List Apart的@ 1.5x技术基本上是相同的想法。
  • 在不久的将来,该<picture>标签可能会成为W3C工作组甚至Apple 支持的解决方案。
  • 一个JavaScript的技术提出杰克Archebald
  • 一个广泛的讨论对不同的技术碎杂志和一般的问题。

正如其他答案所示,还有更多的技术-但可能还没有最佳实践。

我想知道的一件事是如何在没有相应设备可用的情况下测试和调试其中一些技术...


11

由于还没有人提到明显的东西,因此我将其浮出水面:如果可能的话,只需使用SVG。它们毫不费力地以美丽的视网膜分辨率出现。

IE8是值得担心的主要恐龙,因此对它的支持很好。压缩文件的大小通常比位图(png / jpg)格式更好,并且图像更灵活;您可以以不同的分辨率重用它们,并在必要时重新设置它们的样式,从而节省了开发时间和下载带宽。


我喜欢你的提示!唯一的问题svg是较旧的浏览器。
jan267

15
以及有照片的情况
Baumr

的确,如果您拥有要使用的矢量版本的图像,它们就很棒,但是我不认为您可以将普通的光栅图像另存为SVG。
Chuck Le Butt 2013年

没有“好的”方法可以朝那个方向转换,因此没有“可能”的转换。但是,除了摄影网站等,您通常将要创建艺术资产,因此,我建议将它们作为矢量进行处理,并且可以根据需要轻松地将其转换为光栅。
svachalek

SVG不适用于屏幕截图(例如,在记录UI功能时)。
格雷格·布朗

9

这是我用于实现背景图像的较少mixin。如果您使用dotLess,则retina.js不适用于背景图像,因为retina.js需要其自己的mixin,而mixin本身使用的脚本评估是dotLess不支持的。

所有这些技巧都在于获得IE8支持。它无法轻松进行背景大小调整,因此基本情况(非移动媒体查询)必须是一个简单的,非缩放的图标。然后,媒体查询会处理视网膜的情况,并且可以自由使用background-size类,因为视网膜永远不会在IE8上使用。

.retina-background-image( @path, @filename,@extension, @size )
{
     .background-size( cover );
     background-image: url( "@{path}@{filename}@{extension}" );
         @media only screen and ( -webkit-min-device-pixel-ratio: 2 ),
                only screen and ( -moz-min-device-pixel-ratio: 2 ),
                only screen and ( -o-min-device-pixel-ratio: 2/1 ),
                only screen and ( min-device-pixel-ratio: 2 )
         {
             background-image:url( "@{path}@{filename}@x2@{extension}" );
             background-size:@size @size;
         }
}

用法样本:

.retina-background-image( "../references/Images/", "start_grey-97_12", ".png", 12px );

这要求您有两个文件:

  • start_grey-97_12.png
  • start_grey-97_12@2x.png

其中2x文件是视网膜的双分辨率。


8

只需向所有人提供视网膜图像,然后将图像压缩到图像元素内原始大小的一半即可。假设您的图片400px又宽又高-只需指定图片宽度200px即可使其看起来像这样清晰:

<img src="img.jpg" width="200px" height="200px" />

如果您的图像是照相的,则可以增加其上的JPG压缩而不会使它看起来更糟,因为当在以下位置显示图像时,JPG压缩伪像可能不会显示2x:请参阅http://blog.netvlies.nl/设计互动/视网膜革命/


1
达恩·乔布斯(Daan Jobsis)建议,对于摄影图像,这甚至不必导致文件更大:请参阅blog.netvlies.nl/design-interactie/retina-revolution
Paul D. Waite

理想情况下,您应该指定一个高度,以便浏览器可以在下载图像之前对页面进行布局。
Paul D. Waite

8
我认为提供不必要的更大和更重的图像文件不是一个好主意……
jan267

1
@ PaulD.Waite对于第一件事和最后一点都很有趣!:)
jan267

2
@ PaulD.Waite请注意,链接的文章的作者犯了一些大错误,在这里进行了讨论:silev.org/test/Retina-resize.html-因此,该文章必须花大量的盐。尤其是“右边的未缩放图像”实际上已缩放,因此无法与分辨率精确翻倍的图像进行比较(告诉您的浏览器在新窗口中显示正确的图像,您将看到我和该文章的其他作者的意思是)
塞巴斯蒂安(Sebastian

1

如果其背景图片是实现此目的的简单方法是:

    #image { background: url(image.png); }

@media only screen and (-webkit-min-device-pixel-ratio: 2),
       only screen and (-moz-min-device-pixel-ratio: 2),
       only screen and (-o-min-device-pixel-ratio: 2/1),
       only screen and (min-device-pixel-ratio: 2) {
           #image { background: url(image@2x.png); background-size: 50%; }
}

另一种简单的方法是使用此方法:

只需替换:

<img src="image.jpg" alt="" width="200" height="100" />

<img src="image@2x.jpg" alt="" width="200" height="100" />

1

我发现了一种提供多分辨率图像的有趣方法。
它实际上使用了CSS,这是我想要避免的事情,并且只能在Safari和Chrome中使用。
我在说image-set

这是由Apple(此处)提供的示例

header {
    background: -webkit-image-set( url(images/header.jpg)    1x,
                                   url(images/header_2x.jpg) 2x);
    height: 150px; /* height in CSS pixels */
    width: 800px; /* width in CSS pixels */
}

我也想分享以下两个链接:


1

使用JSF,您可以创建一个自定义的Facelets标记,以节省必须添加srcset到每个图像的麻烦。

在你的taglib.xml,你可以有这样的:

<tag>
  <tag-name>img</tag-name>
  <source>tags/img.xhtml</source>
  <attribute>
    <name>src2x</name>
    <required>true</required>
    <type>java.lang.String</type>
  </attribute>
</tag>

您的标签可能类似于:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions"
                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

  <img src="#{fn:replace(src2x, '@2x', '')}"
       srcset="#{src2x} 2x"/>

</ui:composition>

可以这样使用:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:myTag="http://your.com/namespace-of-taglib">
  <myTag:src2x="image@2x.jpg"/>
</html>

并将呈现:

<img src="image.jpg"
     srcset="image@2x.jpg 2x"/>

0

对于响应站点,此问题尤其棘手,响应站点的图像宽度可能取决于浏览器的大小。同样,当处理多个编辑者可能要上载1000张图像的CMS时,让我上载人们特别压缩的图像对我来说似乎也不现实。

因此,我编写了一个考虑到这一点的脚本,该脚本在页面底部和调整大小后触发。每次都要考虑像素密度和图像占用的大小。

http://caracaldigital.com/retina-handling-code/


0

如果您不因担心使用Java脚本而感到沮丧,那么这里有一篇不错的文章http://www.highrobotics.com/articles/web/ready-for-retina.aspx。它有非常简单的解决方案。

JSFiddle中示例值一千个单词。

使用:

<img onload="getImgSrc(this,'image_x1.png')" width="100" height="100" />

JS:

/* RETINA READY IMG SRC */
function getImgSrc(img, src) {
    var srcResult = src;
    // if high-res screen then change _x1 on _x2
    if (window.devicePixelRatio > 1 && 
        src.indexOf("_x1.")>=0) {
          srcResult = src.replace("_x1.", "_x2.");
    }
    img.onload = null; //protect from second rasing
    img.src = srcResult;    
}

$(document).ready(function(){
  // fire onload trigger on IMG tags that have empty SRC attribute
  var images = $('img:not([src=""])');
    images.each(function(i) {
        $(this).trigger('onload');            
    });
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.