当前位置: 首页 > 面试题库 >

如何在没有抗锯齿的情况下拉伸图像

百里金林
2023-03-14
问题内容

所以我最近遇到了这个问题:

我很好奇:有没有办法用较小的图像来做这种事情?我的意思是,这是像素艺术,而不是使用每个像素四倍的图像而不是我们用代码来拉伸它们吗?因此,我开始尝试实现这一目标。

我尝试了CSS,Javascript甚至HTML,但没有一个起作用。它们都变得非常模糊,这使我想到了一个问题:您可以在浏览器中拉伸图像而无需任何抗锯齿功能吗?

我愿意接受任何建议,无论是使用画布,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快多少都不奇怪。

EDIT2:
因为这不是官方规范,所以不是很可靠。自从我撰写以上内容以来,Chrome和FF似乎都已停止支持它,这确实很烦人。我们可能要再等几年才能真正开始在CSS中使用它,这确实是不幸的。

最终编辑:现在 有一种正式的方法!有一个名为的新属性image- rendering。它在CSS3规范中。目前支持非常多,但是Chrome刚刚添加了支持,因此不久以后我们就可以说出来了,image- rendering: pixelated;并且可以在所有地方使用(yaayy常绿浏览器!)


问题答案:

Canvas文档明确没有指定缩放方法-在我自己的测试中,确实确实在Firefox中对图像进行了严重的锯齿处理。

下面的代码从源图像(必须来自相同的Origin或Data 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);
        }
    }
};


 类似资料:
  • 在学习渲染的旅途中,你可能会时不时遇到模型边缘有锯齿的情况。这些锯齿边缘(Jagged Edges)的产生和光栅器将顶点数据转化为片段的方式有关。在下面的例子中,你可以看到,我们只是绘制了一个简单的立方体,你就能注意到它存在锯齿边缘了: 可能不是非常明显,但如果你离近仔细观察立方体的边缘,你就应该能够看到锯齿状的图案。如果放大的话,你会看到下面的图案: 这很明显不是我们想要在最终程序中所实现的效果

  • 我在我的项目中使用了InkCanvas,我注意到每当我画东西时,笔划都非常尖锐,一旦我松开鼠标按钮,它就会变得模糊。 有没有什么方法可以使笔划与绘制时的样子保持一致? 现在,我正在检查从图像中获得的阵列,并删除任何与颜色不完全匹配的像素。红色(即ARGB:255255,0,0)。。。我相信有一种更聪明的方法可以做到这一点! 提前谢谢。

  • 问题内容: 对于PIL中的线条和椭圆,图像是粗糙的。 我发现仅在调整大小和缩略图中使用了抗锯齿功能。 绘制直线或椭圆形时,有什么方法可以进行抗锯齿吗? 问题答案: 本地执行此操作的唯一方法是使用超级采样。以所需大小的倍数渲染图像,然后使用进行渲染。

  • 目前我正在使用JavaFX开发一个2D游戏,游戏是像素艺术。不幸的是,像素艺术是模糊的,这是由抗锯齿引起的。 有没有办法在JavaFX画布上禁用抗锯齿?我试过用SceneAntialiasing。残废了,没用。我找不到其他方法来关闭它。

  • 问题内容: 有人知道如何让JTextArea在所有平台上显示固定大小的字体吗? 我想创建一个具有保存/打开功能的简单代码编辑器,这很简单,但是我想将字体设置为固定大小,最好是速写。 问题在于,courier new显然是专有的,不仅在许多系统上默认没有安装它,而且在大多数现代系统上,它都默认设置为cleartype,这使其看起来像垃圾。 我很想用update-render- paint制作自己的J

  • 问题内容: 在swing应用程序中,我使用来自定义文本。这是一个示例: 在同一应用中,一个 文本http://img525.imageshack.us/img525/4928/drawstringsample.jpg ,我正在使用渲染文本。这是一个示例: 替代文本http://img28.imageshack.us/img28/1134/jtextpanesample.jpg 您能注意到较低的样本