iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >html5中怎么通过png图的rgba值缓存数据
  • 578
分享到

html5中怎么通过png图的rgba值缓存数据

2024-04-02 19:04:59 578人浏览 泡泡鱼
摘要

这篇文章主要介绍“HTML5中怎么通过png图的rgba值缓存数据”,在日常操作中,相信很多人在html5中怎么通过png图的rgba值缓存数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,

这篇文章主要介绍“HTML5中怎么通过png图的rgba值缓存数据”,在日常操作中,相信很多人在html5中怎么通过png图的rgba值缓存数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”html5中怎么通过png图的rgba值缓存数据”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

原理

我们知道,通过为静态资源设置Cache-Control和Expires响应头,可以迫使浏览器对其进行缓存。浏览器在向后台发起请求的时候,会先在自身的缓存里面找,如果缓存里面没有,才会继续向服务器请求这个静态资源。利用这一点,我们可以把一些需要被缓存的信息通过这个静态资源缓存机制来进行储存。

那么我们如何把信息写入到静态资源中呢?canvas提供了.getImageData()方法和.createImageData()方法,可以分别用于读取和设置图片的rgba值。所以我们可以利用这两个api进行信息的读写操作。

接下来看原理图:

html5中怎么通过png图的rgba值缓存数据

当静态资源进入缓存,以后的任何对于该图片的请求都会先查找本地缓存,也就是说信息其实已经以图片的形式被缓存到本地了。

注意,由于rgba值只能是[0, 255]之间的整数,所以本文所讨论的方法仅适用于纯数字组成的数据。

静态服务器

我们使用node搭建一个简单的静态服务器:

const fs = require('fs') const Http = require('http') const url = require('url') const querystring = require('querystring') const util = require('util')  const server = http.createServer((req, res) => {   let pathname = url.parse(req.url).pathname   let realPath = 'assets' + pathname   console.log(realPath)   if (realPath !== 'assets/upload') {      fs.readFile(realPath, "binary", function(err, file) {       if (err) {         res.writeHead(500, {'Content-Type': 'text/plain'})         res.end(err)       } else {         res.writeHead(200, {           'Access-Control-Allow-Origin': '*',           'Content-Type': 'image/png',           'ETag': "666666",           'Cache-Control': 'public, max-age=31536000',           'Expires': 'Mon, 07 Sep 2026 09:32:27 GMT'         })         res.write(file, "binary")         res.end()       }    })   } else {     let post = ''     req.on('data', (chunk) => {       post += chunk     })     req.on('end', () => {       post = querystring.parse(post)       console.log(post.imgData)       res.writeHead(200, {         'Access-Control-Allow-Origin': '*'       })       let base64Data = post.imgData.replace(/^data:image\/\w+;base64,/, "")       let dataBuffer = new Buffer(base64Data, 'base64')       fs.writeFile('assets/out.png', dataBuffer, (err) => {         if (err) {           res.write(err)           res.end()         }         res.write('OK')         res.end()       })     })   } })  server.listen(80)  console.log('Listening on port: 80')

这个静态资源的功能很简单,它提供了两个功能:通过客户端传来的base64生成图片并保存到服务器;设置图片的缓存时间并发送到客户端。

关键部分是设置响应头:

res.writeHead(200, {   'Access-Control-Allow-Origin': '*',   'Content-Type': 'image/png',   'ETag': "666666",   'Cache-Control': 'public, max-age=31536000',   'Expires': 'Mon, 07 Sep 2026 09:32:27 GMT' })

我们为这张图片设置了一年的Content-Type和十年的Expires,理论上足够长了。下面我们来进行客户端的coding

客户端

<!-- client.html -->  <canvas id="canvas" width="8", height="1"></canvas>

假设我们需要存储的是32位的数据,所以我们为canvas设置宽度为8,高度为1。到底为什么32位数据对应长度为8,是因为每一个像素都有一个rgba,对应着red,green,blue和alpha4个数值,所以需要除以4。

<!-- client.js -->  let keyString = '01234567890123456789012345678901'          let canvas = document.querySelector('#canvas') let ctx = canvas.getContext('2d')  let imgData = ctx.createImageData(8, 1)  for (let i = 0; i < imgData.data.length; i += 4) {     imgData.data[i + 0] = parseInt(keyString[i]) + 50     imgData.data[i + 1] = parseInt(keyString[i + 1]) + 100     imgData.data[i + 2] = parseInt(keyString[i + 2]) + 150     imgData.data[i + 3] = parseInt(keyString[i + 3]) + 200 }  ctx.putImageData(imgData, 0, 0)

