实现大图片秒开

Flutter Web性能优化实战:从加载瓶颈到秒开体验 Web应用性能优化是前端开发的核心课题,它直接影响用户体验和业务转化。其原理在于通过减少资源体积、优化加载策略和提升运行时效率,来改善关键性能指标如LCP(最大内容绘制时间)和FID(首次输入延迟)。在工程实践中,这涉及代码分割、资源压缩、缓存策略等一系列技术组合。对于采用Flutter框架的Web应用,性能优化更具挑战与价值——Flutter Web凭借统一的Dart代码库能实现多端一致体验,但初始包体积较大,需针对性优化。本文聚焦Flutter Web加载速度这一现实瓶颈,提供从诊断分析、构建优化到运行 阅读详情

使用瓦片技术:

在图片瓦片加载中,大图像被分割成等大小的瓦片,通常是正方形。每个瓦片都是独立的图像,具有自己的URL路径或标识符。当用户浏览或缩放图像时,只需要加载当前可见区域的瓦片,而不是整个大图像。这样可以有效地节省带宽和加载时间。

加载图片瓦片的过程通常涉及以下几个步骤:

  1. 切割图像:将大图像切分成多个小瓦片,每个瓦片都有自己的位置和标识符。

  2. 确定可见区域:根据用户的视口和缩放级别,确定当前可见的瓦片区域。

  3. 加载可见瓦片:根据可见区域的位置和标识符,仅加载当前可见的瓦片图像。

  4. 绘制瓦片:将加载完成的瓦片绘制到画布或图像容器中,以显示出完整的大图像。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    canvas{
      overflow: hidden;
    }
  </style>
</head>
<body>
  <img src="./img/zero/0-0.png"/>
  <script>
    // 创建一个Canvas元素
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');

// 定义切片大小和缩放级别
var tileWidth = 192; // 每个瓦片的宽度
var tileHeight = 500; // 每个瓦片的高度
var zoomLevel = 0; // 缩放级别

// 加载大图片
var image = new Image();
image.src = './img/test.png';
image.onload = function() {
  // 计算切片数量
  var numTilesX = Math.ceil(image.width / (tileWidth * Math.pow(2, zoomLevel)));
  var numTilesY = Math.ceil(image.height / (tileHeight * Math.pow(2, zoomLevel)));

  // 设置Canvas大小
  canvas.width = numTilesX * tileWidth/4;
  canvas.height = numTilesY * tileHeight/4;

  // 初始化显示区域
  var viewportWidth = Math.ceil(window.innerWidth / (tileWidth * Math.pow(2, zoomLevel)));
  var viewportHeight = Math.ceil(window.innerHeight / (tileHeight * Math.pow(2, zoomLevel)));
  var viewport = {
    left: 0,
    top: 0,
    right: viewportWidth - 1,
    bottom: viewportHeight - 1
  };

  // updateViewport();
  //   loadVisibleTiles();
  // 监听滚动事件,根据滚动位置更新显示区域
  window.addEventListener('scroll', function() {
    updateViewport();
    loadVisibleTiles();
  });

  // 更新显示区域
  function updateViewport() {
    var scrollX = window.pageXOffset || document.documentElement.scrollLeft;
    var scrollY = window.pageYOffset || document.documentElement.scrollTop;
    viewport.left = Math.floor(scrollX / (tileWidth * Math.pow(2, zoomLevel)));
    viewport.top = Math.floor(scrollY / (tileHeight * Math.pow(2, zoomLevel)));
    viewport.right = viewport.left + viewportWidth - 1;
    viewport.bottom = viewport.top + viewportHeight - 1;
  }

  // 加载可见的切片
  function loadVisibleTiles() {
    for (var y = viewport.top; y <= viewport.bottom; y++) {
      for (var x = viewport.left; x <= viewport.right; x++) {
        if (x >= 0 && x < numTilesX && y >= 0 && y < numTilesY) {
          loadTile(x, y);
        }
      }
    }
  }

    // 加载指定位置的切片
  function loadTile(x, y) {
    // 计算切片的起始位置和大小
    var tileX = x * tileWidth;
    var tileY = y * tileHeight;
    var tileWidthAtZoom = tileWidth * Math.pow(2, zoomLevel);
    var tileHeightAtZoom = tileHeight * Math.pow(2, zoomLevel);

    // 创建一个新的图片对象
    var tileImage = new Image();
    tileImage.src = './img/zero'+ '/' + x + '-' + y + '.png';
    console.log('./img/zero'+ '/' + x + '-' + y + '.png',tileX, tileY)
    tileImage.onload = function() {
      // 绘制切片到Canvas上
      context.drawImage(tileImage, tileX, tileY, tileWidthAtZoom, tileHeightAtZoom);

      // 在页面上显示Canvas
      document.body.appendChild(canvas);
    };
  }
}
  </script>
