问题 在WP7上将位图保存为PNG


我正在尝试将位图保存为我的隔离存储作为png文件。我在Codeplex上找到了一个名为ImageTools的库,人们一直在推荐它,但是当我尝试打开文件时它会说它已经腐败了。谁知道我做错了什么?

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

8774
2017-09-11 14:42


起源

为什么要首先转换为较慢的格式?如果图像是JPEG,则通过将其转换为PNG无法获得任何效果。并且查看PNG比JPEG慢。 - Claus Jørgensen
格式我需要在PNG中 - Ryan Burnham
也许他需要透明度或无损压缩? - Andrei Rînea


答案:


您正在尝试将JPEG内存流转换为PNG。这会使它损坏 - 你应该将Bitmap直接保存到PNG。

我还没有尝试过这个特殊的任务 图像工具库,但如果你 请参阅John Papa的博客,看起来你需要打电话给 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();
}

16
2017-09-11 15:37



我明白了,我不知道如何以任何其他方式将位图转换为流。你可以将ExtendedImage的源设置为IsolatedFileStream吗? - Ryan Burnham
啊 - 快速搜索,似乎没有很好的记录 - 我已经更新了答案。 - Paul Annetts
@PaulAnnetts我怎么读这个?我正在使用WP8。 - alfah
如果使用指令“using”,则不必使用“stream.close()”关闭流明确性,因为自己的指令会关闭并处理它。 - Cabuxa.Mapache