我在iOS上拍照,你知道如何减小FilResult的大小以转换为base64

问题描述 投票:0回答:1

我在 Xamarin 中创建了一个 iOS 应用程序,我尝试拍摄一张照片并将其用作个人资料图片,它工作正常,但我需要将其发送到我的数据库,而 base64 太长了。我想调整 FileResult 的大小以减少字符数。这是我的代码:

 async Task CapturePhoto()
    {
        try
        {
            var result = await MediaPicker.CapturePhotoAsync();

            if (result != null)
            {
                Stream stream = await result.OpenReadAsync();

                using (MemoryStream memory = new MemoryStream())
                {
                    stream.CopyTo(memory);
                    byte[] bytes = memory.ToArray();
                    string base64 = Convert.ToBase64String(bytes);
                    profil.Photo = base64;
                    ImageProfil.Source = ImageSource.FromStream(() => new MemoryStream(Convert.FromBase64String(profil.Photo)));
                    Console.WriteLine(base64.Length);
                }


            }
        }
        catch (Exception e)
        {
            await DisplayAlert("Erreur", e.Message, "ok");
        }

    }

我不知道最好的选择是什么,首先调整参数大小,我已经尝试过MagickImage,但我无法让它工作,互联网上有很多解决方案,但我不确定我是否正确使用它们,让我知道你是否有想法。

c# xamarin xamarin.ios camera base64
1个回答
0
投票

要减少base64.Length,您可以调整图像大小降低图像质量。杰森添加了一个很好的链接。我想添加更多细节并分享完整的解决方案。

我使用 Xamarin Forms DependencyService 做了一个演示来调用 ios 本机代码。

1.创建接口

在共享项目中创建一个名为 IResizeImageInterface 的接口。并定义方法。

public interface IResizeImageInterface
{
    byte[] ResizeImage(byte[] imageData,float width,float height,float quality);
}

2.在iOS上实现接口

这个 ResizeImageService 类是在 iOS 项目中创建的。调用此方法,我们可以根据我们传递的参数调整图像大小并降低质量。

public class ResizeImageService : IResizeImageInterface
{
    public ResizeImageService()
    {
    }

    public byte[] ResizeImage(byte[] imageData, float width,float height,float quality)
    {


        UIImage originalImage = ImageFromByteArray(imageData);
        UIImageOrientation orientation = originalImage.Orientation;

        //create a 24bit RGB image
        using (CGBitmapContext context = new CGBitmapContext(IntPtr.Zero,
                                             (int)width, (int)height, 8,
                                             4 * (int)width, CGColorSpace.CreateDeviceRGB(),
                                             CGImageAlphaInfo.PremultipliedFirst))
        {

            RectangleF imageRect = new RectangleF();

            // draw the image
            context.DrawImage(imageRect, originalImage.CGImage);

            UIKit.UIImage resizedImage = UIKit.UIImage.FromImage(context.ToImage(), 0, orientation);

            // save the image as a jpeg
            return resizedImage.AsJPEG(quality).ToArray();
        }
    }

    public static UIKit.UIImage ImageFromByteArray(byte[] data)
    {
        if (data == null)
        {
            return null;
        }

        UIKit.UIImage image;
        try
        {
            image = new UIKit.UIImage(Foundation.NSData.FromArray(data));
        }
        catch (Exception e)
        {
            Console.WriteLine("Image load failed: " + e.Message);
            return null;
        }
        return image;
    }
}

3.注册平台实现

这一步很简单。在 ResizeImageService 类中添加此行。

[assembly: Dependency(typeof(ReduceSize77439838.iOS.ResizeImageService))]
namespace MyProjectName.iOS

现在您可以在共享项目中调用iOS原生代码了。

using (MemoryStream memory = new MemoryStream())
{
    //Before resize
    stream.CopyTo(memory);
    byte[] bytes = memory.ToArray();
    string base64 = Convert.ToBase64String(bytes);
    Console.WriteLine(base64.Length);

    //After resize
    IResizeImageInterface service = DependencyService.Get<IResizeImageInterface>();
    byte[] resizedImage = service.ResizeImage(bytes,400f,400f,0.2f);
    string resizedBase64 = Convert.ToBase64String(resizedImage);    
    Console.WriteLine(resizedBase64.Length);

调整图像大小后,您可能会看到长度减少。

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.