Xamarin Forms 图像转流

4

我的目标是获取每个项目图像文件夹中保存的嵌入式图像,流式传输它,将其转换为字节数组,并使用PCLStorage将其保存到设备的本地存储文件系统中。我无法弄清楚的部分是如何从嵌入式图像进行流式传输。

var embeddedImage = new Image { Aspect = Aspect.AspectFit };
embeddedImage.Source = ImageSource.FromResource("applicationIcon.png");

如果我有路径,我就可以流式传输它,或者如果我有流,我就可以将其转换为byte[]。由于文件源未找到(显然),因此下面的代码无法工作。

string localFileUri = string.Empty;

// Get hold of the file system.
IFolder localFolder = FileSystem.Current.LocalStorage;

IFile file = await FileSystem.Current.GetFileFromPathAsync("applicationIcon.png");

using (Stream stream = await file.OpenAsync(FileAccess.Read))
{
    using (var ms = new MemoryStream())
    {
        var byteArray = ms.ToArray();

        var storeragePath = await iStorageService.SaveBinaryObjectToStorageAsync(string.Format(FileNames.ApplicationIcon, app.ApplicationId), byteArray);
        app.IconURLLocal = storeragePath;
    }
}

唯一的选择似乎是使用某种资源定位符,然后为您添加的每种类型的项目维护该代码。不太优雅,是否有其他方法?

听起来你正在寻找嵌入式资源。然后,您可以通过使用Assembly.GetManifestResourceStream方法访问该流。 - Will Decker
你还需要确保图像的构建操作是嵌入资源。 - Will Decker
谢谢deckertron_9000。这让我找到了正确的方法! - Mark Garcia
如果你有时间的话,你应该在这里写下你的问题的答案,这样其他人也可以学习 :) - Will Decker
2个回答

7

首先,感谢 deckertron_9000 帮我找到正确的解决方法,其次是这两个链接:

http://www.itgo.me/a/3956119637998661919/xamarin-forms-how-to-load-an-image-from-resources-into-a-byte-array

Xamarin Forms: How to use Embedded Resources in PCL Project for Image

最终,以下代码对我有效:

首先,我将图像添加到我的PCL文件夹中。然后,我确保将图像的构建操作更改为嵌入式资源。

其次,我添加了 using System.Reflection;

第三,下面的代码对我有效:

string imagePath = "NameOfProject.Assets.applicationIcon.png";
Assembly assembly = typeof(NameOfClass).GetTypeInfo().Assembly;

byte[] buffer;
using (Stream stream = assembly.GetManifestResourceStream(imagePath))
{
    long length = stream.Length;
    buffer = new byte[length];
    stream.Read(buffer, 0, (int)length);

    var storeragePath = await iStorageService.SaveBinaryObjectToStorageAsync(string.Format(FileNames.ApplicationIcon, app.ApplicationId), buffer);
    app.IconURLLocal = storeragePath;
}

1
你在代码的第二行中所说的“NameOfClass”是什么意思? - M_Mogharrabi

2
 if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
        {
            await App.CurrentApp.MainPage.DisplayAlert("No Camera", ":( No camera available.", "OK");
            return;
        }

        _mediaFile = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
        {
            Directory = "Sample",
            Name = "test.jpg"
        });

        if (_mediaFile == null)
            return;

        //ViewModel.StoreImageUrl(file.Path);

        await App.CurrentApp.MainPage.DisplayAlert("Snap", "Your photo have been added to your Items collection.", "OK");

        ImageSource = ImageSource.FromStream(() =>
        {
            var stream = _mediaFile.GetStream();
            _mediaFile.Dispose();
            return stream;
        });

1
谢谢Vimal。如果你有路径,使用CrossMedia插件是可行的。在我的情况下,我没有路径,不得不使用Assembly类。 - Mark Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接