【问题标题】:How to load an other image, if the current image loads slow?如果当前图像加载缓慢,如何加载其他图像?
【发布时间】:2023-03-18 13:43:01
【问题描述】:

我正在开发一个 HTML5 画布游戏,我想加载一个高分辨率图像作为背景。这张图片是 10MB,所以如果图片加载缓慢,那么我想加载一个较小的图片。

var myimg = new Image();
myimg.onload = function() {
  clearTimeout(t);
  alert('high resolution image loaded');
};
mximg.src = 'path/to/highres.png';

var t = setTimeout(function(){
  //cancel loading somehow ?
  myimg.onload = function() {
    alert('low resolution image loaded');
  };
  myimg.src = 'path/to/low_res.png';
},5000);

我应该以某种方式取消加载,还是在我编辑 src 属性时取消加载?

【问题讨论】:

标签: javascript


【解决方案1】:

另一种“解决方案”是首先加载低分辨率图像。只有当它加载得足够快时,您才开始加载高分辨率版本来替换它。

我认为有三个可能的好处:

  1. 您不必担心取消加载:-)
  2. 您避免在用户使用低带宽时加载不必要的数据(部分下载的高分辨率图像),而是在用户使用高带宽时加载不必要的数据(完整的低分辨率图像)(在这种情况下反正也没那么重要)。
  3. 在加载高分辨率图像时,您可以选择将低分辨率图像显示为占位符(要求您将低分辨率和高分辨率图像加载到两个单独的 DOM Image 对象中并交换低分辨率和高分辨率)。

【讨论】:

    【解决方案2】:

    您无法停止图像的加载,但是可以取消普通的 AJAX 请求 (see this solution on SO)。通常图像不通过 AJAX 加载是有充分理由的,但您可以通过将图像作为 base64 编码字符串发送来解决此问题。因此,您让 PHP 读取图像并将其转换为 base64。该字符串可以通过 AJAX 发送到 JS 并“直接”绘制到您的画布 (solution on SO)。

    我真的不知道这是否是最好的方法......无论如何,看看这是否适合你:

    HTML:

    <canvas id="background" width="800" height="600"></canvas>
    


    JavaScript:(使用 jQuery)

    function drawBackgroundImage(src) {
        var image = $("<img/>").load(function(){
            $("canvas#background")[0].getContext("2d").drawImage(image[0], 0, 0);
        }).attr("src", src);
    }
    function loadImage(highres, lowres) {
        var t;
        var xhr = $.ajax({
            type: "POST",
            url: "load_image.php",
            data: "image=" + highres,
            success: function(imgbinary){
                if (imgbinary != "") {
                    clearTimeout(t);
                    drawBackgroundImage(imgbinary);
                }
            }
        });
        t = setTimeout(function(){
            xhr.abort();
            drawBackgroundImage(lowres);
        }, 5000);
    }
    
    loadImage("path/to/highres.png", "path/to/low_res.png");
    


    PHP: (load_image.php)

    (这使用了function from the PHP manual 的一部分。)

    <?php
        $result = "";
        @ob_start();
        if (isset($_POST["image"])) {
            $filename = $_POST["image"];
            if (file_exists($filename)) {
                $filetype = pathinfo($filename, PATHINFO_EXTENSION);
                $imgbinary = fread(fopen($filename, "r"), filesize($filename));
                $result = "data:image/".$filetype.";base64,".base64_encode($imgbinary);
            }
        }
        @ob_end_clean();
        echo $result;
    ?>
    

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 2017-01-18
      相关资源
      最近更新 更多