我正在开发一个用于在 C# 上为 Windows 8 Metro 处理照片的应用程序。现在我面临一个奇怪的问题。
首先,我通过 PickSingleFileAsync 选择文件,然后尝试通过 GetThumbnailAsync 获取缩略图:
FileOpenPicker openPicker = new FileOpenPicker ();
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add (". jpg");
openPicker.FileTypeFilter.Add (". jpeg");
openPicker.FileTypeFilter.Add (". png");
StorageFile file = await openPicker.PickSingleFileAsync ();
if (file! = null)
{
BitmapImage bitmapImage = new BitmapImage ();
var thumb = await file.GetThumbnailAsync (ThumbnailMode.PicturesView, 150, ThumbnailOptions.UseCurrentScale);
if (thumb! = null) bitmapImage.SetSource (thumb);
}
此代码适用于我的 HDD 上的文件或任何 MTP 设备(经过测试的相机和 Android 平板电脑),但不适用于 iPhone。这部分
var thumb = await file.GetThumbnailAsync (ThumbnailMode.PicturesView, 150, ThumbnailOptions.UseCurrentScale);
执行大约 30 秒,并返回 null。
这段代码
BitmapImage bitmapImage = new BitmapImage ();
var stream = await file.OpenAsync (FileAccessMode.Read);
if (stream! = null) bitmapImage.SetSource (stream);
但是,这是一张完整的图片,我需要一个缩略图。我试图通过更改图像大小来获得它。
public static async Task <InMemoryRandomAccessStream> Resize (StorageFile file, uint height, uint width)
{
var fileStream = await file.OpenAsync (FileAccessMode.Read);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync (fileStream);
InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream ();
BitmapEncoder enc = await BitmapEncoder.CreateForTranscodingAsync (ras, decoder);
enc.BitmapTransform.ScaledHeight = height;
enc.BitmapTransform.ScaledWidth = width;
await enc.FlushAsync ();
ras.Seek (0);
return ras;
}
那里
BitmapDecoder decoder = await BitmapDecoder.CreateAsync (fileStream);
代码 0x88982F61 出现异常“无法解码图像”。
FileOpenPicker 也不在 iPhone 上显示缩略图。但是 Metro 的标准照片应用程序可以毫无问题地显示 iPhone 上的所有照片。
这让我想到了两个问题:
- 有没有人有任何建议来解决这个问题?
- 也许,有没有从设备中检索所有缩略图的功能?