[英]Resizing images on Windows Phone 7 on thread pool thread?
我正在编写一个处理大量图像的Windows Phone 7应用程序 - 这些图像的范围可以从几百像素到1080P(未来可能更高)。
图像是非常耗费资源的,所以我在显示它们之前走了缓存+调整手机图像大小的路径。
这意味着在用户输入图像存储的IP地址后第一次设置时,我可以要求他们等待几分钟,同时检索/调整大小/缓存。 从那时起,他们可以拥有漂亮而快速的表现。
目前,我的缓存管理器通过Uri和文件位置的字典跟踪图像。 我有一个队列,一次最多可处理5个图像(异步Web请求,调整大小是在线程池线程上完成的)。
我遇到的问题是Silverlight中的WritableBitmap类是一个UI元素,这意味着我必须通过Dispatcher转换到UI线程来进行实际的大小调整,这是一个愚蠢的事情并减慢整个事情 - 这也意味着我的缓存管理器是有效的单线程。
所以它进入缓存管理器(线程池) - >异步Web请求(线程池) - >回调(线程池) - >调整大小(UI线程) - >将缓存作业标记为完成(线程池)。
我一直在寻找第三方库,它将A)编译并在Windows Phone 7和B上运行。能够通过操纵流或字节数组来调整各种格式的图像,而不依赖于UI线程。
有没有人有这方面的经验?
干杯,
泰勒
为了减少下载大小并为了消除手机CPU的处理负担,我将这项工作推广到Web服务。
例如,您可以在某个位置在线http://webimageresizer.codeplex.com/上托管开源WebImageResizer代码等服务,例如在免费的AppHarbor服务器上。
或者你可以使用商业(免费增值)服务,如:
这些中的任何一个都可以使您在具有超高速连接的服务器上快速处理图像,并通过其有限的数据连接将较小的图像传送到手机。
ImageTools库都支持WP7并支持图像大小调整,因此使用它可能会更成功。
试试RéneSchulte创建的http://writeablebitmapex.codeplex.com/ 。 它具有与SDK一起提供的WriteableBitmap更好的性能。
您要在服务器上显示文件吗?
如果是,在我看来,你选择了错误的方法解决这个问题。 传输沉重的图像,然后调整它们的大小是没有意义的。 我建议在服务器上保持低分辨率和高分辨率。
如果没有,我帮不了你。 我找到了这篇文章,但我想你已经看过了。
Tyler - 您提到在首次启动时,应用程序确实从IP地址(我假设在互联网上)检索图像?
这意味着在用户输入图像存储的IP地址后第一次设置时,我可以要求他们等待几分钟,同时检索/调整大小/缓存。 从那时起,他们可以拥有漂亮而快速的表现。
如果这是正确的,我认为在创建代理时建议的一些答案实际上是一个可行的解决方案。 我会像这样构造它:
您的应用程序 - > Web请求代理处理程序
string imageUrl = HttpUtility.UrlEncode("http://[user's_ip]/path_to_image.png");
http://domain.com/your_proxy.ashx?users_image_url=imageUrl
后端的代理处理程序应该请求映像,调整其大小,并将调整后的映像返回给您的应用程序。
您的应用程序 - >缓存返回的已调整大小的图像
根据需要循环......
更新:
事实证明,有一种方法可以使用本机WriteableBitmap类在UI线程外部的WP7上调整图像大小。 有一个名为.SaveJpeg()的方法允许这个,我们目前在我们的WP7应用程序CitySourced中使用它。 您的代码应如下所示:
wb.SaveJpeg(stream, width, height, orientation, quality);
唯一令人沮丧的是它只能通过编写.JPG文件来工作,并且没有.PNG支持。 如果这适用于您的用例,请告诉我。
我不认为你的问题是如此多的表现,而是你如何展示图像。 我认为最好始终显示默认缩略图,然后在后台作业调整缩略图后更新缩略图。 该应用程序应该可以更快地使用。
http://www.dtksoft.com/dtkimage.php这适用于所有文件格式,并与Windows Mobile兼容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.