我有一些C#代码将图像转换为base64字符串。代码是:
MemoryStream ms = new MemoryStream();
Image img = Image.FromFile(filename);
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
string s = Convert.ToBase64String(ms.GetBuffer());
我正在尝试用JAVA实现它。我的java代码是:
BufferedImage img = null;
img = ImageIO.read(new File(filename));
byte[] bytes = ((DataBufferByte)img.getData().getDataBuffer()).getData();
String js = Base64.encodeBase64String(bytes);
这两段代码应为同一图像文件返回相同的字符串。但他们正在返回不同的字符串。我无法弄清楚原因。任何人都可以对此有所了解吗?
答案 0 :(得分:7)
这两段代码应为同一图像文件返回相同的字符串
不,他们真的不应该。
C#代码返回图像数据的JPEG编码版本的base64表示 - 最后可能会返回0,因为您使用的是GetBuffer
而不是ToArray
。 (你想在这里ToArray
。)
Java代码根据其SampleModel
返回原始栅格数据的base64表示。我希望它比C#代码返回的字符串大得多。
即使两段代码都使用相同的格式对图像进行编码,但这并不意味着它们会提供完全相同的数据 - 这取决于编码。
重要的是,如果您只想要“base64中文件的内容”,那么您根本不需要通过Image
。例如,在C#中你可以使用:
string base64 = Convert.ToBase64String(File.ReadAllBytes(filename));
这是一个图像在这方面无关紧要的事实 - 文件只是一个字节集合,你可以在不理解这些字节含义的情况下对其进行base64编码。