2014-02-26 136 views
3

我有一些C#代碼可以將圖像轉換爲base64字符串。代碼是:不知道這些C#和Java代碼的區別在哪裏

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); 

這兩段代碼應該爲相同的圖像文件返回相同的字符串。但他們正在返回不同的字符串。我無法弄清楚爲什麼。任何人都可以點亮它嗎?

回答

7

這種兩片的代碼應返回相同的字符串相同的圖像文件

沒有,他們實在不應該。

C#代碼返回圖像數據的JPEG編碼版本的base64表示,並且可能會在最後顯示0,因爲您使用的是GetBuffer而不是ToArray。 (您在此處需要ToArray。)

根據其代碼SampleModel,Java代碼返回原始柵格數據的base64表示形式。我預計這會比C#代碼返回的字符串大得多。

即使這兩段代碼都使用相同的格式對圖像進行編碼,但這並不意味着它們會提供完全相同的數據 - 這取決於編碼。

重要的是,如果你只是想「在base64文件的內容」,那麼你根本不需要通過Image。例如,在C#中,你可以使用:

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

,它的圖像在這方面是不相關的事實 - 該文件僅僅是一個字節的集合,並且可以基於64位編碼,如果不理解這些的意思字節。

+0

你能給我一些關於如何改進JAVA代碼的建議,以便它返回與C#相同的字符串嗎? – th1rdey3

+1

@ th1rdey3:假設圖像文件已經處於您想要的格式,我已經給出了一個更好的(IMO)替代方法* * *。 –

+0

我實際上需要實現C#代碼。所以它不能改變。我需要更改JAVA代碼,以便它產生相同的結果。 – th1rdey3