- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用缓存机制,将图像保存到独立存储并在下次加载它,尤其是在没有互联网连接的情况下。但是,它适用于小图像,但不适用于大约 200kb 的“大”图像。
这是我的代码:
public static object ExtractFromLocalStorage(Uri imageFileUri, string imageStorageFolder)
{
var isolatedStoragePath = GetFileNameInIsolatedStorage(imageFileUri, imageStorageFolder);
MemoryStream dataStream;
using (var fileStream = Storage.OpenFile(isolatedStoragePath, FileMode.Open, FileAccess.Read))
{
if (fileStream.Length > int.MaxValue)
return null;
dataStream = new MemoryStream((int)fileStream.Length);
var buffer = new byte[4096];
while (dataStream.Length < fileStream.Length)
{
var readCount = fileStream.Read(buffer, 0, Math.Min(buffer.Length, (int)(fileStream.Length - dataStream.Length)));
if (readCount <= 0)
{
throw new NotSupportedException();
}
dataStream.Write(buffer, 0, readCount);
}
}
var bi = new BitmapImage();
Deployment.Current.Dispatcher.BeginInvoke(() => bi.SetSource(dataStream));
return bi;
}
小图像工作正常,但当 bi.SetSource
被调用时,当加载这样的 200kb+ 图像时,我得到以下异常: 找不到该组件。 (HRESULT 异常:0x88982F50)
我能做些什么吗? 200kb 不算太大,文件保存完好并存在于本地。我希望有人能帮助我,因为它是我应用程序的最后一站......:/
编辑(1 月 31 日):
我重新开始,使用 KawagoeToolkit 库,我通过必要的方法为我的应用程序扩展了该库。它运行良好,但我仍然想知道为什么上面给出了这样一个奇怪的异常。
最佳答案
不要在不必要时使用调度程序。它将介绍闭包语义。在您的方法中,即使您处于另一个同步上下文中,它也没有意义。因为不涉及 GUI 线程。
无论如何,我测试了您的代码,但有一点不同 - 我使用的是 StorageFile 而不是 IsolatedStorage。而且效果很好。
private async void Button_Click(object sender, RoutedEventArgs e)
{
//622Kb: http://www.nasa.gov/sites/default/files/styles/1920x1080_autoletterbox/public/pia17147.jpg?itok=6jErm40V
//2.7Mb: http://www.nasa.gov/sites/default/files/304_lunar_transit_14-00_ut_0.jpg
StorageFile imageFile = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(@"Assets\test3.jpg");
MemoryStream mz;
using (var z = await imageFile.OpenStreamForReadAsync())
{
if (z.Length > int.MaxValue) return;
mz = new MemoryStream((int)z.Length);
var buffer = new byte[4096];
while (mz.Length < z.Length)
{
var readCount = z.Read(buffer, 0, Math.Min(buffer.Length, (int)(z.Length - mz.Length)));
if (readCount <= 0)
{
throw new NotSupportedException();
}
mz.Write(buffer, 0, readCount);
}
}
var bmp = new BitmapImage();
bmp.SetSource(mz);
//Deployment.Current.Dispatcher.BeginInvoke(() => img.Source = bmp); // if in another sync context only
img.Source = bmp;
}
关于c# - 将 "large"数据流设置为 BitmapImage 的源时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21386742/
我有一种方法可以从 zip 文件中打开图像,并将该图像作为 BitmapImage 返回。 public BitmapImage GetImageFromSource() { using (S
这是我的代码 private async void OnGetImage(object sender, RoutedEventArgs e) { using
我正在尝试将图像的字节数组转换为 BitmapImage 以绑定(bind)到按钮。 public static BitmapImage GetBitmapImageFromByteArray(byt
我正在创建一个包含任意值的字节数组,并希望将其转换为 BitmapImage。 bi = new BitmapImage(); using (MemoryStream stream =
我可以像这样成功加载以下位图并将其显示在 View 上的图像控件中。 var bitmapImage = new BitmapImage {
我已经从文件流数据库中加载了一个图像列表。当我最初加载它们时,内存跳跃并没有那么大。当我在屏幕上显示它们时,我的内存使用量会激增,即使在我处理 BitmapImage 流源并将其设置为 Nothing
我正在开发 WP8 (Lumia 920) 的成像应用程序。我在 xaml 层中使用 C# 进行编码。 我在尝试在单独的任务中创建新的 BitmapImage 对象时遇到问题,该对象预计将使用由相机应
我有一个最初是 PNG 的图像,我已将其转换为 byte[] 并保存在数据库中。最初,我只是简单地将 PNG 读入内存流,然后将流转换为 byte[]。现在我想读回 byte[] 并将其转换为 Bit
我正在尝试将非常大的图像(大约 16000x7000 像素)加载到 Material 中,并且尝试异步加载它。我的第一个尝试是创建一个加载 BitmapImage 的任务,然后将其用于 Materia
我正在尝试从服务返回的字节数组创建一个BitmapImage。 我的代码是: using (sc = new ServiceClient()) { using (MemoryStream ms
我正在尝试将非常大的图像(大约 16000x7000 像素)加载到 Material 中,并且尝试异步加载它。我的第一个尝试是创建一个加载 BitmapImage 的任务,然后将其用于 Materia
我正在尝试从服务返回的字节数组创建一个BitmapImage。 我的代码是: using (sc = new ServiceClient()) { using (MemoryStream ms
我正在使用一个处理图像的 API,其中一种方法需要物理磁盘上文件的路径。 我遇到的问题是我通过 WCF 服务检索图像,因此图像已经存在于内存中。我不想将文件写入磁盘只是为了让此方法重新打开它并对其进行
我正在尝试在后台线程 (BackgroundWorker) 中创建一个 BitmapImage,但我的函数只立即返回 null,并且没有进入 Deployment.Current.Dispatcher
我用这段代码从网上获取图片 var image = new BitmapImage(); image.BeginInit(); image.CacheOption = BitmapCacheOptio
我试图通过每秒设置 source 属性来更新图像,这可行,但是在更新时会导致闪烁。 CurrentAlbumArt = new BitmapImage(); CurrentAlbumArt.Begin
我想旋转位图图像我写了一些代码,它可以工作 TransformedBitmap TempImage = new TransformedBitmap(); TempImage.BeginInit();
我有一组原始像素数据。我想将其转换为 8bpp 位图。 public static Bitmap ByteToGrayBitmap(byte[] rawBytes, int width, int he
我正在尝试使用以下代码将 MemoryStream 转换为 Image。 Stream stream = new MemoryStream(bytes); BitmapImage bitmap
我有一个应用程序,它从 XML 文件中读取 JPEG(到字节数组),生成 MemoryStreams 并使用它们来实例化 BitmapImages。 JPEG 的整个大小约为 60 MB。但是,我的应
我是一名优秀的程序员,十分优秀!