首先我们假设需要被缓存的字符串为32位的01234567890123456789012345678901,然后我们使用.createImageData(8,  1)生成一个空白的imgData对象。接下来,我们对这个空对象进行赋值。为了实验效果更加直观,我们对rgba值都进行了放大。设置完了imgData以后,通过.putImageData()方法把它放入我们的canvas即可。

我们现在可以打印一下,看看这个imgData是什么:

// console.log(imgData.data)  [50, 101, 152, 203, 54, 105, 156, 207, 58, 109, 150, 201, 52, 103, 154, 205, 56, 107, 158, 209, 50, 101, 152, 203, 54, 105, 156, 207, 58, 109, 150, 201]

接下来,我们要把这个canvas编译为一张图片的base64并发送给服务器,同时接收服务器的响应,对图片进行缓存:

$.post('http://xx.xx.xx.xx:80/upload', { imgData: canvas.toDataURL() }, (data) => {     if (data === 'OK') {         let img = new Image()         img.crossOrigin = "anonymous"         img.src = 'http://xx.xx.xx.xx:80/out.png'         img.onload = () => {             console.log('完成图片请求与缓存')             ctx.drawImage(img, 0, 0)             console.log(ctx.getImageData(0, 0, 8, 1).data)         }     } })

代码很简单,通过.toDataURL()方法把base64发送到服务器,服务器处理后生成图片并返回,其图片资源地址为http://xx.xx.xx.xx:80/out.png。在img.onload后,其实图片就已经完成了本地缓存了,我们在这个事件当中把图片信息打印出来,作为和源数据的对比。

结果分析

开启服务器,运行客户端,***次加载的时候通过控制台可以看到响应的图片信息:

html5中怎么通过png图的rgba值缓存数据

200 OK,证明是从服务端获取的图片。

关闭当前页面,重新载入:

html5中怎么通过png图的rgba值缓存数据

200 OK (from cache),证明是从本地缓存读取的图片。

接下来直接看rgba值的对比:

源数据:  [50, 101, 152, 203, 54, 105, 156, 207, 58, 109, 150, 201, 52, 103, 154, 205, 56, 107, 158, 209, 50, 101, 152, 203, 54, 105, 156, 207, 58, 109, 150, 201]  缓存数据:[50, 100, 152, 245, 54, 105, 157, 246, 57, 109, 149, 244, 52, 103, 154, 245, 56, 107, 157, 247, 50, 100, 152, 245, 54, 105, 157, 246, 57, 109, 149, 244]

之前得到的结论,源数据与缓存数据存在误差的原因,经查证后确定为alpha值的干扰所致。如果我们把alpha值直接定为255,并且只把数据存放在rgb值内部,即可消除误差。下面是改良后的结果:

源数据: [0, 1, 2, 255, 4, 5, 6, 255, 8, 9, 0, 255, 2, 3, 4, 255, 6, 7, 8, 255, 0, 1, 2, 255, 4, 5, 6, 255, 8, 9, 0, 255]  缓存数据:[0, 1, 2, 255, 4, 5, 6, 255, 8, 9, 0, 255, 2, 3, 4, 255, 6, 7, 8, 255, 0, 1, 2, 255, 4, 5, 6, 255, 8, 9, 0, 255]

到此,关于“html5中怎么通过png图的rgba值缓存数据”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: html5中怎么通过png图的rgba值缓存数据

