LINUX.ORG.RU

HTML5 canvas: почему размывается изображение при putImageData?

 , ,


0

1

Здравствуйте.

Есть такой код:

<!DOCTYPE html>
<html>
<head>
	<title>Canvas Test</title>
	<meta charset="utf-8">
</head>
<body style="overflow: hidden;">
	<canvas id="maincanvas" style="width: 90%; height: 90%; top: 10px; left: 10px;"></canvas>
	<script>
	var canvas = document.getElementById('maincanvas');
	var ctx = canvas.getContext('2d');
	ctx.imageSmoothingEnabled = false;
	ctx.mozImageSmoothingEnabled = false;
	ctx.msImageSmoothingEnabled = false;
	ctx.webkitImageSmoothingEnabled = false;
	var idata = ctx.createImageData(canvas.width, canvas.height);
	var x0 = 10;
	var x1 = 100;
	var y0 = 10;
	var y1 = 100;
	var x = x0;
	var y = y0;
	var i;
	while(y <= y1) {
		while(x <= x1) {
			i = (y * idata.width + x) * 4;
			idata.data[i + 3] = 255;
			x++;
		}
		x = x0;
		y++;
	}
	ctx.putImageData(idata, 0, 0);
	</script>
</body>
</html>
Ожидается: чёткий чёрный квадрат.

Получается: чёрный квадрат с размытыми краями.

Почему так происходит и как сделать так, чтобы не происходило?

★★★★★

Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от anonymous

В этом случае получается, действительно, ровный прямоугольник. Но если мне надо маленький нарисовать, только на часть холста?

proud_anon ★★★★★
() автор топика

Я, вообще, не знаю html5 canvas, но вижу в коде, что квадратик 100x100 планируется растягивать в 90% экрана. Думаю, проблемы отсюда.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Ты был близок к истине. Я забыл, что логические размеры canvas определяются атрибутами .width и .height, а не .style.width и .style.height. Спасибо.

...вот ведь наворотили этого хатымеля...

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от proud_anon

Погляди внимательнее, может там ещё есть размытые границы. В cairo, например, для чётких линий надо задавать координаты типа (10.5, 10.5) — (30.5, 10.5), так как целые числа это координаты узлов сетки, а не центров пикселей.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

В cairo, например, для чётких линий надо задавать координаты типа (10.5, 10.5) — (30.5, 10.5), так как целые числа это координаты узлов сетки, а не центров пикселей.

Это и в canvas так же.

Спасибо за совет, но нет, больше не вижу ничего размытого. Тут ведь попиксельно рисуется квадрат, а не векторно.

proud_anon ★★★★★
() автор топика
Последнее исправление: proud_anon (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.