Нарисуйте изображение внутри холста HTML, используя определенную ширину/высоту

У меня есть настройка Canvas следующим образом:

<canvas id = "canvas" style = "width: 1200px; height: 500px;"></canvas>

Затем я хочу загрузить файл и добавить его на холст, но нарисовать его с определенной шириной и высотой, как показано ниже:

var fileReader = new FileReader();

fileReader.onload = function( event ){
    var image = new Image();

    image.onload = function() {
        canvasCtx.drawImage( image, 0, 0, 400, 200 );
    };

    image.src = event.target.result;
}

fileReader.readAsDataURL( file );

Это изображение добавлено, но оно использует всю ширину и высоту холста. Я пробовал масштабировать его, но у меня не получилось.

Невозможно воспроизвести, canvasCtx.drawImage( image, 0, 0, 25, 25 ) дает мне 25z25 изображение на холсте.

0stone0 21.05.2024 12:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Размер холста задается путем определения свойств ширины и высоты:

<canvas id = "canvas" width = "1200" height = "500"></canvas>

Это размер двумерного контекста, и вы можете рисовать на этом холсте. Всегда в баллах. В противном случае вы можете использовать относительные единицы, например. проценты:

<canvas id = "canvas" style = "width: 100%; height: 100%;"></canvas>

Как рисовать на таком холсте? Как определить, куда поместить изображение? Вот почему существует разница между размером контекста рисования и тем, как разместить холст на веб-странице.

Вы можете установить размер холста 1200x500 и одновременно изменить его размер, чтобы он соответствовал родительскому контейнеру:

<canvas id = "canvas" width = "1200" height = "500" style = "width: 100%; height: 100%;"></canvas>

Надеюсь, это развеет ваши сомнения.

Это полностью упускает из виду вопрос ОП.

0stone0 21.05.2024 13:11

Я считаю, что это не упускает из виду вопрос. Опубликованный код кажется правильным, но проблема связана с размерами холста по умолчанию.

piwko28 21.05.2024 14:50

Метод drawImage имеет 9 параметров.

drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)

Вы можете растянуть изображение до заданных размеров следующим образом:

canvasCtx.drawImage( image, 0, 0, image.width, image.height, 0, 0, 400, 200);

Проверьте https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage для получения дополнительной информации.

Кроме того, вам следует установить ширину и высоту объекта холста для правильного просмотра. Правильный пример кода:

const fileReader = new FileReader();
const {width, height} = document.getElementById('container').getBoundingClientRect();
const canvas = document.getElementById('canvas');
canvas.width = width;
canvas.height = height;
const canvasCtx = document.getElementById('canvas').getContext('2d');

fileReader.onload = function( event ){
    const image = new Image();

    image.onload = function() {
        const ratio = Math.max(image.width/400, image.height/200)
        canvasCtx.drawImage( image, 0, 0, image.width, image.height, 0, 0, image.width/ratio, image.height/ratio);
    };

    image.src = event.target.result;
}

function handleFile() {
    const file = document.querySelector("input[type=file]").files[0];
    fileReader.readAsDataURL( file );
}
html,  body {
    color: #222;
    background: #bbb;
    font: 14px monospace;
    user-select: none;
}

canvas {
   background: #fff;
}
<div>
    <input type = "file" accept = "image/*" onchange = "handleFile()"/>
    <div id = "container" style = "width: 1200px; height: 500px;">
      <canvas id = "canvas"></canvas>
    </div>
</div>

Другие вопросы по теме

Похожие вопросы