JavaScript涉及二進(jìn)制的轉(zhuǎn)換方式
ArrayBuffer <==> String字符串(utf-8)
new TextEncoder().endoce()
new TextDecoder().decode()
/** ?* arraybuffer轉(zhuǎn)字符串 ?* @param {*} buffer ArrayBuffer ?* @param {*} decodeType 編碼格式 ?* @returns 字符串 ?*/ function ab2str(buffer, decodeType = "utf-8") { ? // 默認(rèn)是uft-8格式 ? let decoder = new TextDecoder(decodeType); ? return decoder.decode(buffer); } /** ?* 字符串 轉(zhuǎn) ArrayBuffer ?* @param {*} str 字符串 ?* @returns ArrayBuffer ?*/ function str2ab(str) { ? let encoder = new TextEncoder(); ? return encoder.encode(str); } let str = ab2str(new Uint8Array([97])); console.log(str); //''a'的ascii編碼是97 let ab = str2ab(str); console.log(ab); //Uint8Array(1) [ 97 ]
ArrayBuffer <==> TypedArray
new Uint8Array(buffer)
typedArray.buffer
let buffer = new ArrayBuffer(8); let ui8Array = new Uint8Array(buffer); console.log(ui8Array.buffer);
ArrayBuffer <==> DataView
new DataView(buffer)
dataview.getUint8()
let buffer = new ArrayBuffer(8); let dv = new DataView(buffer); dv.setUint8(0, 16); console.log(dv.getUint8(0)); //16
String字符串 <==> Base64字符串
- btoa(),編碼
- atob(),解碼
let base64Str = btoa("hello world"); let str = atob(base64Str); console.log(base64Str); //aGVsbG8gd29ybGQ= console.log(str); //hello world
Base64字符串 <==> Base64源數(shù)據(jù)的ArrayBuffer
通過atob()解碼,以及charCodeAt來獲取每一個(gè)能被編碼成base64的字符(都是1個(gè)字節(jié))的對(duì)應(yīng)的8位bit
function base64ToArrayBuffer(base64) { ? let str = atob(base64); // 將base64解碼成源二進(jìn)制數(shù)據(jù),可以被base64編碼的字符都是latin-1字符,1個(gè)字節(jié),所以可以使用charCodeAt()返回來的utf-16b編碼設(shè)置,低字節(jié)就是0x00-0x7F,設(shè)置給Uint8Array時(shí),保存低位,舍棄高位 ? let buffer = new ArrayBuffer(str.length); //以str的長(zhǎng)度new 一個(gè)緩沖區(qū) ? let ui8Arr = new Uint8Array(buffer); ? for (let i = 0; i < ui8Arr.length; i++) { ? ? //循環(huán)賦值每個(gè)字符對(duì)應(yīng)的unicode值,存8位 ? ? ui8Arr[i] = str.charCodeAt(i); ? } ? return ui8Arr.buffer; }
Blob
Blob() 構(gòu)造函數(shù)返回一個(gè)新的 Blob 對(duì)象。 blob的內(nèi)容由參數(shù)數(shù)組中給出的值的串聯(lián)組成
var aBlob = new Blob( array, options ); var aFileParts = ['<a id="a"><b id="b">hey!</b></a>']; // 一個(gè)包含DOMString的數(shù)組 var oMyBlob = new Blob(aFileParts, {type : 'text/html'}); // 得到 blob
array 是一個(gè)由ArrayBuffer, ArrayBufferView, Blob, DOMString 等對(duì)象構(gòu)成的 Array ,或者其他類似對(duì)象的混合體,它將會(huì)被放進(jìn) Blob。DOMStrings會(huì)被編碼為UTF-8.
options ,字典,兩個(gè)屬性:
- type
,默認(rèn)值為 “”,它代表了將會(huì)被放入到blob中的數(shù)組內(nèi)容的MIME類型。- endings
,默認(rèn)值為"transparent",用于指定包含行結(jié)束符\n的字符串如何被寫入。
Blob屬性
Blob.size
只讀,Blob 對(duì)象中所包含數(shù)據(jù)的大?。ㄗ止?jié))。Blob.type
只讀,一個(gè)字符串,表明該 Blob 對(duì)象所包含數(shù)據(jù)的 MIME 類型。如果類型未知,則該值為空字符串。Blob.slice([start[, end[, contentType]]])
,返回一個(gè)新的 Blob 對(duì)象,包含了源 Blob 對(duì)象中指定范圍內(nèi)的數(shù)據(jù)Blob.text()
,返回一個(gè)promise且包含blob所有內(nèi)容的UTF-8格式的 USVString。Blob.arrayBuffer()
返回一個(gè)promise且包含blob所有內(nèi)容的二進(jìn)制格式的 ArrayBuffer
Blob,File<==> ArrayBuffer,data:格式的base64字符串,String
Blob
blob.arrayBuffer()
,返回resolve arrayBuffer的promiseblob.text()
,返回resolve string 的promise
FileReader
FileReader
, 讀取Blob或者File,可以生成ArrayBuffer,base64字符串,文本reader.readAsArrayBuffer(blob)
,讀取完成后,reader.result 屬性中將包含一個(gè) ArrayBuffer 對(duì)象以表示所讀取文件的數(shù)據(jù)reader.readAsDataURL()
, 讀取完成后,reader.result 屬性將包含一個(gè)data:URL格式的字符串(base64編碼)以表示所讀取文件的內(nèi)容。reader.readAsText(blob,encodeType)
,讀取完成后,reader.result 屬性將包含一個(gè)utf-8格式的字符串以表示所讀取文件的內(nèi)容。reader.onload
事件表示讀取完成,在這里獲取數(shù)據(jù)
function readBlob(blob, type) { ? return new Promise((resolve) => { ? ? const reader = new FileReader(); ? ? switch (type) { ? ? ? case "ArrayBuffer": ? ? ? ? // arraybuffer ? ? ? ? reader.readAsArrayBuffer(blob); ? ? ? ? break; ? ? ? case "Text": ? ? ? ? // string ? ? ? ? reader.readAsText(blob, "utf-8"); ? ? ? ? break; ? ? ? case "DataURL": ? ? ? ? // DataURL,data:<mime-type>;base64,.... ? ? ? ? reader.readAsDataURL(blob); ? ? ? ? break; ? ? } ? ? reader.onload = function () { ? ? ? resolve(reader.result); ? ? }; ? }); } let blob = new Blob(["hello wolrd"]); readBlob(blob, "ArrayBuffer").then(console.log); // [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]; readBlob(blob, "Text").then(console.log); //hello wolrd readBlob(blob, "DataURL").then(console.log); // data:application/octet-stream;base64,aGVsbG8gd29scmQ=
File <==> Blob
File對(duì)象的來源有
1.構(gòu)造函數(shù),new(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag),其中BlobPart可以是String,ArrayBuffer,Blob
2.通過type=file的input選擇文件
Blob對(duì)象的來源有:
1.構(gòu)造函數(shù),new Blob(array,option),array 是一個(gè)由ArrayBuffer, ArrayBufferView, Blob, DOMString 等對(duì)象構(gòu)成的 Array ,或者其他類似對(duì)象的混合體,它將會(huì)被放進(jìn) Blob。DOMStrings會(huì)被編碼為UTF-8。
2.http返回的數(shù)據(jù)
3.file.slice()
4.blob.slice()
let file = new File([blob],'foo.png',{ ?? ?type:'image/png' }) let blob = new Blob([file],{type:'image/png'})
objectURL與Blob
ObjectURL格式:
blob:http://127.0.0.1:5500/d776d625-763d-40ca-a4fd-828968f93ec1
URL.revokeObjectURL(blob)
objectURL可以作為a標(biāo)簽的href屬性的值,a.click()則可以實(shí)現(xiàn)下載,也可以作為img.src
let blob = new Blob([JSON.stringify({ foo: "bar" })], { ? type: "application/json", }); // 下載文件 function download(data) { ? const a = document.createElement("a"); ? const blob = new Blob([data]); ? const url = URL.createObjectURL(blob); ? // 下載 ? a.href = url; ? a.download = "我是下載文件名.txt"; //文件名 ? a.click(); ? // 釋放blobURL ? URL.revokeObjectURL(url); } download(blob);
DataURL與Blob,File
格式:data:< mime-type >;base 64,…
該格式可以base64字符串可以直接賦值給img.src,顯示圖片
Blob生成DataURL
通過FileReader的readAsDataURL
let blob = new Blob(["hello world"]); let reader = new FileReader(); reader.readAsDataURL(blob); reader.onload = function () { ? console.log(reader.result); ? //data:application/octet-stream;base64,aGVsbG8gd29ybGQ= };
Canvas與ImageData,DataURL
canvas.toDataURL(type, encoderOptions)
返回一個(gè)包含圖片展示的 data URI
type
可選,圖片格式,默認(rèn)為 image/pngencoderOptions
可選,在指定圖片格式為 image/jpeg 或 image/webp的情況下,可以從 0 到 1 的區(qū)間內(nèi)選擇圖片的質(zhì)量
const canvas = document.getElementById("canvas"); const ctx = canvas.getContext("2d"); const image = new Image(); image.src = "./file/pic1.jpg"; image.onload = function () { ? // drawImage(imgElement,x,y) ? // 將圖片畫到canvas上 ? ctx.drawImage(image, 0, 0); ? // canvas.toDataURL() ? // 將canvas轉(zhuǎn)成DataURL, ? const dataUrl = canvas.toDataURL("image/png"); ? const img = document.createElement("img"); ? img.src = dataUrl; ? document.body.appendChild(img); };
canvas.toBlob(callback,type?,quality?)
callback
,獲取到blob的回調(diào)函數(shù)type
, 默認(rèn)是image/png,指定圖片格式quality
: 0-1,決定圖片質(zhì)量
const canvas = document.getElementById("canvas"); const ctx = canvas.getContext("2d"); ctx.fillStyle = "skyblue"; ctx.fillRect(50, 50, 100, 100); // canvas畫布轉(zhuǎn)blob canvas.toBlob(handleBlob, "image/png"); // 下載blob function handleBlob(blob) { ? const url = URL.createObjectURL(blob); ? const a = document.createElement("a"); ? a.download = "img.png"; ? a.href = url; ? a.click(); }
context.getImageData()
返回一個(gè)ImageData對(duì)象,用來描述canvas區(qū)域隱含的像素?cái)?shù)據(jù),這個(gè)區(qū)域通過矩形表示,起始點(diǎn)為(sx, sy)、寬為sw、高為sh
語法:
ImageData ctx.getImageData(sx, sy, sw, sh);
context.putImageData()
是 Canvas 2D API 將數(shù)據(jù)從已有的 ImageData 對(duì)象繪制到位圖的方法。
語法:// dx:在畫布的x軸偏移量,dy同理 // dirtyX: 要繪制imageData的起點(diǎn)x偏移量, // dirtyWidth: 要繪制的imageData的寬度 void ctx.putImageData(imagedata, dx, dy); void ctx.putImageData(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
layui關(guān)閉彈窗后刷新主頁面和當(dāng)前更改項(xiàng)的例子
今天小編就為大家分享一篇layui關(guān)閉彈窗后刷新主頁面和當(dāng)前更改項(xiàng)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09一文熟練掌握J(rèn)avaScript中Object.keys()與Object.values()的實(shí)用技巧
本文詳細(xì)介紹了JavaScript中Object.keys()和Object.values()方法的使用方法、功能及應(yīng)用場(chǎng)景,通過實(shí)例展示了如何使用這些方法進(jìn)行對(duì)象的遍歷、復(fù)制、比較和屬性計(jì)算等操作,需要的朋友可以參考下2025-01-01Bootstrap?按鈕下拉菜單的實(shí)現(xiàn)示例
本文主要介紹了Bootstrap?按鈕下拉菜單的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07(跨瀏覽器基礎(chǔ)事件/瀏覽器檢測(cè)/判斷瀏覽器)經(jīng)驗(yàn)代碼分享
一些js代碼,自己備用的,高手不要笑話我。(跨瀏覽器基礎(chǔ)事件,瀏覽器檢測(cè),判斷瀏覽器的名稱、版本號(hào)、操作系統(tǒng))等等,很實(shí)用的,方便自己使用,感興趣的朋友可以了解下,希望本文對(duì)你有所幫助2013-01-01純前端使用ffmpeg實(shí)現(xiàn)視頻壓縮的具體方法及踩坑
這篇文章主要給大家介紹了關(guān)于純前端使用ffmpeg實(shí)現(xiàn)視頻壓縮的具體方法及踩坑,要在前端使用FFmpeg進(jìn)行視頻壓縮,你可以使用FFmpeg的JavaScript,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12JS實(shí)現(xiàn)點(diǎn)擊按鈕控制Div變寬、增高及調(diào)整背景色的方法
這篇文章主要介紹了JS實(shí)現(xiàn)點(diǎn)擊按鈕控制Div變寬、增高及調(diào)整背景色的方法,涉及javascript動(dòng)態(tài)操作頁面元素屬性的相關(guān)技巧,適用于動(dòng)態(tài)更換頁面皮膚的功能,需要的朋友可以參考下2015-08-08js, jQuery實(shí)現(xiàn)全選、反選功能
本文主要介紹了js, jQuery實(shí)現(xiàn)全選、反選功能的方法,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03詳解怎么檢測(cè)和防止JavaScript死循環(huán)
最近工作中遇到了一些死循環(huán)導(dǎo)致的頁面卡死問題,經(jīng)過 trouble shooting 和代碼修復(fù)解決了問題,所以下面這篇文章主要給大家介紹了怎么檢測(cè)和防止JavaScript死循環(huán)的相關(guān)資料,需要的朋友可以參考下2021-11-11js統(tǒng)計(jì)頁面上每個(gè)標(biāo)簽的數(shù)量實(shí)例代碼
這篇文章通過實(shí)例代碼給大家講解了通過js統(tǒng)計(jì)頁面上每個(gè)標(biāo)簽的數(shù)量,代碼很簡(jiǎn)單,具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05