热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图片文件二进制编码合并与解析

前边都是废话,直接从第四段开始看对于一些html的动画页面,canvas动画页面,会需要大量的图片文件。一张一张的从服务器获取图片

 

  前边都是废话,直接从第四段开始看

  对于一些html的动画页面,canvas动画页面,会需要大量的图片文件。一张一张的从服务器获取图片,会影响页面的显示。

  怎样提高动画的效果,可以写一个load页面,然后通过js把图片先从服务器加载下来,避免在动画的时候,保证动画的流畅性。但是问题来了,在有大量图片的页面里,需要大量的请求数,在前端优化里就有提到要减少请求数,雪碧图很好,但是每次都要找设计给你拼好,当然,自己花点时间也是可以掌握这个东西,去做。但是有没有一种程序的方式,把图片整合,然后运用呢,重点来了,往下看。

  图片基本上都是一些二进制数据的拼接,对我要整合的就是这些二进制数据。前提知识点,nodejs(不需要很多)中的文件操作就是 fs 了,文件的读、写。接下来就是js中的 API ArrayBuffer,还有他的两个视图TypedArray和DataView。还有blob,都用的比较浅,我本人也是初接触这些。

  压缩阶段: 通过nodejs来进行压缩,很好的一点通过nodejs的 fs 读取到的文件是一个buffer数据。在前端用过js可以完美解析

  由于nodejs读取文件的一个便利性,所以压缩主要是,读取文件然后设置文件的存储规则,我的文件基本是每个图片包括四部分: 图片名称的大小(指字节数)+图片名称+图片文件的大小+图片的二进制文件,前边三部分通过Uint32来存储,存储方式是一个默认的小端字节序。

  上代码:

var fs = require('fs');//所要读取文件的所在的位置 文件夹
var pat = './img/';
//生成文件的保存位置与文件名,文件后缀可以任意
var create = './cgppt/cg.sw';var buffer = new Buffer(0);
var files = fs.readdirSync(pat);
var count = files.length;
files.forEach(
function(filename) {count--;//读取文件数据var text = fs.readFileSync(pat + filename);//将文件的名称以及数据等信息压缩在一起var headerBuffer = header(filename, text);if(!!headerBuffer) {//将不同文件的二进制数据合并在一起,并写入文件buffer = Buffer.concat([buffer, headerBuffer]);if(count == 0) {fs.writeFile(create, buffer, (err) => {if (err) throw err;console.log('It\'s saved!');});}}
});
function header(filename, data) { //整合单个文件数据var text = fs.readFileSync(pat + filename);var fileLen = numToBuffer(filename.length + 4);if(filename.search(/\.png$|\.jpg$/ig) != -1) {var file = strToBuffer('img/' + filename);var dataLen = numToBuffer(text.length);var data = new Buffer(text);var header = Buffer.concat([fileLen, file, dataLen, data]);return header;}return false;
}
function strToBuffer(data) { //文件名称等信息规则var buffer = new Buffer(0);var str = data.toString();for(let i = str.length - 1; i >= 0; i--) {var num = str.charCodeAt(i);var strBuffer = numToBuffer(num);buffer = Buffer.concat([strBuffer, buffer]);}return buffer;
}
function numToBuffer(num) { //以小端字节序方式将文件大小信息编入var buffer = new Buffer(4),ppp = [];ppp[0] = num % 256;ppp[1] = num % (256*256) / 256;ppp[2] = num / (256*256) % (256);ppp[3] = num / (256*256*256);for (var i = 0; i ) {buffer[i] = ppp[i];}return buffer;
}

View Code

 

  前端解析: 这里就是通过js来解析这个二进制文件,将通过blob和URL生成的一个链接赋值给img的src,也可以用于canvas动画

  

  关键代码

while(len < data.byteLength) {//获取文件名的长度var f &#61; data.getUint32(len, !0);len &#43;&#61; 4;var l &#61; &#39;&#39;;//读取文件名for(var c &#61; 0; c) {var h &#61; data.getUint32(len, !1);len &#43;&#61; 4;l &#43;&#61; String.fromCharCode(h);}//读取文件的长度var p &#61; data.getUint32(len, !0);len &#43;&#61; 4;//读取文件var d &#61; new Uint8Array(buffer, len, p);//obj为文件名->文件的一个对象obj[l] &#61; d;len &#43;&#61; p,//文件名数组
o.push(l),//文件数组
a.push(d)
}

View Code

 

本文的大部分要点都来自于 阮一峰老师的Javascript标准参考教程&#xff0c;还有MDN的web技术文档。

本人前端小白&#xff0c;如有问题还请指正

欢迎转载、交流

 

 

参考链接&#xff1a; 阮一峰 二进制数据、阮一峰 nodejs fs模块、阮一峰 二进制数组

Javascript 标准参考教程&#xff08;alpha&#xff09;、MDN

 

转:https://www.cnblogs.com/dongcanliang/p/6134146.html



推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
author-avatar
宝马z4笑嘻嘻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有