Все:Как холст управление соотношением изображений
Интересно, если я нарисовать изображение на холсте, если соотношение изображения не соответствует холсту, как делает холст масштабировать (допустят только ширину и высоту набора на холсте)?
Например:
<canvas id="myCanvas" style="width:200px; height:200px;"></canvas>
<script>
var canvas = d3.select("#myCanvas").node();
var context = canvas.getContext("2d");
var img = new Image();
img.onload = function(){
console.log(img.naturalWidth, img.naturalHeight);
context.drawImage(img, 0, 0);
}
img.src = "https://www.google.com/images/srpr/logo11w.png";
</script>
В результате кажется, что изображение было растянуть немного вертикально и сжать по горизонтали, я хочу знать, почему холст дело это таким образом, и как сделать это, как это или масштаб в его соотношении, как?
Я также попытался дать ширину и высоту, сделать изображение, но все еще кажется, не совсем правильно, например:
// in this way, the image still get stretched and squeeze
<script>
var canvas = d3.select("#myCanvas").node();
var context = canvas.getContext("2d");
var img = new Image();
img.onload = function(){
console.log(img.naturalWidth, img.naturalHeight);
context.drawImage(img, 0, 0, img.naturalWidth/5, img.naturalHeight/5);
}
img.src = "https://www.google.com/images/srpr/logo11w.png";
</script>
ИЛИ
// Even I give it a 100 by 100 size, it can not do it that way
<script>
var canvas = d3.select("#myCanvas").node();
var context = canvas.getContext("2d");
var img = new Image();
img.onload = function(){
console.log(img.naturalWidth, img.naturalHeight);
context.drawImage(img, 0, 0, 100, 100);
}
img.src = "https://www.google.com/images/srpr/logo11w.png";
</script>
Благодаря
спасибо, это имеет смысл для меня, я попробую это. – Kuan
Я пробовал это, я немного смущен: как холст имеет дело с различными форматами изображения, потому что, когда я попытался использовать jpeg или png изображение на холсте, он растянет изображение, чтобы заполнить всю область, но когда Я рисую svg на холсте, он просто сохранит исходный размер изображения svg (100 на 100) и соотношение и оставит прозрачное пустое пространство для отдыха. Означает ли это, если изображение меньше 300 на 150, оно будет просто оставаться таким, как есть, и растянуть только увеличенное изображение? – Kuan
@Kuan drawImage будет переопределять соотношение сторон, если используются аргументы width/height. Вы можете использовать преобразования, f.ex. context.scale (0.2, 0.2), чтобы уменьшить масштаб пропорционально (только используя аргументы позиции drawImage) или вычислить коэффициент вручную. С первым вам нужно обратное масштабировать позицию (1/scale x X/Y). Размер холста сам по себе не влияет на это, так как это только результат растрового изображения, за исключением размера CSS, который может повлиять на (конечный результат). – K3N