</body>
</html>

原生javascript-模拟地图瓦片加载 <!doctype> <html> <head> <style> *{ margin:0; padding:0; } canvas{ border:1pxsolidblack } </style> </head> ... 阅读详情

相关推荐

将图片切割成瓦片图-(算法+实现)

介绍:https://blog.youkuaiyun.com/STRIVEYe/article/details/88388072

前端加载超大图片(100M以上)实现秒开解决方案

例如,当用户放大图片时,系统会自动加载更高分辨率的瓦片,而缩小图片时则加载低分辨率的瓦片。例如,用户在北京访问时,系统会自动从最近的CDN节点加载瓦片,而不是从远在美国的服务器获取数据。例如,在4G网络下,系统会自动加载高清瓦片,而在2G网络下则加载低分辨率瓦片,以确保图片能够快速加载。通过这种方式,只有当用户滚动到某个瓦片所在的区域时,系统才会加载该瓦片,从而减少不必要的网络请求。通过这种方式,系统能够在用户首次访问后,将常用瓦片缓存到本地,从而减少后续访问时的加载时间。监听可视区域,动态加载所需瓦片。

爱分享的程序员 1129

openlayers3上加载瓦片图片

openlayers3上加载瓦片图片,可离线运行

Leaflet 自定义瓦片地图与 PHP 大图切图算法 解决大图没办法在浏览器显示的问题

Leaflet 是一个专门为地图交互设计的库,通过瓦片化加载大图片可以显著提升性能和用户体验。以下是关键点:性能:瓦片化减少内存占用,支持按需加载。用户体验:快速响应、平滑缩放、响应式设计。技术优势:标准化格式、插件生态、跨平台支持。 PHP 大图切图算法 解决大图没办法在浏览器显示的问题

luck332的专栏 1348

保姆级教程:在LKD3588开发板上为RK3588添加SC2210摄像头驱动(含完整DTS配置)

本文提供了一份详细的教程,指导如何在LKD3588开发板上为RK3588处理器添加SC2210摄像头驱动,包括完整的DTS配置和内核编译步骤。教程涵盖了环境准备、驱动文件添加、DTS配置详解、内核编译与烧录、驱动测试以及常见问题排查,帮助开发者快速实现SC2210传感器在RK3588平台上的集成与优化。

weixin_42641741的博客 479

基于stm32开发的红外循迹小车

2.L298N电机驱动模块:分别是5V,12V,GND,可以通过外加电源给驱动模块供电,IN1,IN2,IN3,IN4,EN1,EN2,通过给IN口不同的电平,可以达到控制电机正反转,EN口为使能口,可以通过给EN口不同的PWM波,来达到控制小车速度,1.红外循迹模块:检测黑线的原理是向外发射红外线,当没有遇到黑线的时候,返回回来,之后返回高电平,当遇到黑线的时候,红外被吸收,返回高电平,读取相应IO口的电平就可以知道小车此时的大致位置;模块有四个输入接口,分别连接四个TT马达,驱动小车运动;

2301_81374681的博客 1万+

