我有几个不同维度的.png位图,例如./img/dog.png
和./img/cat.png
。 如何通过JS加载我的图像的base64
字符串?我的预期数据就像那样(但更长):
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB9AAAAfQCAYAAACaOMR5AAAgAElEQ…ECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAicCwy83crEe3e04AAAAABJRU5ErkJggg==
注意:我希望找回这个字符串,这是我的文件,只是我的文件,没有剪裁,也没有更大。然后,我将其嵌入到SVG <image>
元素中,例如:
<image href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB9AYAAACaOMR5AAAgAElyuiRTYUdG
EQVR4XuydB5RdZfW3nZlk0gukk4QUQiCQEEil994RFBCkigpir4j+7V2xgygiIIgggoBUQTqkQIAACQktCamk90m
yfc8492u1/PdqSlMwslaWTNz7zlv2W/d+7f3b5e8r4H/fvzjH+/3pS996akGvva+b37zm4d27Nhx5Wc+85mxNb3r
7xhtvdFi3bl1VWVnZ2ptuumldVVXVIS+88MLAo4466tlPfOIT459//vmOe+2115L61E07D1i2bFmL7373uw/V5/n
GPEOfSs8666zmq1atasa/dbvvvvva73znOwffeOONp5SXl1e89NJLX37xxRfb3HHHHatbtmy5//XXX3/yRz7ykds
+//nPP92Y+nzntddea8+PNchi/Qc/+MHKb33rW4d84xvfeMR62rdvXzl+/Ph1yKjZzjvvvMZnly5duvquu+46sHX
r1mtow7pDDjnk5aFDh64s1F/Czw3+/tvf/nakMq5Pu1555ZW29HXFF7/4xWNffvnl/s2bN6/s1q3bwj/84Q+3xhh
6EMfOmf58uVtqb/9+vXrmz399NPftey33367Ve/evVc7Hxjnqu23336l9X7qU5866Ve/+tWdH/7whz80e/bs7vvo
t9+LyLXlxz72sYfWrl274Z133qlq165dyT//+c8D7r333gN22GGHOdQ1as6cOfvy/Y4DBgy4AXncMWPGDGHsdfgW
...
...
...
vf/nakMq5Pu1555ZW29HXFF7/4xdfgvf/nakMq5Pu1sfgW29HXFF7/4xW">
</image>
我的最终项目看起来会是这样的:)
另请参阅:https://rugger-demast.codio.io/front/_location_map-en-wikiatlas.html,您可以在其中下载SVG,但png目前只是一个链接,不会被下载。
答案 0 :(得分:5)
行。解决方案在this fiddle中,并解释如下。
0)目标:我想附加一些内容:
<img src="data:[mime type;][charset=<charset>;][base64,][base64 data]"> // formula
<image src='data:image/png;base64,SGVsbG8s...IHdvcmxkIQ='></image>" // shortened example
PNG存储为BLOB,又称“存储为单个实体的二进制数据集合”。所以我需要BLOB到Base64转换器:
var converterEngine = function (input) { // fn BLOB => Binary => Base64 ?
var uInt8Array = new Uint8Array(input),
i = uInt8Array.length;
var biStr = []; //new Array(i);
while (i--) { biStr[i] = String.fromCharCode(uInt8Array[i]); }
var base64 = window.btoa(biStr.join(''));
return base64;
};
var getImageBase64 = function (url, callback) {
// to comment better
var xhr = new XMLHttpRequest(url), img64;
xhr.open('GET', url, true); // url is the url of a PNG/JPG image.
xhr.responseType = 'arraybuffer';
xhr.callback = callback;
xhr.onload = function(){
img64 = converterEngine(this.response); // convert BLOB to base64
this.callback(null,img64) // callback : err, data
};
xhr.onerror = function(){ callback('B64 ERROR', null); };
xhr.send();
};
// make it looks like other D3js requests
d3.uri = function(url, callback) {
return getImageBase64(url, callback);
};
我使用回调运行函数,以附加带有base64 URI数据的图像元素。
d3.uri('http://fiddle.jshell.net/img/logo.png', function(data){
$("#myImage").attr("src", "data:image/png;base64," + data); // inject data:image in DOM
} )
来源:我从Getting BLOB data from XHR request获得了帮助,然后是demoed there。
我实际上最终可能会使用服务器端转换(来源this和this)。可能的方法是:
echo -n `cat file.png` | base64 > output.txt
openssl base64 < path/to/file.png | tr -d '\n' > output.txt
cat path/to/file.png | openssl base64 | tr -d '\n' > output.txt
openssl base64 -in input.png -out output.txt
答案 1 :(得分:1)
如果需要,可以使用XMLHttpRequest将文件从文件加载到JavaScript对象中。然后,您可以使用setAttribute将值分配给image元素的xlink:href属性。但这个问题的答案可能就是你想要的。