xamarin 表单从图像控件获取字节数组
xamarin forms get byte array from image control
在我的应用程序中,我让用户 select 一张图片(任意大小)。然后应用程序会将其加载到图像控件,根据需要调整其大小,并将其显示在屏幕上。
当我使用 Xamarin Forms Plugin.FilePicker 并从中获取字节数组以保存到我的首选项时,我现在可以从首选项中正确地保存/加载所有内容。
我面临的挑战是,如果使用他们设备中的大图片,则上传到 FilePicker 插件的是大图片,字节数组太大而无法保存。 (我收到错误“状态管理器设置值的大小已超出限制。”)
所以我想做的是获取已调整为可管理大小的图像控件的内容,将其转换为字节数组,然后将其保存在我的首选项中。
知道如何将图像控件的内容转换成字节数组,以便在 JSON 中序列化它并将其保存到我的首选项吗?下面是从文件选择器中保存字节数组的代码。
private async void btnChooseFile_Clicked(object sender, System.EventArgs e)
{
try
{
FileData fileData = await CrossFilePicker.Current.PickFile();
if (fileData == null)
return; // user canceled file picking
//lblFilePath.Text = fileData.FileName;
imgIcon.Source = ImageSource.FromStream(() => fileData.GetStream());
// THIS IS THE LINE OF CODE I NEED TO CHANGE TO IT SAVES THE
// BYTE ARRAY OF THE SMALLER IMAGE AS DISPLAYED BY THE
// IMAGE CONTROL INSTEAD OF THE FULL SIZE FILE THE USER
// SELECTED
ViewModelObjects.AppSettings.KioskIcon = fileData.DataArray;
}
catch (Exception ex)
{
System.Console.WriteLine("Exception choosing file: " + ex.ToString());
}
}
您可以在将值分配给图像控件之前调整图像大小:
#if __IOS__
public static byte[] ResizeImageIOS(byte[] imageData, float width, float height)
{
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(0, 0, width, height);
// 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().ToArray();
}
}
#if __ANDROID__
public static byte[] ResizeImageAndroid (byte[] imageData, float width, float height)
{
// Load the bitmap
Bitmap originalImage = BitmapFactory.DecodeByteArray (imageData, 0, imageData.Length);
Bitmap resizedImage = Bitmap.CreateScaledBitmap(originalImage, (int)width, (int)height, false);
using (MemoryStream ms = new MemoryStream())
{
resizedImage.Compress (Bitmap.CompressFormat.Jpeg, 100, ms);
return ms.ToArray ();
}
}
可以参考ImageResizer
在我的应用程序中,我让用户 select 一张图片(任意大小)。然后应用程序会将其加载到图像控件,根据需要调整其大小,并将其显示在屏幕上。
当我使用 Xamarin Forms Plugin.FilePicker 并从中获取字节数组以保存到我的首选项时,我现在可以从首选项中正确地保存/加载所有内容。
我面临的挑战是,如果使用他们设备中的大图片,则上传到 FilePicker 插件的是大图片,字节数组太大而无法保存。 (我收到错误“状态管理器设置值的大小已超出限制。”)
所以我想做的是获取已调整为可管理大小的图像控件的内容,将其转换为字节数组,然后将其保存在我的首选项中。
知道如何将图像控件的内容转换成字节数组,以便在 JSON 中序列化它并将其保存到我的首选项吗?下面是从文件选择器中保存字节数组的代码。
private async void btnChooseFile_Clicked(object sender, System.EventArgs e)
{
try
{
FileData fileData = await CrossFilePicker.Current.PickFile();
if (fileData == null)
return; // user canceled file picking
//lblFilePath.Text = fileData.FileName;
imgIcon.Source = ImageSource.FromStream(() => fileData.GetStream());
// THIS IS THE LINE OF CODE I NEED TO CHANGE TO IT SAVES THE
// BYTE ARRAY OF THE SMALLER IMAGE AS DISPLAYED BY THE
// IMAGE CONTROL INSTEAD OF THE FULL SIZE FILE THE USER
// SELECTED
ViewModelObjects.AppSettings.KioskIcon = fileData.DataArray;
}
catch (Exception ex)
{
System.Console.WriteLine("Exception choosing file: " + ex.ToString());
}
}
您可以在将值分配给图像控件之前调整图像大小:
#if __IOS__
public static byte[] ResizeImageIOS(byte[] imageData, float width, float height)
{
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(0, 0, width, height);
// 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().ToArray();
}
}
#if __ANDROID__
public static byte[] ResizeImageAndroid (byte[] imageData, float width, float height)
{
// Load the bitmap
Bitmap originalImage = BitmapFactory.DecodeByteArray (imageData, 0, imageData.Length);
Bitmap resizedImage = Bitmap.CreateScaledBitmap(originalImage, (int)width, (int)height, false);
using (MemoryStream ms = new MemoryStream())
{
resizedImage.Compress (Bitmap.CompressFormat.Jpeg, 100, ms);
return ms.ToArray ();
}
}
可以参考ImageResizer