如何在Windows Phone上压缩图像

Cra*_*rge 5 c# silverlight image-processing windows-phone-7

我的应用程序使用相机拍摄图像并将其上传到flickr.我想压缩图像,以便上传时间不会像目前那样长.我尝试了BitmapSource和WriteableBitmap的'SaveJpeg'方法来完成此任务但失败了.位图源在Silverlight/WP中没有与完整.NET框架版本中相同的成员,而WriteableBitmap一直在向我提供"此流不支持写入它"错误的SaveJpeg方法.

这是我目前在我的CameraCaptureTask完成的事件处理程序中所做的事情:

private void CameraCaptureCompleted(object sender, PhotoResult e)
    {
        if (e == null || e.TaskResult != TaskResult.OK)
        {
            return;
        }                                                             
        BitmapImage bitmap = new BitmapImage {CreateOptions = BitmapCreateOptions.None};                        
        bitmap.SetSource(AppHelper.LoadImage(e.ChosenPhoto));
        WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap);

        // Encode the WriteableBitmap object to a JPEG stream.
        writeableBitmap.SaveJpeg(e.ChosenPhoto, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 85);
    }
Run Code Online (Sandbox Code Playgroud)

这段代码给了我一个:"Stream不支持写入"错误.

有没有其他方法可以压缩图像或我是否必须编写压缩算法?

更新固定!!

private void CameraCaptureCompleted(object sender, PhotoResult e)
    {
        if (e == null || e.TaskResult != TaskResult.OK)
        {
            return;
        }                                                             
        BitmapImage bitmap = new BitmapImage {CreateOptions = BitmapCreateOptions.None};                        
        bitmap.SetSource(AppHelper.LoadImage(e.ChosenPhoto));
        WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap);

        // Encode the WriteableBitmap object to a JPEG stream.
        writeableBitmap.SaveJpeg(new MemoryStream(), writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 85);
    }
Run Code Online (Sandbox Code Playgroud)

我试图写入源流.卫生署!

谢谢.

ame*_*eer 3

我认为 SaveJpeg 是我这样做的方式。你可能可以用其他方法来做,但我认为这是最简单、最自然的。错误“此流不支持写入”可能是因为无论您传递给 SaveJpeg 的流是什么,它都是不可写的。我不太确定您要写入的内容,请尝试仅使用普通的旧内存流,看看是否可以这样工作

using System.IO;

// ...

MemoryStream ms = new MemoryStream();
pic.SaveJpeg(ms, pic.PixelWidth, pic.PixelHeight, 0, 0, 50);
Run Code Online (Sandbox Code Playgroud)

您可以在最终参数中调整质量。PixelWidth/Height 来自WriteableBitmap,因此如果您有其他来源,您可能必须使用其他方法/属性来获取宽度/高度。您可能需要缩放它们,因为相机拍摄的图片可能非常大。这取决于您上传这些图片的目的,但缩放它们也可以使文件大小更小。