无法确定这些 C# 和 Java 代码有何不同

3

我有一些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);

这两段代码应该对于相同的图片文件返回相同的字符串。但是它们返回的字符串不同。我无法弄清楚为什么。有人能解释一下吗?

1个回答

7
这两段代码应该返回相同的图像文件字符串,但实际上并不会。
C#代码返回的是一张JPEG编码图像数据的Base64表示,可能还包含一些0位,因为你使用了GetBuffer而不是ToArray。(这里需要用ToArray。)
Java代码返回的是原始光栅数据的Base64表示,根据其SampleModel来确定。我预计这个字符串比C#代码返回的要大得多。
即使两个代码片段都使用相同的格式对图像进行编码,也不意味着它们会生成完全相同的数据-这取决于编码方式。
重要的是,如果你只想要"Base64编码的文件内容",则根本不需要经过Image。例如,在C#中,你可以使用:
string base64 = Convert.ToBase64String(File.ReadAllBytes(filename));

事实上,它是一张图片这一点并不重要 - 文件只是由一系列字节组成的,你可以对其进行base64编码而不需要理解这些字节的含义。


你能否提供一些建议,帮助我改进JAVA代码,使其返回与C#相同的字符串? - th1rdey3
1
@th1rdey3:在我看来,假设图像文件已经是你想要的格式,我已经提供了比你现在拥有的任何一段代码更好的替代方案。 - Jon Skeet
我需要实现C#代码,所以它不能改变。我需要更改JAVA代码,使其产生相同的结果。 - th1rdey3
1
@th1rdey3:那么我猜你运气不太好。除非图像已经是jpeg格式并且.NET库检测到这一点并且重新编码(不太可能),否则您需要找到一个编码器,其工作方式与.NET库完全相同。这就像使用不同的MP3编码器对声音文件进行两次编码,并期望获得位对位相同的结果一样。(顺便说一句,它是Java而不是JAVA。) - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接