我正在尝试使用HTML2Canvas截取页面。
我使用canvas.toDataURL()
在base64中获取二进制文件,然后将其发送回Java。
我使用以下JavaScript代码,单击按钮时执行:
$("#take_screenshot_button").bind("click", function(){$("#container").html2canvas(
{
allowTaint: true,
letterRendering: true,
onrendered: function(canvas)
{
$("#screenshot").val(canvas.toDataURL());
setTimeout(function(){$("#take_screenshot_form").submit();}, 2000);
}
});});
我在JAVA端获取“toDataURL()”的内容,然后从base64解码,然后使用以下命令将其保存到“C:\ image.png”:
String screenshot = request.getParameterMap().get("screenshot")[0];
screenshot = screenshot.replaceAll("data:image/png;base64,", "");
screenshot = new Base64Security().decodeBase64(screenshot);
File file1 = new File("C:\\image.png");
file1.createNewFile();
FileWriter fw = new FileWriter(file1.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(screenshot);
bw.close();
但是,当我使用Windows图像查看器打开图像时,图像为空白。它没有说“文件已损坏”,我可以在图像属性中显示图像的尺寸,但图像在图像查看器中是空白的。当我使用“ImageIO.write()”再次写入文件时(以防万一),ImageIO读取“C:\ image.png”,它说
“读取PNG图像数据时出错”由“java.util.zip.ZipException:无效位长重复”引发。
我读过的所有文章和博客都说,使用“HTML2Canvas”,使用toDataURL()获取屏幕截图,删除“data:image / png; base64”,然后保存文件。显然它不起作用。也许我错过了什么。
有人可以帮忙吗?
答案 0 :(得分:0)
这一行:
screenshot = new Base64Security().decodeBase64(screenshot);
...不起作用,因为您正在将base64编码的二进制数据解码为String
(screenshot
是String
)。这将破坏数据,就像使用FTP ascii模式二进制数据一样。
我不熟悉您正在使用的base64库,但是如果您可以将base64编码的数据解码为byte[]
,ByteBuffer
或InputStream
,那么您应该是精细。如果没有,切换到另一个base64解码库。
此外,您不能使用Writer
来编写二进制数据,因为它是为处理字符数据而设置的。而是直接使用OutputStream
。
类似的东西:
byte[] decoded = new Base64Security().decodeBase64ToBytes(screenshot);
OutputStream output = new FileOutputStream(file1);
try {
output.write(decoded);
}
finally {
output.close();
}