2017-08-14 109 views
-1

我有一個base64圖像,我必須將其轉換成圖像。我這樣做使用此代碼:C#圖像base64

public static Image ConvertBase64StringToImage(string imageBase64String) 
{ 
    var imageBytes = Convert.FromBase64String(imageBase64String); 
    var imageStream = new MemoryStream(imageBytes, 0, imageBytes.Length); 
    imageStream.Write(imageBytes, 0, imageBytes.Length); 
    var image = Image.FromStream(imageStream, true); 
    return image; 
} 

然後我必須將此圖像轉換爲base64再次。使用im此代碼:

public static string ConvertImageToBase64String(Image image) 
    { 
     var imageStream = new MemoryStream(); 
     image.Save(imageStream, ImageFormat.Png); 
     imageStream.Position = 0; 
     var imageBytes = imageStream.ToArray(); 
     return Convert.ToBase64String(imageBytes); 
    } 

原始base64Image轉換成圖像,並再次爲base64後,它失去quality.The原始的base64圖像的長度爲1676和轉換後它的長度具有1660。

轉換後我需要相同的圖像,因爲我必須對它進行比較。任何想法如何做到不失質量?

+1

這16個字節丟失可能只是原始文件中的填充。圖像看起來是否一樣?嘗試使用不同的圖像,所有圖像上的文件大小是否更改,或者只有那一個。 – Neil

+0

圖像看起來相同,但由於這16個字節,我無法比較這些圖像。這個問題發生在我測試的每個圖像上。 – lukhol

+0

這16個字節是如此少的數據,似乎不太可能的圖像失去了實際的質量(也取決於所使用的編碼/壓縮技術) –

回答

0

根據this page雖然PNG文件是無損的,但您可以指定在存儲時要使用多少文件壓縮。國際海事組織,只要Image出來相同(你可以使用某種類型的MD5工具比較它們),保存它時文件的大小是不同的,因爲實際的圖像仍然是相同的作爲原件。

+0

我必須檢查這個圖像使用base64字符串,所以我需要有相同大小的圖像。 – lukhol

+0

檢查整個文件的base64以確認圖像是否相同與僅比較圖像不同。設想一下,PNG文件在文件中的某些元數據中創建了它的創建日期。每次保存文件時,它都略有不同,但圖像是相同的。 – Neil

+0

.Net的png處理非常沒有優化,並且如果該文件是使用其他應用程序創建的,則幾乎總是會導致比加載的文件更大的圖像。此外,雖然技術上可以在.Net框架中指定具有壓縮級別屬性的保存設置(就像它爲jpeg所做的那樣),但實際上該值完全沒有使用。雖然使用'RawFormat'的 – Nyerguds

0

這是如何轉換和比較您的圖片,如果CompareImages的結果爲零,則表示它們相等或非常相似。

static void Main(string[] args) 
    { 
     Image img = new Bitmap("Koala.jpg"); 
     string img64Bit = ConvertImageToBase64String(img); 
     Image newImg = ConvertBase64StringToImage(img64Bit); 
     newImg.Save("KoalaCopy.jpg"); 
     Console.WriteLine(CompareImages(img, newImg)); 
     Console.ReadLine(); 
    } 

    public static string ConvertImageToBase64String(Image image) 
    { 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      image.Save(ms, image.RawFormat); 
      return Convert.ToBase64String(ms.ToArray()); 
     } 
    } 

    public static Image ConvertBase64StringToImage(string image64Bit) 
    { 
     byte[] imageBytes = Convert.FromBase64String(image64Bit);    
     return new Bitmap(new MemoryStream(imageBytes)); 
    } 

    public static int CompareImages(Image i1, Image i2) 
    { 
     string img1 = ConvertImageToBase64String(i1); 
     string img2 = ConvertImageToBase64String(i2); 
     return String.Compare(img1, img2); 
    } 
+0

將使得生成的文本比它大得多。你可以使用它進行比較,但是比較字節和'SequenceEquals(...)'的效率更高。 – Nyerguds