2016-08-18 73 views
-1

我想寫一個方法,以base64字符串中的圖像數據,並將其保存到二進制文件,同時保留透明度(例如在PNG的情況下)C# - 保存base64字符串圖像文件,而不會失去透明度

我的其他要求是,這需要在PCL(可移植類庫)的C#中完成。

我知道您可以使用Image或WriteableBitmap來解決此問題,但這些類在PCL中不可用。

我有一個不服用的base64數據,並將其保存到文件的作業以下方法:

public static async Task Base64ToBinaryImageFile(IFile file, string base64Content) 
{ 
    var bytes = Convert.FromBase64String(base64Content); 
    using (var stream = await file.OpenAsync(FileAccess.ReadAndWrite)) 
    { 
     stream.Seek(0, SeekOrigin.Begin); 
     using (var writer = new BinaryWriter(stream)) 
     { 
      writer.Write(content); 
      writer.Flush(); 
     } 
    } 
} 

它正常工作,不同之處在於:

  1. 我失去了透明度數據(所以透明像素顯示爲黑色)。

  2. 使用此方法創建的文件比原始文件具有更大的大小(以字節爲單位)。

有什麼想法是什麼原因以及如何解決這些問題?


更新:這裏是一個以base64數據發送到C#的JavaScript代碼:

function onPaste(event) { 
    var $event = event.data.$; 
    var clipboardData = $event.clipboardData; 
    var found = false; 
    var imageType = /^image/; 
    if (!clipboardData) { 
     return false; 
    } 

    return Array.prototype.forEach.call(clipboardData.types, function (type, i) { 
     if (found) { 
      return false; 
     } 

     if (type.match(imageType) || clipboardData.items[i].type.match(imageType)) { 
      readImageAsBase64(clipboardData.items[i]); 
      return found = true; 
     } 

     return false; 
    }); 
} 

function readImageAsBase64(item) { 
    if (!item || typeof item.getAsFile !== "function") { 
     return; 
    } 

    var file = item.getAsFile(); 
    var reader = new FileReader(); 

    reader.onload = function (evt) { 
     window.external.notify("pasteImageBase64/" + evt.target.result); 
    }; 

    reader.readAsDataURL(file); 
} 
+4

此代碼無關的圖像數據被打開的PNG圖片除非將其保存到文件中。如果圖像數據不是你想要的,'base64Content'中的東西已經是錯誤的了。 base64編碼數據來自哪裏?也許是從瀏覽器複製粘貼的圖像..? –

+1

你可以發佈使base64字符串的代碼? –

+1

我懷疑當創建base64Content字符串時發生的損失 –

回答

0

我可以預見到一些可能出現的問題:

  1. 您的問題可能存在於base64Content由主叫方提供。將提供給您的方法的輸入轉換爲base64Content可能會以不正確的文件格式讀取PNG圖像。

  2. 與#1有關,可能有人調用該方法帶了一個.JPG或.BMP圖像文件,天真地將其重命名爲.PNG擴展名,並假設他們發送PNG圖像時調用方法,事實上他們不是。

  3. 您可以在測試中與圖像瀏覽/編輯器,不支持透明度或應付自如(IE mspaint.exe)

+0

請參閱上面的註釋,瞭解如何設置base64Content。至於#2和#3以上,原始圖像是一個有效的PNG圖像,具有一些透明像素(使用Paint.Net和Photoshop進行驗證)。使用我的方法保存圖像後,透明像素會丟失(再次使用Paint.Net和Photoshop進行驗證) –

相關問題