将图像(从可绘制文件夹中)转换为ByteArray

时间:2019-02-01 17:25:15

标签: c# xamarin xamarin.forms xamarin.ios xamarin.android

因此,我在代码中陷入了沉思。我正在尝试在我的应用程序内部创建一个“共享”按钮,以将一些图像共享到其他应用程序。

一个下班的朋友与我分享了他使用的相同代码,他获得了图像的字节数组并将其传递给DependencyService,但是他已经将其图像保存在ByteArray中,在我的情况下,我的图像都存储在Resources中/ drawable文件夹。

我们试图做的但不能做的是从可绘制文件夹中获取图像并将其转换为ByteArray。

private void ShareImage(object sender, EventArgs e)
{
    //Convert img to ByteArray


    //ShareWindow
    DependencyService.Get<IShare>().Share("", "", buffer);
}

例如,如何将位于“资源/可绘制”(在Android和iOS项目中)中的名为“ MyImage1.png”的图像转换为ByteArray?看来这是该按钮唯一起作用的东西。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以通过DependencyService调用它们。

Android

public byte[] DrawableByNameToByteArray(string fileName)
{
    var context = Application.Context;
    using (var drawable = Xamarin.Forms.Platform.Android.ResourceManager.GetDrawable(context, fileName))
    using (var bitmap = ((BitmapDrawable)drawable).Bitmap)
    {
        var stream = new MemoryStream();
        bitmap.Compress(Bitmap.CompressFormat.Png, 100, stream);
        bitmap.Recycle();
        return stream.ToArray();
    }
}

iOS

public byte[] iOSBundleResourceByNameToByteArray(string fileName)
{
    using (var image = UIImage.FromFile(fileName))
    using (NSData imageData = image.AsPNG())
    {
        var byteArray = new byte[imageData.Length];
        System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, byteArray, 0, Convert.ToInt32(imageData.Length));
        return byteArray;
    }
}

注意:传递byte []效率很低,流效果更好,但是由于您使用的是本机“共享”功能,因此最好使用原始文件。