本文链接: https://www.lsjlt.com/news/86298.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • html5中怎么通过png图的rgba值缓存数据
    这篇文章主要介绍“html5中怎么通过png图的rgba值缓存数据”,在日常操作中,相信很多人在html5中怎么通过png图的rgba值缓存数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2024-04-02
  • HTML5中怎么使用网络存储存储键值对的数据
    本篇内容介绍了“HTML5中怎么使用网络存储存储键值对的数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • 怎么通过spark将数据存储到elasticsearch
    这篇文章主要介绍“怎么通过spark将数据存储到elasticsearch”,在日常操作中,相信很多人在怎么通过spark将数据存储到elasticsearch问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎...
    99+
    2023-06-02
  • Couchbase中怎么实现数据缓存
    在Couchbase中,数据缓存可以通过使用Couchbase的内置缓存功能来实现。Couchbase是一个基于内存的NoSQL数据...
    99+
    2024-03-08
    Couchbase
  • MySQL数据库中怎么查询缓存
    这期内容当中小编将会给大家带来有关MySQL数据库中怎么查询缓存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、缓存条件,原理MySQL Query Cache是用来缓...
    99+
    2024-04-02
  • jQuery中数据缓存$.data怎么使用
    这篇文章主要介绍“jQuery中数据缓存$.data怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“jQuery中数据缓存$.data怎么使用”文章能帮助大家解决问题。一、实现原理:对于DOM...
    99+
    2023-07-04
  • 如何通过PHP开发缓存提高网站的数据处理效率
    如何通过PHP开发缓存提高网站的数据处理效率随着互联网的快速发展,网站的数据处理效率成为用户体验的重要指标之一。当网站访问量增多,数据处理量变大时,传统的数据库查询往往会导致网站延迟严重,影响用户体验。为了提高网站的数据处理效率,开发人员可...
    99+
    2023-11-07
    PHP缓存 开发技巧 网站处理效率
  • HTML5中怎么通过绘制点线面组成一个3D图形
    这篇文章将为大家详细讲解有关HTML5中怎么通过绘制点线面组成一个3D图形,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。3D立方体做一个立方体,我用了三个对...
    99+
    2024-04-02
  • Vue中怎么通过input筛选数据
    这篇文章给大家介绍Vue中怎么通过input筛选数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。具体内容如下<div id="app"> &...
    99+
    2024-04-02
  • C语言中怎么通过指针参数返回值
    今天小编给大家分享一下C语言中怎么通过指针参数返回值的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。简单的案例深夜无聊而引发的...
    99+
    2023-07-05
  • 怎么通过HTML5 Canvas实现图片的平移及旋转变化
    小编给大家分享一下怎么通过HTML5 Canvas实现图片的平移及旋转变化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!平移变换translate()平移变换,故...
    99+
    2023-06-09
  • 你知道吗?Java中的数组加载过程可以通过缓存进行优化!
    Java是一种面向对象的编程语言,广泛用于开发各种类型的应用程序。数组是Java语言中非常常见的数据结构之一,它可以帮助程序员更有效地组织和存储数据。然而,随着数据量的增加,数组的加载和访问可能会变得非常缓慢,这会导致程序的性能下降。为了...
    99+
    2023-06-17
    数组 load 缓存
  • java静态类中缓存数据怎么实现
    在Java中,可以使用静态变量来实现数据的缓存。静态变量是与类关联的变量,它们在整个应用程序的生命周期内都保持不变,并且可以被所有类...
    99+
    2023-10-27
    java
  • 怎么在thinkphp5中使用redis缓存新增的数据
    本篇文章为大家展示了怎么在thinkphp5中使用redis缓存新增的数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。找到该文件thinkphp/library/think/cache/drive...
    99+
    2023-06-14
  • Access数据库中怎么通过输入数据创建表
    Access数据库中怎么通过输入数据创建表,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.打开数据库先打开已创建的数据库,例如,jwgl...
    99+
    2024-04-02
  • NoSQL中的图数据库怎么存储和查询数据
    NoSQL中的图数据库使用图结构来存储数据,其中节点表示实体,边表示实体之间的关系。图数据库通常使用两种主要数据结构来表示图:邻接列...
    99+
    2024-05-07
    NoSQL
  • 如何通过索引提升PHP与MySQL的缓存命中率和数据库查询效率?
    引言:在开发网站和应用程序时,PHP与MySQL是常用的组合。然而,为了优化性能和提高用户体验,我们需要关注数据库查询的效率和缓存的命中率。其中,索引是提高查询速度和缓存效率的关键。本文将介绍如何通过索引来提升PHP与MySQL的缓存命中率...
    99+
    2023-10-21
    索引优化 缓存技术 查询优化
  • 云服务器怎么清理缓存数据的内存
    云服务器可以使用内存缓存技术来减少内存占用,以便更快地处理数据,并提高数据的响应速度。以下是一些清除内存数据的步骤: 关闭计算机或云服务器的后台服务,例如自动更新服务、远程管理或DNS。这些服务可以自动从系统中删除不需要的缓存数据。 将...
    99+
    2023-10-26
    缓存 内存 服务器
  • 怎么保证缓存和数据库的数据一致性
    本篇内容主要讲解“怎么保证缓存和数据库的数据一致性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么保证缓存和数据库的数据一致性”吧!1、错误的解决方案1.1、...
    99+
    2023-04-21
    数据库
  • Android 数据库中怎么存取图片
    Android 数据库中怎么存取图片,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、数据库创建和存取方法:在数据库创建时,图片字段的数据...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作