当前位置: 首页 > 知识库问答 >
问题:

你能推荐一个不依赖HTML或atob的JavaScript JPEG库吗?

淳于兴朝
2023-03-14

我在使用JavaScript读取JPEG二进制数据时遇到了一些问题,并且正在寻找一些关于库或替代方法的建议。

我正在修改一个名为jsPDF的开源PDF生成库,以便它能够与Appcelerator Tian Alloy 3.41项目一起使用。我遇到的问题是,虽然Tianium使用JavaScript,但实现并不支持所有数据类型或方法。

例如,我发现的大多数JPEG库都使用在web浏览器中实现的atob和btoa方法将base64数据编码/解码为二进制字符串。不幸的是,我正在创建的项目不使用web浏览器,即使我改变了方法,Tianium的WebView也不支持atob或btoa方法。

我也尝试过使用Titanium的base64encode和base64decode实用程序,但是它们返回的是Blob而不是二进制字符串,我见过的大多数将base64转换为二进制字符串的方法都需要ArrayBuffer,Titanium也没有实现。

我按照以下步骤生成PDF:

>

var imgData='数据:图像/jpeg;base64,/9j/4AAQSkZJRgABAQEA。。。。。ooA//2Q==';

然后,库从dataURI中提取图像数据。然后,库使用atob方法将Base64转换为二进制字符串,然后如果环境支持ArrayBuffers,则使用函数将ArrayBuffer转换为钛支持的Uint8Array。从那里,二进制数据被用来提取JPEG的高度、宽度等。

从jsPDF中提取代码

var base64Info = this.extractInfoFromBase64DataURI(imageData);
if(base64Info) {
  format = base64Info[2];
  imageData = atob(base64Info[3]);//convert to binary string, the base64 encoded JPEG 
 } 

.....

if(this.supportsArrayBuffer()) {
  dataAsBinaryString = imageData;
  imageData = this.binaryStringToUint8Array(imageData);
}

.....

function binaryStringToUint8Array(binary_string) {
  var len = binary_string.length;
  var bytes = new Uint8Array( len );
  for (var i = 0; i < len; i++) {
    bytes[i] = binary_string.charCodeAt(i);
  }
  return bytes;
};

共有2个答案

蔡辰钊
2023-03-14

下面是一个纯javascript示例

// Create Base64 Object
var Base64= {_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/++[++^A-Za-z0-9+/=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}

// Define the string
var string = 'Hello World!';

// Encode the String
var encodedString = Base64.encode(string);
console.log(encodedString); // Outputs: "SGVsbG8gV29ybGQh"

// Decode the String
var decodedString = Base64.decode(encodedString);
console.log(decodedString); // Outputs: "Hello World!"

https://scotch.io/tutorials/how-to-encode-and-decode-strings-with-base64-in-javascript

鄢修德
2023-03-14

我在IE 9和jspdf中遇到了同样的问题。插件。阿迪玛。js,其中未实现atob。你能试试这个聚填料吗?https://github.com/davidchambers/Base64.js

 类似资料:
  • 本文向大家介绍请你用不超过200个字的推荐一首你最喜欢的歌曲或歌手,注意是“推荐”,不是“介绍”,要求能打动一个陌生人,让他喜欢上你的推荐。相关面试题,主要包含被问及请你用不超过200个字的推荐一首你最喜欢的歌曲或歌手,注意是“推荐”,不是“介绍”,要求能打动一个陌生人,让他喜欢上你的推荐。时的应答技巧和注意事项,需要的朋友参考一下 《左手指月》 听到这首歌,感觉自己在天上窜,伸手就能摘下月亮。我

  • 问题内容: 您能推荐一个Java库来读取,解析,验证和将逗号分隔值(CSV)文件中的行映射到Java值对象(JavaBeans)吗? 问题答案: 读取CSV文件 以下示例使用了CsvDozerBeanReader(我们刚刚发布的新阅读器,该阅读器使用Dozer进行了具有深度映射和基于索引的映射支持的Bean映射)-它基于我们网站上的示例。如果你不需要推土机功能(或者只需要一个简单的独立依赖项),则

  • 本文向大家介绍RequireJS 依赖关系的实例(推荐),包括了RequireJS 依赖关系的实例(推荐)的使用技巧和注意事项,需要的朋友参考一下 现在看看RequireJS带来的整洁的特点: 下面有个html页面: 最有一个script语句引入了require.js文件,并且在data-main中指定了另一个js文件:config.js,我定义如下: require.config中配置了引入的第

  • 本文向大家介绍请你分别用不超过200个字推荐(是“推荐”,不是“介绍”)一首你最喜欢的歌曲(或歌手)、电台(或主播),要求能打动一个陌生人,让ta也喜欢上你的推荐。如果你没有要推荐的,也可以不作答。相关面试题,主要包含被问及请你分别用不超过200个字推荐(是“推荐”,不是“介绍”)一首你最喜欢的歌曲(或歌手)、电台(或主播),要求能打动一个陌生人,让ta也喜欢上你的推荐。如果你没有要推荐的,也可以

  • 问题内容: 在Java中,我们可以有许多不同的方式来获得当前的时间戳,但哪一个建议: 或 问题答案: 两者都很好。除少数目的外,均不推荐使用。 从纪元开始,您需要几毫秒? 在Java中,我们可以通过多种方法来获取当前时间戳, 对于当前时间戳,请使用。无需转换为毫秒。 Java诞生之初的许多方法,以及标准库中的许多方法,都以自纪元以来的毫秒数为单位。但是,今天我会考虑过时的。看看是否可以找到(或创建

  • 我正在使用maven 3.1.1,我有以下问题 我有一个主项目(pom.xml),它将被编译为WAR文件。它有两个模块。 模块1有以下内容(请注意工件的版本) 模块2有以下内容(请注意工件的版本) 因此,我的项目依赖于同一个库的两个版本。问题是库版本2与版本1不向后兼容。所以,我不能只包括版本2。 我正在考虑修改模块1以使用库版本2,但这需要大量时间。因此,我正在寻找一种方法来包含库的两个版本。