所以我最近碰到了这个:http://www.nicalis.com/index.php
我很好奇:有没有办法用较小的图像做这种事情?我的意思是,它是像素艺术,而不是使用每个像素大小翻两番的图像,我们不能用代码拉伸它们吗?所以我开始尝试实现它。
我尝试过CSS,Javascript甚至HTML,但都没有。它们都非常糟糕(例如:http://jsfiddle.net/nUVJt/2/),这让我想到了一个问题:你可以在没有任何抗锯齿的情况下在浏览器中拉伸图像吗?
我对任何建议持开放态度,无论是使用画布,jQuery,CSS3还是其他任何建议。
感谢您的帮助!
编辑:现在有更好的方法可以做到这一点!一种稍微不那么强硬的方式!这是魔术:
.pixelated {
image-rendering: -moz-crisp-edges;
image-rendering: -o-crisp-edges;
image-rendering: -webkit-optimize-contrast;
-ms-interpolation-mode: nearest-neighbor;
image-rendering: pixelated;
}
这将阻止所有现代浏览器中的抗锯齿。它甚至可以在IE7-8中工作,但不会在9中工作,我不知道有什么办法在9中做到这一点,不幸的是(除了下面概述的画布黑客)。 与JS相比,用这种方式做得多快得多。以下是有关这些内容的更多信息:https://developer.mozilla.org/en-US/docs/CSS/Image-rendering
EDIT2:因为这还不是官方规格,所以它不太可靠。 Chrome和FF似乎都停止支持它,因为我写了上面的内容(根据下面提到的this article),这真的很烦人。在我们真正开始在CSS中使用它之前,我们可能还需要等待几年,这真的很不幸。
最终编辑:现在有一种官方方式可以做到这一点!有一个名为image-rendering
的新属性。它位于CSS3 spec。支持现在是super spotty,但是Chrome just added support所以在不久之后我们就可以说image-rendering: pixelated;
并且它将在所有地方工作(yaayy常青浏览器!)
答案 0 :(得分:16)
Canvas文档明确没有指定缩放方法 - 在我自己的测试中,它确实在Firefox中对图像进行了非常反混淆。
下面的代码从源图像(必须来自同一个Origin或数据URI)逐个像素地复制,并按指定因子进行缩放。
需要额外的离屏画布(src_canvas
)才能接收原始源图像,然后将其图像数据逐个像素复制到屏幕画布上。
var img = new Image();
img.src = ...;
img.onload = function() {
var scale = 8;
var src_canvas = document.createElement('canvas');
src_canvas.width = this.width;
src_canvas.height = this.height;
var src_ctx = src_canvas.getContext('2d');
src_ctx.drawImage(this, 0, 0);
var src_data = src_ctx.getImageData(0, 0, this.width, this.height).data;
var dst_canvas = document.getElementById('canvas');
dst_canvas.width = this.width * scale;
dst_canvas.height = this.height * scale;
var dst_ctx = dst_canvas.getContext('2d');
var offset = 0;
for (var y = 0; y < this.height; ++y) {
for (var x = 0; x < this.width; ++x) {
var r = src_data[offset++];
var g = src_data[offset++];
var b = src_data[offset++];
var a = src_data[offset++] / 100.0;
dst_ctx.fillStyle = 'rgba(' + [r, g, b, a].join(',') + ')';
dst_ctx.fillRect(x * scale, y * scale, scale, scale);
}
}
};
http://jsfiddle.net/alnitak/LwJJR/
的工作演示编辑 http://jsfiddle.net/alnitak/j8YTe/提供了一个更优化的演示版,它还使用原始图像数据阵列作为目标画布。
答案 1 :(得分:3)
我已经将它用于画布
了var canvas = document.getElementById("canvas"),
context = canvas.getContext('2d');
context.webkitImageSmoothingEnabled = context.imageSmoothingEnabled = context.mozImageSmoothingEnabled = context.oImageSmoothingEnabled = false;
答案 2 :(得分:1)
我能想到的唯一方法是通过画布。你可以尝试简单地将图像绘制到画布上,然后缩放画布 - 我认为你不会以这种方式获得抗锯齿。如果您仍然这样做,您可以尝试在绘图调用中缩放图像,或者如果 不起作用,您可以使用getImageData
和putImageData
来缩放图像“用手“
更新:第一种方法有效:http://jsfiddle.net/nUVJt/3/
答案 3 :(得分:0)
不。浏览器会执行此操作,但您无法控制缩放算法。
但是,我确信你可以制作一个基于画布的解决方案,但它可能涉及从源图像中复制像素并策略性地将它们绘制到画布中。这将是棘手的,但可能(和缓慢)。
答案 4 :(得分:0)
我不确定,但也许你可以使用imagedata。试试这个功能..
function imageToImageData(image) {
var canvas = document.createElement("canvas");
canvas.width = image.width;
canvas.height = image.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(image, 0, 0);
return ctx.getImageData(0, 0, canvas.width, canvas.height);
}