显示编码的 PNG
Display Encoded PNG
我正在使用 Autodesk 视图和数据 API 它的项目 API 正在以某种形式返回缩略图,我无法理解如何显示它.以下是从中返回的字符串。
�PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000�\u0000\u0000\u0000�\b\u0002\u0000\u0000\u0000\":9�\u0000\u0000\u0000\u0003sBIT\b\b\b��O�\u0000\u0000\u0003UIDATx����nSW\u0014@��ش���H(��>\u0010\u0001RE�vw3�3Z,��O\u0012��\u001c�m\u001b��˳\u0017��IX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�E�t�&so�9�\u001d�*3��\u000b�:3��������u���̌Ʈ��G!\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�8m�\u0014�ޯ��;3\u001a�Ъ�6��!9I=�Q�UfFcWYՙw*�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012.S�?3\u001a�Ъ.ST3�����2\u0005\u0015a�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�p�}���Vu潚\u0019�]eUgީ\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b�A^/�m�^⁄�\b�_�v�/��ݟ�ʣ\b+�z��*GNj�����v��p���y�]����Ǟ�s���e���j�L�f��\u0004��������N���l��m��mf����O�\u001f���v�*��q\u000e�p�'\u0012��������|��w��!��ݿ�ɟ}Z���\u0013-�2+�������o�\f�ې�=�����0��ҳ\bk&����n���玲ȣ���H\b���H\b���H\b���H\b���H\b���H\b��3��ό�.��3���h�*��\u0005\u0002T�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$\��f4v�U]��fFcWY�e\n*�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"qx�l���}�{G���h�B���aے���<\nI\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H�\u0005�\u000e�e�-S\u0002\u0000\u0000\u0000\u0000IEND�B`�
我的问题是如何在html中将这种类型的编码字符串显示为PNG。
通过在 javascript.
中编写以下代码接收到上述输出
function getThumbnails(urn) {
var urnStr = urn;
if (!urnStr || (0 === urnStr.length)) {
alert("You must specify a URN!");
return;
}
var urlStr = _baseURL + '/viewingservice/v1/thumbnails/' + urnStr;
var jqxhr = $.ajax({
url: urlStr + '?width=150&height=150',
type: 'GET',
headers: {
"Authorization": "Bearer " + getAccessToken()
},
beforeSend: startSpinner("spn_viewTranslationStatus")
})
.done(function (ajax_data) {
console.log(JSON.stringify(ajax_data, null, ' '));
var download = document.createElement('a');
//download.href = 'data:image/png;'+ajax_data+'';
download.href = ajax_data + '';
var r = /\u([\d\w]{4})/gi;
var x = ajax_data.replace(r, function (match, grp) {
return String.fromCharCode(parseInt(grp, 16)); } );
x = unescape(x);
console.log(x);
download.href = 'data:image/png;'+x+'';
download.download = 'reddot.png';
download.click();
$('body').append('<img src="data:image/png;base64,' + Base64.encode(x) + '"/>'),
stopSpinner();
})
.fail(function (jqXHR, textStatus) {
//$("#txt_resViewTranslateStatus").html(ajaxErrorStr(jqXHR));
stopSpinner();
});
}
您需要将文件保存在您的服务器上并在您的 html 页面中提供。如果您从客户端 javascript 端访问气泡信息,您应该解码字符串并将其分配给如下所示的 IMG 标签。基本上,如果图像尚未编码,则将图像编码为 base64 字符串,并将该字符串设置为 IMG 元素的源:
var imgData ='data:image/png;base64,' + 'my base64 encoded string' ;
$("#myImg").src =imgData ;
(注意此格式与 CSS 格式相同)
因为你这里的图片是unicode编码的,你需要用它们的真实表示来替换\u\b字符。您可以使用 this site (2nd converter) to do it, or use the technique explained here.
实际上我从服务器接收到一个 PNG,但它没有以 javascript 符号正确显示,所以我在 PHP [=11] 中写了一个 curl =]
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "https://developer.api.autodesk.com/viewingservice/v1/thumbnails/urn");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization:Bearer x8KaVvMxZTxliTjYPiBTmpL0JaIC' ));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// grab URL and pass it to the browser
$out = curl_exec($ch);
$information = curl_getinfo($ch);
//var_dump($information );
// close cURL resource, and free up system resources
curl_close($ch);
echo $out;
$fp = fopen('myfile.png', 'w');
fwrite($fp, $out);
fclose($fp);
并且它将文件完全显示为 PNG。
长话短说,这看起来像是有人使用 readAsText() 读取图像,它将 ("interprets") 二进制文件转换为 utf8,而不是 utf16。您需要让服务器 return 理想情况下以 arraybuffer 或 blob 格式的数据,甚至是 base64,这些保留二进制文件。
带有片段的长版本。 (片段中的那些问号符号显示丢失的信息,将其与 utf16 中不是问号的二进制文件进行比较):
我正在使用 Autodesk 视图和数据 API 它的项目 API 正在以某种形式返回缩略图,我无法理解如何显示它.以下是从中返回的字符串。
�PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000�\u0000\u0000\u0000�\b\u0002\u0000\u0000\u0000\":9�\u0000\u0000\u0000\u0003sBIT\b\b\b��O�\u0000\u0000\u0003UIDATx����nSW\u0014@��ش���H(��>\u0010\u0001RE�vw3�3Z,��O\u0012��\u001c�m\u001b��˳\u0017��IX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�E�t�&so�9�\u001d�*3��\u000b�:3��������u���̌Ʈ��G!\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�8m�\u0014�ޯ��;3\u001a�Ъ�6��!9I=�Q�UfFcWYՙw*�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012.S�?3\u001a�Ъ.ST3�����2\u0005\u0015a�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�\u0010\u0016\ta�p�}���Vu潚\u0019�]eUgީ\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b�A^/�m�^⁄�\b�_�v�/��ݟ�ʣ\b+�z��*GNj�����v��p���y�]����Ǟ�s���e���j�L�f��\u0004��������N���l��m��mf����O�\u001f���v�*��q\u000e�p�'\u0012��������|��w��!��ݿ�ɟ}Z���\u0013-�2+�������o�\f�ې�=�����0��ҳ\bk&����n���玲ȣ���H\b���H\b���H\b���H\b���H\b���H\b��3��ό�.��3���h�*��\u0005\u0002T�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$�EBX$\��f4v�U]��fFcWY�e\n*�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"!,\u0012�\"qx�l���}�{G���h�B���aے���<\nI\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H\b���H�\u0005�\u000e�e�-S\u0002\u0000\u0000\u0000\u0000IEND�B`�
我的问题是如何在html中将这种类型的编码字符串显示为PNG。 通过在 javascript.
中编写以下代码接收到上述输出 function getThumbnails(urn) {
var urnStr = urn;
if (!urnStr || (0 === urnStr.length)) {
alert("You must specify a URN!");
return;
}
var urlStr = _baseURL + '/viewingservice/v1/thumbnails/' + urnStr;
var jqxhr = $.ajax({
url: urlStr + '?width=150&height=150',
type: 'GET',
headers: {
"Authorization": "Bearer " + getAccessToken()
},
beforeSend: startSpinner("spn_viewTranslationStatus")
})
.done(function (ajax_data) {
console.log(JSON.stringify(ajax_data, null, ' '));
var download = document.createElement('a');
//download.href = 'data:image/png;'+ajax_data+'';
download.href = ajax_data + '';
var r = /\u([\d\w]{4})/gi;
var x = ajax_data.replace(r, function (match, grp) {
return String.fromCharCode(parseInt(grp, 16)); } );
x = unescape(x);
console.log(x);
download.href = 'data:image/png;'+x+'';
download.download = 'reddot.png';
download.click();
$('body').append('<img src="data:image/png;base64,' + Base64.encode(x) + '"/>'),
stopSpinner();
})
.fail(function (jqXHR, textStatus) {
//$("#txt_resViewTranslateStatus").html(ajaxErrorStr(jqXHR));
stopSpinner();
});
}
您需要将文件保存在您的服务器上并在您的 html 页面中提供。如果您从客户端 javascript 端访问气泡信息,您应该解码字符串并将其分配给如下所示的 IMG 标签。基本上,如果图像尚未编码,则将图像编码为 base64 字符串,并将该字符串设置为 IMG 元素的源:
var imgData ='data:image/png;base64,' + 'my base64 encoded string' ;
$("#myImg").src =imgData ;
(注意此格式与 CSS 格式相同)
因为你这里的图片是unicode编码的,你需要用它们的真实表示来替换\u\b字符。您可以使用 this site (2nd converter) to do it, or use the technique explained here.
实际上我从服务器接收到一个 PNG,但它没有以 javascript 符号正确显示,所以我在 PHP [=11] 中写了一个 curl =]
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "https://developer.api.autodesk.com/viewingservice/v1/thumbnails/urn");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization:Bearer x8KaVvMxZTxliTjYPiBTmpL0JaIC' ));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// grab URL and pass it to the browser
$out = curl_exec($ch);
$information = curl_getinfo($ch);
//var_dump($information );
// close cURL resource, and free up system resources
curl_close($ch);
echo $out;
$fp = fopen('myfile.png', 'w');
fwrite($fp, $out);
fclose($fp);
并且它将文件完全显示为 PNG。
长话短说,这看起来像是有人使用 readAsText() 读取图像,它将 ("interprets") 二进制文件转换为 utf8,而不是 utf16。您需要让服务器 return 理想情况下以 arraybuffer 或 blob 格式的数据,甚至是 base64,这些保留二进制文件。
带有片段的长版本。 (片段中的那些问号符号显示丢失的信息,将其与 utf16 中不是问号的二进制文件进行比较):