【问题标题】:HTML5 Canvas bitmapsHTML5 画布位图
【发布时间】:2015-09-10 13:11:56
【问题描述】:

我正在构建一个使用像素化图像的复古风格游戏。我还没有创建这些图像,因为我想知道做事的最佳方式。

这些图像可能是 16 或 32 PX 的正方形,但我希望能够将图像缩放到我喜欢的大小,而不会出现任何模糊/失真。

我应该使用什么格式?以及我应该如何将它们导入我的画布。也一样?

EDIT#1: 修正了错字并将 Q 放回主题。 (感谢 Spence 指出)

【问题讨论】:

  • HTML 5 Canvas 可以处理多种常见的图像类型,我推荐使用.PNG。图像软件可以是你的喜好:MS Paint(不是它不支持透明度),Gimp,Photoshop等都可以。 请注意,要求场外资源与本网站无关,但我希望我的评论有所帮助。
  • 我读到如果图像分辨率较低,最终可能会变得模糊。在过去,我制作/编辑的图像中的颜色已经混合/混合。那是在我几乎不了解计算机的时候。 (在 xp 油漆中)
  • 我又在话题上了,对此感到抱歉。
  • 您可以尝试将 与您的图像混合。

标签: javascript html graphics html5-canvas vector-graphics


【解决方案1】:

试试“Inkscape”,它是免费的

https://inkscape.org/en/

它使用 SVG 格式(标量矢量图形),因此您可以随意缩放图像,而不会出现任何模糊/失真。

【讨论】:

  • 我过去曾尝试过 inkscape,但我不认为我用它来制作基本位图,(需要像素化,但不模糊)
【解决方案2】:

在没有任何模糊或失真的情况下放大的唯一方法是将每个 1 像素变成一组 2x2、3x3、... 像素。

例如,图像左上角的单个蓝色像素将变成一组位于 [0,0]、[1,0]、[0,1] 和 [1,1] 的 4 个蓝色像素.对于原始图像上的每个其他像素也是如此。生成的图像将是原始图像宽度和高度的两倍。

由于您的图形样式是像素化图像,因此此调整将保留您的像素化同时也放大原始图像。

您可以编写一个函数,该函数使用内存中的 html5 画布根据需要“调整大小乘以”原始图像。这将使用画布的能力来使用context.getImageDatacontext.putImageData 设置每个像素的RGBA 值。

【讨论】:

  • 现在,使用 PNG 或 jpeg 压缩,它会是等效/相似的大小吗?
  • @markE 嗯?你为什么不谈谈 ctx.imageSmoothingEnabled ?最近的邻居算法不会完全按照您的建议进行吗?
  • 原始 .png 和 .jpeg 将具有设定的尺寸。调整后的图像(实际上是在屏幕外画布上乘以原始图像)将是原始图像的 2 倍,并且将包含与原始相同的像素化效果。如果您的原始图像只有 16x16 或 32x32,您可能只想发送一个表示像素颜色的数组,然后让“resize-by-multiply”函数使用原始 RGBA 值来创建新的双倍尺寸图像。跨度>
  • @Kaiido。理论上是的,最近邻会按乘法调整大小。在过去的实践中,我遇到过无法精确遵循最近邻算法的浏览器实现。您可以使用最近邻发布答案,以便我们查看现代浏览器是否执行算法公正。
  • @markE 这可能超出我的理解范围。此外,我可能需要更改它,手动转换它可能会占用我很多时间。 (32^2 是一个很大的像素)
【解决方案3】:

创建应用 16x16 或 32x32 平铺效果的大图标图像。然后,当您将它们写入画布时(当然是在加载图像之后)使用

将它们缩小到您想要的大小
context.drawImage(img,x,y,width,height);

文件大小不太可能大幅增加,因为每个图块都应该很容易压缩。

【讨论】:

  • 所以想法是为 16*16px 的渲染图像创建一个 5Mb 的文件?我也没有得到“压缩”部分,你能扩展一下吗?
  • JPEG 和 PNG 都压缩图像数据 - JPEG 压缩是有损的(质量越低,看起来越差),而 PNG 是无损的(图像中的细节越多,文件越大..保存为BMP文件会出现5MB图片文件的情况。(不要)
  • 哼什么?你能提供一个演示来说明这一点吗?图像越大(宽度和高度),文件越大,无论您使用什么压缩算法。现在,如果您将其压缩为 jpeg,您将创建工件,即使按比例缩小,这些工件也会保留。
  • 文件大小自然会增加,但不会增加到一些巨大的文件大小。使用免费软件图像查看器,您的图标保存为 32 x 32 像素的 PNG 是 794 字节。调整大小为块(未插值)并保存为 512 512 像素,大小为 3382 字节。 (3.3 KB)。另存为 512 x 512 BMP 文件,大小为 768 kb。 (
  • @Kaido 在浏览器外保存到 512 x 512 png,小提琴图像为 2,869 字节。
【解决方案4】:

CanvasContext2d 确实有一个禁用图像平滑的选项:imageSmoothingEnabled 默认设置为 true。

根据the specs,如果设置为false,

图像[由drawImage()方法绘制]必须使用 nearest-neighbor interpolation

此算法与@markE 在his answer 中提出的算法相同。

不幸的是,浏览器仍然使用 vendor-prefix 作为该属性,并且在 IE9 和 IE10 中都没有实现...

var img = document.querySelector('img'),
    canvas = document.querySelector('canvas'),
    ctx = canvas.getContext('2d');

// draw the image
img.onload = function(){
  canvas.width = img.width*50;
  canvas.height = img.height*50;
  // disable smoothing after we change canvas' width/height
  ctx.mozImageSmoothingEnabled = false;
  ctx.webkitImageSmoothingEnabled = false;
  ctx.msImageSmoothingEnabled = false;
  ctx.imageSmoothingEnabled = false;
  ctx.drawImage(img, 0,0, canvas.width, canvas.height);
  }
//32x32px image taken from https://stackoverflow.com/q/31910043/3702797
img.src="http://i.stack.imgur.com/3Sp5x.png"
canvas{border:.5px solid}
<img/>
<canvas></canvas>

滚动查看画布中调整大小的图像

【讨论】:

  • 另外,忘记提到如果您不想要伪像,您应该避免图像压缩 (jpg)。 png 格式是您最好的选择。
猜你喜欢
  • 2017-03-26
  • 2020-12-23
  • 2012-06-13
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 2012-12-10
  • 2013-07-24
  • 2014-01-31
相关资源
最近更新 更多