【发布时间】:2016-04-30 01:43:39
【问题描述】:
简介:
我正在从智能卡读取指纹图像数据,如您所知,此数据保存为智能卡中的原始图像。 我正在开发一个客户端程序,它只使用 java 脚本从读卡器的扫描仪中读取图像并在客户端页面中显示。
现在我的问题是:
如何将原始数据的十六进制字符串转换为使用适当的位图图像标题完成的十六进制字符串?请注意,我的图像有width 和height。
尝试过的方法:
我已经由get buffered image from raw data 用java 开发了这个程序。另外,我可以通过Hex2Base64 将位图图像的十六进制字符串转换为base64,然后我可以通过base64AsImage 在图像标签中显示base64 字符串。然而,当且仅当十六进制包含标头,而我们的数据是原始数据时,这些函数才能正常工作。
我的代码(仅适用于包含标题的十六进制字符串):
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script>
if (!window.atob) {
var tableStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var table = tableStr.split("");
window.atob = function (base64) {
if (/(=[^=]+|={3,})$/.test(base64)) throw new Error("String contains an invalid character");
base64 = base64.replace(/=/g, "");
var n = base64.length & 3;
if (n === 1) throw new Error("String contains an invalid character");
for (var i = 0, j = 0, len = base64.length / 4, bin = []; i < len; ++i) {
var a = tableStr.indexOf(base64[j++] || "A"), b = tableStr.indexOf(base64[j++] || "A");
var c = tableStr.indexOf(base64[j++] || "A"), d = tableStr.indexOf(base64[j++] || "A");
if ((a | b | c | d) < 0) throw new Error("String contains an invalid character");
bin[bin.length] = ((a << 2) | (b >> 4)) & 255;
bin[bin.length] = ((b << 4) | (c >> 2)) & 255;
bin[bin.length] = ((c << 6) | d) & 255;
};
return String.fromCharCode.apply(null, bin).substr(0, bin.length + n - 4);
};
window.btoa = function (bin) {
for (var i = 0, j = 0, len = bin.length / 3, base64 = []; i < len; ++i) {
var a = bin.charCodeAt(j++), b = bin.charCodeAt(j++), c = bin.charCodeAt(j++);
if ((a | b | c) > 255) throw new Error("String contains an invalid character");
base64[base64.length] = table[a >> 2] + table[((a << 4) & 63) | (b >> 4)] +
(isNaN(b) ? "=" : table[((b << 2) & 63) | (c >> 6)]) +
(isNaN(b + c) ? "=" : table[c & 63]);
}
return base64.join("");
};
}
function hexToBase64(str) {
return btoa(String.fromCharCode.apply(null,
str.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x$1 ").replace(/ +$/, "").split(" "))
);
}
function base64ToHex(str) {
for (var i = 0, bin = atob(str.replace(/[ \r\n]+$/, "")), hex = []; i < bin.length; ++i) {
var tmp = bin.charCodeAt(i).toString(16);
if (tmp.length === 1) tmp = "0" + tmp;
hex[hex.length] = tmp;
}
return hex.join(" ");
}
function doConvert() {
var myHex = document.getElementById('myText').value;
var myBase64 = hexToBase64(myHex);
document.getElementById('myImage').src = "data:image/bmp;base64," + myBase64;
}
</script>
</head>
<body>
<div>
<p>
Enter Raw Hex:
<br>
<textarea rows="4" cols="50" id="myText">Enter Raw Hex String here ...</textarea>
<br>
<button id="myButton" onclick="doConvert()"> Click me </button>
<br>
<img id="myImage" alt="img1"/>
</p>
</div>
</body>
</html>
一个part of code解决java中的问题:
private static BufferedImage byte2Buffered(byte[] rawData, int width, int height){
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
byte[] array = ((DataBufferByte)image.getRaster().getDataBuffer()).getData();
System.arraycopy(rawData, 0, array, 0, rawData.length);
return image;
}
请注意,由于 JavaScript 中没有 BufferedImage 类型,我们无法在 JavaScript 中等效此方法。
【问题讨论】:
-
你知道颜色编码吗?即灰度或颜色?
-
还要记住,java 和 javascript 是完全不同的语言。
-
亲爱的@Matthieu 我的图像是灰度的,当然,java 与 javascript 不同。我绝对知道这个事实 :) 我告诉我我已经在 java 中完成了这个问题,我想在 javascript 中做到这一点
-
大概,(因为你说你以前在java中做过)你知道文件的确切格式。鉴于此,您可以解码/解释文件头,并且您知道每个像素在输入格式中的表示方式。如果您已经知道这一点,您应该能够将输入读取到缓冲区数组中,然后读取为 xIntTypedArrayBuffer。然后读取每个位并将其渲染到画布(或您正在编码为另一种格式的其他缓冲数组)。
标签: javascript string bitmap hex smartcard