如何在JAVA中将PNG二进制数据写入PNG文件

时间:2014-10-27 22:54:52

标签: java file-io javax.imageio html2canvas

我正在尝试使用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”,然后保存文件。显然它不起作用。也许我错过了什么。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这一行:

screenshot = new Base64Security().decodeBase64(screenshot);

...不起作用,因为您正在将base64编码的二进制数据解码为StringscreenshotString)。这将破坏数据,就像使用FTP ascii模式二进制数据一样。

我不熟悉您正在使用的base64库,但是如果您可以将base64编码的数据解码为byte[]ByteBufferInputStream,那么您应该是精细。如果没有,切换到另一个base64解码库。

此外,您不能使用Writer来编写二进制数据,因为它是为处理字符数据而设置的。而是直接使用OutputStream

类似的东西:

byte[] decoded = new Base64Security().decodeBase64ToBytes(screenshot);

OutputStream output = new FileOutputStream(file1);
try {
    output.write(decoded);
}
finally {
    output.close();
}