2011-09-11 130 views
11

我試圖將位圖保存爲我的隔離存儲爲png文件。我在Codeplex上找到一個名爲ImageTools的圖書館,人們一直在推薦這個圖書館,但是當我嘗試它並試圖打開文件時說它已損壞。任何知道我做錯了什麼?將位圖保存爲WP7上的PNG

private static void SaveImageToIsolatedStorageAsPng(BitmapImage bitmap, string fileName) 
{ 
    //convert to memory stream 
    MemoryStream memoryStream = new MemoryStream(); 
    WriteableBitmap writableBitmap = new WriteableBitmap(bitmap); 
    writableBitmap.SaveJpeg(memoryStream, bitmap.PixelWidth, bitmap.PixelHeight, 0, 100); 

    //encode memory stream as PNG 
    ExtendedImage image = new ExtendedImage(); 
    image.SetSource(memoryStream); 

    PngEncoder encoder = new PngEncoder(); 

    //Save to IsolatedStorage 
    using (var store = IsolatedStorageFile.GetUserStoreForApplication()) 
    using (var writeStream = new IsolatedStorageFileStream(fileName, FileMode.Create, store)) 
    { 
     encoder.Encode(image, writeStream); 
    } 
} 
+0

爲什麼你想先轉換成較慢的格式呢?如果圖像是JPEG格式,則不會通過將其轉換爲PNG獲得任何收益。觀看PNG比JPEG更慢。 –

+2

格式我需要在PNG –

+0

也許他需要透明度或無損壓縮? –

回答

17

您正試圖將JPEG存儲器流轉換爲PNG格式。這會使其損壞 - 您應該將位圖直接保存到PNG。

我沒有嘗試過與imagetools library這個特殊的任務,但如果你see John Papa's blog,它看起來像你需要調用ToImage擴展方法您WriteableBitmap其作爲ImageTools的一部分提供。然後,您可以使用編碼器拍攝該圖像並寫入您的開放式流。

var img = bitmap.ToImage(); 
var encoder = new PngEncoder(); 
using (var stream = new IsolatedStorageFileStream(fileName, FileMode.Create, store)) 
{ 
    encoder.Encode(img, stream); 
    stream.Close(); 
} 
+2

我明白了,我不知道如何以任何其他方式將位圖轉換爲流。你可以將ExtendedImage的源設置爲IsolatedFileStream嗎? –

+0

啊 - 做一個快速搜索,似乎沒有很好的記錄 - 我已經更新了答案。 –

+0

@PaulAnnetts我怎麼讀回來?我使用WP8。 – alfah