Рисование изображения на холсте - больше реального - программирование
Подтвердить что ты не робот

Рисование изображения на холсте - больше реального

Я хочу нарисовать изображение из файла jpg на холсте. Мой код:

var canvas = document.getElementById('my_canvas');
  var ctx = canvas.getContext('2d');
  var imageObj = new Image();

  imageObj.onload = function() {
    ctx.drawImage(imageObj, 0, 0);
  };
  imageObj.src = 'img/my_image.jpg';

Проблема в том, что изображение на холсте намного больше, чем в файле. Зачем? Как я могу нарисовать реальный размер изображения?

UPDATE: результат: http://jsfiddle.net/AJK2t/

4b9b3361

Ответ 1

Это ваша проблема:

<canvas style="width: 700px; height: 400px;" id="konf"></canvas>

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

Самое простое исправление:

<canvas width="700" height="400" id="konf"></canvas>

Параметры width и height управляют количеством пикселей в холсте. Без стилей CSS по умолчанию визуальный размер холста также будет такого размера, в результате чего один пиксель canvas на пиксель экрана (если вы не увеличили масштаб веб-браузера).

Скопировать/вставить из мой ответ на соответствующий вопрос:

Подумайте, что произойдет, если у вас есть JPG 32x32 (он имеет ровно 1024 общих пикселя), но укажите через CSS, что он должен выглядеть как width:800px; height:16px. То же самое относится к HTML Canvas:

  • Атрибуты width и height самого элемента canvas определяют, сколько пикселей вы можете нарисовать. Если вы не укажете высоту и ширину элемента canvas, тогда для спецификаций:
    "атрибуту width по умолчанию соответствует 300, а атрибуту height по умолчанию соответствует 150.

  • Свойства CSS width и height управляют размером, отображаемым элементом на экране. Если размеры CSS не установлены, для макета используется собственный размер элемента.

Если вы укажете в CSS разный размер, чем фактические размеры холста, он должен быть растянут и раздавлен браузером по мере необходимости для отображения. Вы можете увидеть пример этого здесь: http://jsfiddle.net/9bheb/5/

Ответ 2

Рабочий пример: http://jsfiddle.net/jzF5R/

Чтобы масштабировать изображение, вам необходимо предоставить масштабированную ширину и высоту, которые вы хотите ctx.drawImage():

// x, y, width, height
ctx.drawImage(imageObj, 0, 0, 100, 50);

Сохраняйте исходный размер изображения:

ctx.drawImage(imageObj, 0, 0, imageObj.width, imageObj.height);

Держите холст от переполнения страницы:

ctx.canvas.width = document.body.clientWidth;

Вы можете легко масштабировать ширину и высоту изображения до 70% от оригинала:

ctx.drawImage(imageObj, 0, 0, imageObj.width * 0.7, imageObj.height * 0.7);

Ответ 3

Чтобы отобразить поток MJPEG на холсте (или что-то еще), не определяя ширину и высоту холста в HTML, так что только используя CSS, чтобы получить отзывчивый холст и соответствовать его странице, я использую это:

//get size from CSS
var sizeWidth = context.canvas.clientWidth;   
var sizeHeight = context.canvas.clientHeight;   
//here the solution, it replaces HTML width="" height=""
canvas.width = sizeWidth;
canvas.height = sizeHeight;
...........
context.drawImage(imageObj, 0, 0, imageObj.width, imageObj.height, 0, 0, sizeWidth, sizeHeight);

Изображение полностью содержится в холсте независимо от размера холста (скорость между высотой и шириной не сохраняется, но это не имеет значения, height:auto; в css может это исправить).

Et voilà!