HTML超大图片加载显示解决方案--图片切割转换成瓦片地图(BaiduMapTileCutter)

前言 项目中遇到加载网页加载显示大图片的需求(>100MB),参考百度地图等地图加载思路,将超大图片切割成瓦片地图,分级别展示,这样动态加载大图片时,只异步加载图片的部分区域,实现超大图片的高效加载显示。 1.瓦片切分工具-BaiduMapTileCutter 在github上发现一款开源瓦片切割工具,BaiduMapTileCutter,能够将图片切分成3-20级的瓦片,同时会生成一个index.html文件,用浏览器打开就能看到切分成瓦片地图的图片的展示效果,不过index.html需要联网

刘洋_heaven的博客 4133

如何使用obspy下载地震波形数据

如果你是地震研究学者,或者需要进行地震方面的研究,那么地震数据下载是一个必不可少的流程,本文将告诉你如何使用obspy下载想要的地震数据

monsterk1的博客 2074

【总结】2131- 前端加载超大图片(100M以上)实现秒开解决方案

前言前端加载超大图片时,一般可以采取以下措施实现加速:图片压缩:将图片进行压缩可以大幅减小图片的大小,从而缩短加载时间。压缩图片时需要注意保持图片质量,以免影响图片显示效果。图片分割:将超大图片分割成多个小图块进行加载,可以避免一次性加载整个图片,从而加快加载速度。这种方式需要在前端实现图片拼接,需要确保拼接后的图片无缝衔接。CDN 加速:使用 CDN(内容分发网络)可以将图片缓存在离用户更近的节...

pingan8787 187

Win11下Python脚本不执行?5分钟搞定PATH环境变量配置(VSCode终端实测)

本文针对Win11系统下VSCode终端中Python脚本执行无响应的问题,提供了详细的诊断与解决方案。核心在于正确配置PATH环境变量,通过图形化界面调整Python路径优先级,并分享了VSCode终端环境变量的刷新技巧,帮助开发者在5分钟内快速解决环境配置难题。

weixin_28358083的博客 384

5分钟搞定!用ZLMediaKit搭建GB28181视频监控系统(含避坑指南)

本文提供了一份基于ZLMediaKit搭建GB28181视频监控系统的实战指南。文章详细介绍了从环境准备、核心组件(ZLMediaKit与SIP服务器)部署、摄像头配置到内外网穿透的完整流程,并重点分享了设备ID配置、防火墙设置等关键避坑经验,帮助开发者快速构建稳定可控的监控平台。

apple5的专栏 1082

前端性能优化-优化大量图片加载&超大图片加载(附懒加载实现方案)

懒加载实现方案 一.大量图片加载优化方案 1.将图片服务和应用服务分离(从架构师的角度思考) 2. 图片压缩方案 3.图片懒加载 实现方案一 实现方案二 4.小图片比较多时 5.http2解决连接数限制 二、图片过大加载优化方案

LYFlied的博客 2万+

Android Update Engine 分析(三四)OTA 签名都支持哪些算法?

写了几十篇还没涉及到 OTA 签名算法细节,OTA 讨论群也很少问这个,毕竟签名算法纯理论的问题,一旦实现好就极少需要改动,只需要进行一些配置,准备好签名的秘钥和证书就可以了。限于签名的算法理论太过于抽象,本篇不讨论签名算法细节,但会总结一些签名操作。以及 Android OTA 包支持的签名算法。本文主要分析 Update Engine 中支持的签名算法,以及这些算法的操作实现(不涉及原理部分),并总结签名和验签使用的 key。

洛奇看世界 714

前端加载超大图片实现秒开解决方案

图像切片是指将一张大图分割成若干个小图的过程,以便于存储和处理。图像切片常用于网络地图、瓦片地图、图像拼接等应用中。切片原理主要包括以下几个步骤:定义切片大小:首先需要定义每个小图的大小,一般情况下是正方形或矩形。计算切片数量:根据定义的切片大小,计算原始图像需要被切成多少个小图。计算公式为:切片数量 = 原始图像宽度 / 切片宽度 × 原始图像高度 / 切片高度。切割图像:按照计算出的切片数量,将原始图像分割成相应数量的小图。可以使用图像处理库或自己编写代码实现。

