在浏览器中显示 .raw 文件图像
display .raw file image in browser
我有一个 .raw 格式的图像文件,它是直接从指纹扫描仪设备读取的。我们必须使用 html 和 javascript 在浏览器中显示它。我们如何转换.raw图像并在浏览器中显示?
以下是我使用在线工具转换的手动步骤
我可以使用在线转换器将十六进制内容转换为 .raw 文件 http://tomeko.net/online_tools/hex_to_file.php?lang=en
并且转换后的原始文件可以通过https://www.iloveimg.com/convert-to-jpg/raw-to-jpgurl
再次转换为jpeg文件
示例文件如下所示https://imgur.com/a/4snUAFL
我尝试了以下代码在浏览器中显示十六进制内容,但没有成功。
function hexToBase64(str) {
return btoa(String.fromCharCode.apply(null, str.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x ").replace(/ +$/, "").split(" ")));
}
var img = new Image();
img.src = "data:image/jpeg;base64,"+hexToBase64(getBinary());
document.body.appendChild(img);
完整的 jsfiddle 是 http://jsfiddle.net/varghees/79NnG/1334/
首先,您在 fiddle 中提供的可能不是 .raw 文件。
虽然有大量不同的文件格式使用此扩展名,但我不太接受根本没有元数据的事实,因为至少需要知道图像的大小。
所以我很抱歉未来的读者,但这个答案只展示了如何将原始 8 位值转换为实际图像...
所以现在,没有图像大小,但是如果图像是平方的,我们实际上可以只从 byteLength 来计算,(宽度和高度都是 byteLength 的平方根)。
一般步骤是
- (将您的十六进制字符串转换为实际的 Uint8Array)
- 将 Uint8ClampedArray 的所有第 4 个值设置为第一个 Uint8Array 的 4 倍(这将设置我们即将成为 RGBA 图像的 Alpha 通道)
- 在 ImageData() 构造函数中传递此 Uint8ClampedArray。
- 将此 ImageData 放在 canvas
- 太棒了!
所以使用一个充满随机值的正方形(从而避免十六进制到缓冲区的转换):
const fake = new Uint8Array( 256*256 );
crypto.getRandomValues(fake); // get random values
processSquareBitmap(fake.buffer);
function processSquareBitmap(buffer) {
const view = new Uint8Array(buffer);
const out = new Uint8ClampedArray(buffer.byteLength * 4);
const size = Math.sqrt(view.length);
if(size % 1) {
console.error('not a square');
return;
}
// set alpha channel
view.forEach((a,i)=>out[(i*4)+3] = a);
const image = new ImageData(out, size, size)
const canvas = document.createElement('canvas');
canvas.width = canvas.height = size;
canvas.getContext('2d').putImageData(image, 0,0);
// if you want to save a png version
// canvas.toBlob(b=> saveAs(b, 'bitmap.png'));
document.body.appendChild(canvas);
}
但对于非方形图像,您必须具有实际宽度和高度。
我能够推断出 OP 的十六进制数据,因此可以制作 this fiddle 来显示它们的图像。
我有一个 .raw 格式的图像文件,它是直接从指纹扫描仪设备读取的。我们必须使用 html 和 javascript 在浏览器中显示它。我们如何转换.raw图像并在浏览器中显示?
以下是我使用在线工具转换的手动步骤
我可以使用在线转换器将十六进制内容转换为 .raw 文件 http://tomeko.net/online_tools/hex_to_file.php?lang=en
并且转换后的原始文件可以通过https://www.iloveimg.com/convert-to-jpg/raw-to-jpgurl
再次转换为jpeg文件示例文件如下所示https://imgur.com/a/4snUAFL
我尝试了以下代码在浏览器中显示十六进制内容,但没有成功。
function hexToBase64(str) {
return btoa(String.fromCharCode.apply(null, str.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x ").replace(/ +$/, "").split(" ")));
}
var img = new Image();
img.src = "data:image/jpeg;base64,"+hexToBase64(getBinary());
document.body.appendChild(img);
完整的 jsfiddle 是 http://jsfiddle.net/varghees/79NnG/1334/
首先,您在 fiddle 中提供的可能不是 .raw 文件。
虽然有大量不同的文件格式使用此扩展名,但我不太接受根本没有元数据的事实,因为至少需要知道图像的大小。
所以我很抱歉未来的读者,但这个答案只展示了如何将原始 8 位值转换为实际图像...
所以现在,没有图像大小,但是如果图像是平方的,我们实际上可以只从 byteLength 来计算,(宽度和高度都是 byteLength 的平方根)。
一般步骤是
- (将您的十六进制字符串转换为实际的 Uint8Array)
- 将 Uint8ClampedArray 的所有第 4 个值设置为第一个 Uint8Array 的 4 倍(这将设置我们即将成为 RGBA 图像的 Alpha 通道)
- 在 ImageData() 构造函数中传递此 Uint8ClampedArray。
- 将此 ImageData 放在 canvas
- 太棒了!
所以使用一个充满随机值的正方形(从而避免十六进制到缓冲区的转换):
const fake = new Uint8Array( 256*256 );
crypto.getRandomValues(fake); // get random values
processSquareBitmap(fake.buffer);
function processSquareBitmap(buffer) {
const view = new Uint8Array(buffer);
const out = new Uint8ClampedArray(buffer.byteLength * 4);
const size = Math.sqrt(view.length);
if(size % 1) {
console.error('not a square');
return;
}
// set alpha channel
view.forEach((a,i)=>out[(i*4)+3] = a);
const image = new ImageData(out, size, size)
const canvas = document.createElement('canvas');
canvas.width = canvas.height = size;
canvas.getContext('2d').putImageData(image, 0,0);
// if you want to save a png version
// canvas.toBlob(b=> saveAs(b, 'bitmap.png'));
document.body.appendChild(canvas);
}
但对于非方形图像,您必须具有实际宽度和高度。
我能够推断出 OP 的十六进制数据,因此可以制作 this fiddle 来显示它们的图像。