2011-09-11 16 views
11

Sto tentando di salvare una bitmap nella memoria isolata come file png. Ho trovato una libreria su Codeplex chiamata ImageTools che le persone raccomandavano, ma quando la provo e cerco di aprire il file dice che è corrotta. Qualcuno sa cosa sto sbagliando?Salvataggio di bitmap come PNG su WP7

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

Perché si desidera convertire in un formato più lento in primo luogo? se l'immagine è JPEG, non ottieni nulla convertendola in PNG. E la visualizzazione di PNG è più lenta di JPEG. –

+2

Il formato che ho bisogno di essere in PNG –

+0

forse ha bisogno di trasparenza o compressione senza perdita di dati? –

risposta

17

Si sta tentando di convertire il flusso di memoria JPEG in PNG. Ciò lo renderà corrotto: dovresti salvare la Bitmap direttamente in PNG.

Non ho provato questo compito particolare con il imagetools library, ma se si see John Papa's blog, sembra che è necessario chiamare il metodo ToImage estensione sul tuo WriteableBitmap che è fornito come parte di ImageTools. Quindi puoi utilizzare l'encoder per acquisire questa immagine e scrivere nel tuo stream aperto.

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

Vedo, non sono sicuro di come ottenere bitmap su un flusso in un altro modo. potresti impostare la sorgente di ExtendedImage su IsolatedFileStream? –

+0

Ah - facendo una ricerca veloce, sembra che non sia molto ben documentato - Ho aggiornato la risposta. –

+0

@PaulAnnetts Come posso leggere questo? Sto usando WP8. – alfah

Problemi correlati