我在 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,但我无法让它工作,互联网上有很多解决方案,但我不确定我是否正确使用它们,让我知道你是否有想法。
要减少base64.Length,您可以调整图像大小或降低图像质量。杰森添加了一个很好的链接。我想添加更多细节并分享完整的解决方案。
我使用 Xamarin Forms DependencyService 做了一个演示来调用 ios 本机代码。
在共享项目中创建一个名为 IResizeImageInterface 的接口。并定义方法。
public interface IResizeImageInterface
{
byte[] ResizeImage(byte[] imageData,float width,float height,float quality);
}
这个 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;
}
}
这一步很简单。在 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);
调整图像大小后,您可能会看到长度减少。
希望有帮助!