c# - 如何在 Xamarin.iOS 中获取照片的字节 []
问题描述
我正在 Xamarin.iOS 中开发摄影软件。我正在使用 PHPhoto 类。
当我拍照时,我试图将其发送到网络上。我打算用 byte[] 发送它们。在 DidFinishCapture 方法中可以从哪里获取照片的数据?当我开始调试启动时,我看到 PHPhotoLibrary.SharedPhotoLibrary.PerformChanges() 会自动将照片保存到照片库中。
如何按字节 [] 检索照片?我在 PhotoData 中找不到它。
我以为 LivePhotoCompanionMovieUrl 中有保存照片的路径,但这始终为空。
public partial class PhotoCaptureDelegate : AVCapturePhotoCaptureDelegate
{
public override void DidFinishCapture(AVCapturePhotoOutput captureOutput,
AVCaptureResolvedPhotoSettings resolvedSettings,
NSError error)
{
PHPhotoLibrary.RequestAuthorization(status =>
{
if (status == PHAuthorizationStatus.Authorized)
{
PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() =>
{
var creationRequest = PHAssetCreationRequest.CreationRequestForAsset();
creationRequest.AddResource(PHAssetResourceType.Photo, PhotoData, null);
var url = LivePhotoCompanionMovieUrl;
if (url != null)
{
var livePhotoCompanionMovieFileResourceOptions = new PAssetResourceCreationOptions
{
ShouldMoveFile = true
};
creationRequest.AddResource(PHAssetResourceType.PairedVideo, url, livePhotoCompanionMovieFileResourceOptions);
}
}, (success, err) =>
{
if (err != null)
Debug.WriteLine($"Error occurered while saving photo to photo library: {error.LocalizedDescription}");
});
}
});
}
}
}
解决方案
如果要将照片转换为字节数组,可以使用 Nuget 的插件Media.Plugin来挑选或拍照。
await CrossMedia.Current.Initialize();
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
DisplayAlert("No Camera", ":( No camera available.", "OK");
return;
}
var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
SaveToAlbum = true,
Name = "test.jpg"
});
if (file == null)
return;
然后在将其转换为字节数组之前先将其转换为Stream 。
Stream stream = file.GetStream();
public byte[] GetImageStreamAsBytes(Stream input)
{
var buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
现在你可以得到如下的字节数组
var imgDate = GetImageStreamAsBytes(stream);
更新
你可以使用 UIImagePickerController
UIImagePickerController imagePicker;
并在需要拍照时调用以下行
imagePicker = new UIImagePickerController
{
SourceType = UIImagePickerControllerSourceType.Camera,
MediaTypes = UIImagePickerController.AvailableMediaTypes(UIImagePickerControllerSourceType.Camera)
};
// Set event handlers
imagePicker.FinishedPickingMedia += ImagePicker_FinishedPickingMedia; ;
imagePicker.Canceled += ImagePicker_Canceled; ;
// Present UIImagePickerController;
this.PresentViewController(imagePicker, true, null);
private void ImagePicker_Canceled(object sender, EventArgs e)
{
imagePicker.DismissModalViewController(true);
}
private void ImagePicker_FinishedPickingMedia(object sender, UIImagePickerMediaPickedEventArgs args)
{
UIImage image = args.EditedImage ?? args.OriginalImage;
if (image != null)
{
// Convert UIImage to .NET Stream object
NSData data;
if (args.ReferenceUrl.PathExtension.Equals("PNG") || args.ReferenceUrl.PathExtension.Equals("png"))
{
data = image.AsPNG();
}
else
{
data = image.AsJPEG(1);
}
Stream stream = data.AsStream();
}
else
{
}
imagePicker.DismissModalViewController(true);
}
public byte[] GetImageStreamAsBytes(Stream input)
{
var buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
现在你可以得到如下的字节数组
var imgDate = GetImageStreamAsBytes(stream);
推荐阅读
- asp.net-core - 我们可以获取部署在 AWS Fargate 上的 asp.net 核心 Web API 的客户端 IP、主机名吗
- spring - Docker镜像构建CACHED问题(Spring boot)
- python - 如何使用 pandas 实现 vlookup 交叉引用
- pandas - 重新分配给熊猫系列时的警告
- flutter - Flutter DatePicker 对话日期应该是阿拉伯数字,但我得到数字格式
- reactjs - 多个文件中的 redux-sage sagas
- arrays - 我需要做什么才能将字符串从类数组保存到普通字符串变量?
- reactjs - 如何使用带有单个文件输入字段的 react-hook-form 上传多个文件
- r - 如何在 R 中创建嵌套 for 循环以转换表中的值
- c# - 用源生成器替换反射