Я знаю, что это было обсуждено ранее, и я прочитал много статей и попробовал то, что было заявлено как работающее, поэтому не отбрасывайте мой вопрос сразу, пожалуйста.Загрузка изображений в холст (HTML/Javascript)
Я пытаюсь загрузить различные изображения в холст унифицированного размера. Это может быть одно изображение или несколько изображений, но я обрабатываю одно изображение за раз.
Вот основной код (HTML/JS/PHP):
<?php
if ($record->photo != "") //make the first canvas
{
list($width, $height, $type) = getimagesize($record->photo);
echo "Width: " .$width. "<br />";
echo "Height: " .$height. "<br />";
?>
<canvas id="my_canvas" width="341" height = "256"></canvas>
<body>
<script type="text/javascript" src="common.js"></script>
<script type="text/javascript">
var img_src = "<?php echo $record->photo;?>";
var width = "<?php echo $width;?>";
var height = "<?php echo $height;?>";
make_canvas('my_canvas', img_src, width, height);
</script>
<?php
}//if 1
Похожие блок для canvas2, 3 и т.д. с закрывающим тегом в конце.
Вот версии функции make_canvas(), которые «как-то» работают. Это означает, что они иногда делают некоторые снимки при загрузке, но могут улучшаться при обновлении. Когда отображается более одного изображения, я никогда не получаю его работу должным образом.
Version 1 - непоследовательной и кэширует последнее изображение:
function make_canvas(id, src, width, height)
{
if (width > 341)
{
var new_width = 341;
var ratio = new_width/width;
var new_height = Math.round(height * ratio);
}
else
{
var new_width = width;
var new_height = height;
}
document.write("id: " + id + "<br />");
document.write("src: " + src + "<br />");
document.write("new_height: " + new_height + "<br />");
var canvas = document.getElementById(id),
context = canvas.getContext('2d');
base_image = new Image();
//base_image.src = '';
base_image.onload = function(){
context.drawImage(base_image,0,0,new_width, new_height);
}
base_image.src = src;
}
Версия 2: может загрузить одно изображение и кэширует его на обновления
function make_canvas2(id, src, width, height)
{
if (width > 341)
{
var new_width = 341;
var ratio = new_width/width;
var new_height = Math.round(height * ratio);
}
else
{
var new_width = width;
var new_height = height;
}
document.write("id: " + id + "<br />");
document.write("src: " + src + "<br />");
document.write("new_height: " + new_height + "<br />");
var canvas = document.getElementById(id),
context = canvas.getContext('2d');
base_image = new Image();
base_image.src = '';
base_image.addEventListener("load", function() {
// execute drawImage statements here
context.drawImage(base_image,0,0,new_width, new_height);
}, false);
//base_image.onload = function(){ };
base_image.src = src;
}
Я попытался добавить base_image.complete в IF условие для onload или для цикла WHILE внутри функции onload, но никогда не может достичь нескольких изображений, отображаемых правильно при первой загрузке. Буду признателен за любые рабочие примеры, желательно похожие на выше и без jQuery.
Blauharley, вы спасли мне дни, которые разочарования! Небольшие вещи (var) имеют большое значение, все начало работать с версией 1 моего make_canvas() (еще не проверенный кросс-браузер). И да, ваш код делает то, что мне нужно. Большое спасибо! – user2097141
Добро пожаловать! Пожалуйста, отметьте мой ответ так, чтобы это стало ясно. Спасибо. – Blauharley