Can';我不知道这些C#和Java代码有什么不同

Can';我不知道这些C#和Java代码有什么不同,c#,java,apache-commons,C#,Java,Apache Commons,我有一些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()); BufferedImage img = null; img = Ima

我有一些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());
BufferedImage img = null;
img = ImageIO.read(new File(filename));
byte[] bytes = ((DataBufferByte)img.getData().getDataBuffer()).getData();
String js = Base64.encodeBase64String(bytes);
我正试图用JAVA实现它。我的java代码是:

MemoryStream ms = new MemoryStream();
Image img = Image.FromFile(filename);
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
string s = Convert.ToBase64String(ms.GetBuffer());
BufferedImage img = null;
img = ImageIO.read(new File(filename));
byte[] bytes = ((DataBufferByte)img.getData().getDataBuffer()).getData();
String js = Base64.encodeBase64String(bytes);
这两段代码应该为相同的图像文件返回相同的字符串。但它们返回的字符串不同。我不知道为什么。有人能解释一下吗

这两段代码应该为相同的图像文件返回相同的字符串

不,他们真的不应该

C#代码返回JPEG编码版本的图像数据的base64表示形式,并且可能在最后返回0,因为您使用的是
GetBuffer
而不是
ToArray
。(您希望
ToArray
在此。)

Java代码根据其
SampleModel
返回原始光栅数据的base64表示形式。我希望它比C#代码返回的字符串大得多

即使两段代码以相同的格式对图像进行编码,但这并不意味着它们会得到完全相同的数据——这取决于编码

重要的是,如果您只需要“base64中的文件内容”,那么您根本不需要通过
图像
。例如,在C#中,您可以使用:

string base64 = Convert.ToBase64String(File.ReadAllBytes(filename));

事实上,它是一个图像在这方面是无关紧要的——文件只是一个字节的集合,你可以对其进行base64编码,而不必理解这些字节的含义。

你能给我一些建议,如何改进JAVA代码,使其返回与C#one相同的字符串吗?@th1rdey3:我给出了一个更好的(IMO)假设图像文件已经是您想要的格式,那么除了您目前所拥有的任何一段代码之外,我实际上需要实现C代码。所以它不能改变。我需要更改JAVA代码,使其产生相同的结果。@th1rdey3:那么我想你就不走运了。除非图像已经是jpeg格式,并且.NET库检测到了这一点并且没有重新编码(不太可能),否则您需要找到一个与.NET库工作方式完全相同的编码器。这就像用不同的MP3编码器对一个声音文件进行两次编码,并期望得到完全相同的结果。(顺便说一句,它是Java而不是Java。)