2401_83384536的博客 1137

[关系图谱] 二.Gephi导入共线矩阵构建作者关系图谱

本文主要讲解Gephi绘制作者间的关系图谱,该软件可以广泛应用于社交网络、知识图谱分析,推荐读者使用。这是非常基础的一篇文章,重点讲解Gephi使用方法,希望对大家有所帮助。

杨秀璋的专栏 1万+

RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程

U-Boot(Universal Bootloader)是一种开源的引导加载程序,广泛用于嵌入式系统中。它的主要功能是初始化硬件设备,加载操作系统内核,并将控制权交给操作系统。U-Boot的启动流程可以分为多个阶段,以下是典型的U-Boot启动流程:

内核笔记 1232

“秒开”浏览器实现起来有多难?

作者:billpchen,腾讯看点前端开发工程师近两年,信息流行业处于一个增长缓慢甚至停滞的状态,腾讯看点一直在寻求自己的破局之路。研究发现,近两年实现爆发增长的业务都具有用户覆盖面大、...

腾讯技术工程 2万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android闪屏页(启动页)秒开的实现

简单分析一下闪屏页白屏,黑屏原因 市面上的有些App,点击App图标后,会出现白屏或者黑屏一段时间的问题。为什么会出现这种问题呢,其实在启动Acitivty的启动过程中,onCreate()方法并不是发生在窗口绘制的第一步,系统会在执行这个步骤之前,先绘制窗体,这时候onCreat()还没被执行,我们的setContentView(R.layout.activity_splash)就更不会被执行了,布局资源还没有被加载,这时系统就会使用当前Activity的主题默认背景色来展示。 简单两步实现闪屏页秒开无白

龍 3315

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android H5秒开方案调研—今日头条H5秒开方案详解

本文对Android H5秒开方案进行了调研,对今日头条App的秒开方案进行了详细分析。 本文首发:http://yuweiguocn.github.io/ 背景 在回家的地铁上使用自家应用H5相关功能时,可能由于网络原因导致体验较差,在使用微信、今日头条App时,感觉很流畅,基本做到了秒开,然后就想了解下业内H5秒开方案。 问题原因 文件下载耗时:包括html、css、js、图片等...

jiang19921002的博客 1699

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

如何实现H5秒开?

通过综合应用这些策略和技术,你可以显著提高H5页面的加载速度,实现秒开的目标。但请注意,每个项目的情况都是独特的,因此需要根据实际情况选择和调整优化策略。

王铁柱666的博客 596

如何实现 H5 秒开?

Gahing:我们先说回答方式,你有没有发现,你回答时容易遗漏和重复。比如说「图片懒加载」,你归到了「图片优化」,但其实也可以归到「加载优化」。同时你还漏了很多重要的优化手段,比如资源缓存、服务端渲染等等。究其原因应该是缺少抽象分类方法。那针对这个问题,应该如何分类回答?Gahing:分类并非唯一,可以有不同角度,但都需遵从。

web全栈开发的博客 1243

ByPhoto-秒开的安卓图片选择库

一、背景 ByPhoto是个安卓图片选择库, 在启动渲染速度上做了很多优化; 荣耀8真机测试,图库里有3000多张图片。 冷启动图片选择页渲染完成需800ms左右, 热启动(即第二次打开Activity)渲染需要300ms。 真正实现了秒开的用户体验。 二、需求 1、支持图片预加载, 即将图库的前几张图片加载到内存中; 使用了Glide的preload; 2、数据库分段回调, 即图片有几千张...

brycegao321的博客 1422
上一篇: 前端常用设计模式
下一篇: webpack学习
小蒋小蒋快乐成长
博客等级 码龄9年 2109粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值