retina.js是一个很好的工具,用于静态网页上的固定图像,但如果您正在检索用户上传的图像,则正确的工具是服务器端。我在这里想象PHP,但相同的逻辑可以应用于任何服务器端语言。
假设上传的图像的一个好的安全习惯是不要让用户通过直接URL访问它们:如果用户成功地将恶意脚本上传到您的服务器,则不应该能够通过URL启动它(www.yoursite.com/uploaded/mymaliciousscript.php
)。因此,通常最好通过一些脚本<img src="get_image.php?id=123456" />
来检索上传的图像...(甚至更好的是,将上传文件夹保持在文档根目录之外)
现在,get_image.php脚本可以根据某些条件获取适当的图像123456.jpg或123456@2x.jpg。
http://retina-images.complexcompulsions.com/#setupserver的方法似乎非常适合您的情况。
首先,您可以通过使用JS或CSS加载文件,在标头中设置一个cookie:
在HEAD内:
<script>(function(w){var dpr=((w.devicePixelRatio===undefined)?1:w.devicePixelRatio);if(!!w.navigator.standalone){var r=new XMLHttpRequest();r.open('GET','/retinaimages.php?devicePixelRatio='+dpr,false);r.send()}else{document.cookie='devicePixelRatio='+dpr+'; path=/'}})(window)</script>
在BODY开始处:
<noscript><style id="devicePixelRatio" media="only screen and (-moz-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2)">#devicePixelRatio{background-image:url("/retinaimages.php?devicePixelRatio=2")}</style></noscript>
现在每次调用您的脚本来检索上传的图像时,它都会设置一个cookie来请求视网膜图像(或不请求)。
当然,您可以使用提供的retinaimages.php脚本输出图像,但是根据您如何从数据库中生成和检索图像或隐藏上传目录以防止用户访问,您也可以修改它以适应您的需求。
因此,它不仅可以加载适当的图像,而且如果安装了GD2并且您在服务器上保留了原始上传的图像,则甚至可以调整大小并相应地裁剪并保存2个缓存图像大小。在retinaimages.php源代码中,您可以看到(并复制)它的工作方式:
<?php
$source_file = ...
$retina_file = ....
if (isset($_COOKIE['devicePixelRatio'])) {
$cookie_value = intval($_COOKIE['devicePixelRatio']);
}
if ($cookie_value !== false && $cookie_value > 1) {
if (file_exists($retina_file)) {
$source_file = $retina_file;
}
}
....
header('Content-Length: '.filesize($source_file), true);
readfile($source_file);
?>
优点:图片仅加载一次(至少对于3G上的Retina用户不会加载1x+2x图像),即使启用了cookie,也可以在没有JS的情况下工作,可以轻松地开关,无需使用苹果命名约定。您加载图像12345,您将获得适合您设备的正确DPI。
通过URL重写,您甚至可以通过将/get_image/1234.jpg重定向到/get_image.php?id=1234.jpg来完全透明地呈现它。
return callback(false)
更改为return callback(true)
即可。 - Lars Kotthoff