2012-02-16 71 views
5

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

这是我目前在做我的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); 
    } 

此代码给我:“流不支持写入”错误。

有没有其他一些方法可以压缩图像,还是必须编写压缩算法?

UPDATE FIXED !!

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

我正试图写入源码流。卫生署!

谢谢。

+0

PhotoResult e不是一个流,因此SaveJpeg无法正常工作,您想在哪里保存图片? IsolatedStorage或临时流或其他地方... – ameer 2012-02-16 22:19:43

+1

只要你知道,当你将它保存到新的MemoryStream()时,你现在没有参考你现在保存的位置,最好先创建内存流,然后将它传递给内存流那么一旦你获得了压缩文件,可以直接从存储器流中上传它,或者将其保存到独立的存储器中,然后再上传。 – ameer 2012-02-16 22:45:20

回答

3

SaveJpeg是我想这样做的方式。你也许可以用其他方式做,但我认为这将是最简单和最自然的。错误“此流不支持写入”很可能是因为您传递给SaveJpeg的任何流都不可写。我不完全相信你正在尝试写,尝试使用只是一个普通的老内存流,看看是否可行喜欢这样

using System.IO; 

// ... 

MemoryStream ms = new MemoryStream(); 
pic.SaveJpeg(ms, pic.PixelWidth, pic.PixelHeight, 0, 0, 50); 

您可以调整在最后一个参数的质量。像素宽度/高度是从WriteableBitmap,所以如果你有其他的来源,你可能需要使用另一种方法/属性来获得宽度/高度。您可能想要缩放这些,因为来自相机的图片可能非常大。这取决于你上传这些照片的内容,但是缩放它们还可以缩小文件的大小。

+0

谢谢你的回复。我已经使用上面的代码片段更新了我的帖子。这正是我目前所面临的。 – Cranialsurge 2012-02-16 22:17:03