using System;
using AVFoundation;
using CoreGraphics;
using Foundation;
using UIKit;
namespace Shared
{
///
/// 拍照或者选择图片
///
public static class Camera
{
static readonly UIImagePickerController _picker;
static bool IsZoom;
///
/// 拍照或者读取图片完成时调用的动作,string==null表示用户取消了拍照或者取消选择图片,string!=null,表示图片的路径
///
static Action _callback;
static Camera()
{
_picker = new UIImagePickerController();
_picker.Delegate = new MyCameraDelegate();
}
static string _fileName;
///
/// Camera delegate.
///
class MyCameraDelegate : UIImagePickerControllerDelegate
{
//16*9
public override void FinishedPickingMedia(UIImagePickerController picker, NSDictionary info)
{
picker.DismissModalViewController(true);
var tempPhoto = info.ValueForKey(new NSString("UIImagePickerControllerOriginalImage")) as UIImage;
tempPhoto = rotateImage(tempPhoto);
var width = tempPhoto.CGImage.Width;
var height = tempPhoto.CGImage.Height;
//System.Console.WriteLine("原宽度=" + width + "高度=" + height);
nfloat noScale = width / height;
nfloat scale = 16.0f / 9.0f;
if (!IsZoom)
{
scale = noScale;
}
nfloat x = 0, y = 0, w = width, h = height;
if (scale < noScale)
{
w = height * scale;
x = (width - w) / 2;
}
else
{
h = width / scale;
y = (height - h) / 2;
}
var imageRef = tempPhoto.CGImage.WithImageInRect(new CGRect(x, y, w, h));
UIImage newImage = UIImage.FromImage(imageRef);
// 关闭上下文
//System.Console.WriteLine("改变后的宽度=" + newImage.Size.Width + "高度=" + newImage.Size.Height);
string tempFilePath = System.IO.Path.Combine(Application.RootPath, _fileName);
NSError err = null;
float f = 0.1f;
NSData nsData = newImage.AsJPEG(f);
while (f < 1.0f)
{
if (200 * 1024 < nsData.Length)
{
break;
}
f += 0.1f;
nsData = newImage.AsJPEG(f);
}
if (nsData.Save(tempFilePath, false, out err))
{
//保存成功
}
else
{
Console.WriteLine("保存图片失");
}
newImage.Dispose();
_callback?.Invoke(tempFilePath);
_callback = null;
}
public override void Canceled(UIImagePickerController picker)
{
picker.DismissModalViewController(true);
_callback?.Invoke(null);
_callback = null;
}
UIImage rotateImage(UIImage aImage)
{
var imgRef = aImage.CGImage;
var width = imgRef.Width;
var height = imgRef.Height;
CGAffineTransform transform = CGAffineTransform.MakeIdentity();
CGRect bounds = new CGRect(0, 0, width, height);
nfloat scaleRatio = 1;
nfloat boundHeight;
UIImageOrientation orient = aImage.Orientation;
nfloat M_PI = 3.14159265358979323846f;
switch (orient)
{
case UIImageOrientation.Up: //EXIF = 1
transform = CGAffineTransform.MakeIdentity();
break;
case UIImageOrientation.UpMirrored: //EXIF = 2
transform = CGAffineTransform.MakeTranslation(width, 0.0f);
transform = CGAffineTransform.Scale(transform, -1.0f, 1.0f);
break;
case UIImageOrientation.Down: //EXIF = 3
transform = CGAffineTransform.MakeTranslation(width, height);
transform = CGAffineTransform.Rotate(transform, M_PI);
break;
case UIImageOrientation.DownMirrored: //EXIF = 4
transform = CGAffineTransform.MakeTranslation(0.0f, height);
transform = CGAffineTransform.Scale(transform, 1.0f, -1.0f);
break;
case UIImageOrientation.LeftMirrored: //EXIF = 5
boundHeight = bounds.Height;
bounds.Height = bounds.Size.Width;
bounds.Width = boundHeight;
transform = CGAffineTransform.MakeTranslation(height, width);
transform = CGAffineTransform.Scale(transform, -1.0f, 1.0f);
transform = CGAffineTransform.Rotate(transform, 3.0f * M_PI / 2.0f);
break;
case UIImageOrientation.Left: //EXIF = 6
boundHeight = bounds.Height;
bounds.Height = bounds.Width;
bounds.Width = boundHeight;
transform = CGAffineTransform.MakeTranslation(0.0f, width);
transform = CGAffineTransform.Rotate(transform, 3.0f * M_PI / 2.0f);
break;
case UIImageOrientation.RightMirrored: //EXIF = 7
boundHeight = bounds.Height;
bounds.Height = bounds.Width;
bounds.Width = boundHeight;
transform = CGAffineTransform.MakeScale(-1.0f, 1.0f);
transform = CGAffineTransform.Rotate(transform, M_PI / 2.0f);
break;
case UIImageOrientation.Right: //EXIF = 8
boundHeight = bounds.Height;
bounds.Height = bounds.Width;
bounds.Width = boundHeight;
transform = CGAffineTransform.MakeTranslation(height, 0.0f);
transform = CGAffineTransform.Rotate(transform, M_PI / 2.0f);
break;
//default:
// [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];
}
UIGraphics.BeginImageContext(bounds.Size);
var context = UIGraphics.GetCurrentContext();
if (orient == UIImageOrientation.Right || orient == UIImageOrientation.Left)
{
context.ScaleCTM(-scaleRatio, scaleRatio);
context.TranslateCTM(-height, 0);
}
else
{
context.ScaleCTM(scaleRatio, -scaleRatio);
context.TranslateCTM(0, -height);
}
context.ConcatCTM(transform);
UIGraphics.GetCurrentContext().DrawImage(new CGRect(0, 0, width, height), imgRef);
UIImage imageCopy = UIGraphics.GetImageFromCurrentImageContext();
imgRef.Dispose();
UIGraphics.EndImageContext();
return imageCopy;
}
}
///
/// 拍照
///
/// 回调函数
/// 文件名
public static void TakePicture(Action callback, string fileName, bool isZoom = true)
{
_fileName = fileName;
_callback = callback;
_picker.SourceType = UIImagePickerControllerSourceType.Camera;
IsZoom = isZoom;
if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad)
{
if (!UIImagePickerController.IsCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Front))
{
return;
}
_picker.ModalTransitionStyle = UIModalTransitionStyle.CrossDissolve;
currentVC.PresentModalViewController(_picker, true);
}
else
{
currentVC.PresentModalViewController(_picker, true);
}
}
///
/// 选择图片
///
/// 回调函数
/// 文件名
public static void SelectPicture(Action callback, string fileName, bool isZoom = true)
{
_fileName = fileName;
_callback = callback;
_picker.SourceType = UIImagePickerControllerSourceType.PhotoLibrary;
IsZoom = isZoom;
if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad)
{
NSOperationQueue.MainQueue.AddOperation(() =>
{
_picker.ModalTransitionStyle = UIModalTransitionStyle.CoverVertical;
var popover = new UIPopoverController(_picker) { PopoverContentSize = Application.RootFrameLayout.Frame.Size };
popover.PresentFromRect(new CGRect(95, 235, 300, 300), Application.RootFrameLayout, UIPopoverArrowDirection.Down | UIPopoverArrowDirection.Left, true);
});
}
else
{
currentVC.PresentModalViewController(_picker, true);
}
}
//获取当前屏幕显示的viewcontroller
static UIViewController currentVC
{
get
{
var rootViewController = UIApplication.SharedApplication.KeyWindow.RootViewController;
var currentVC = getCurrentVCFrom(rootViewController);
return currentVC;
}
}
static UIViewController getCurrentVCFrom(UIViewController rootVC)
{
UIViewController currentVC;
if (rootVC.PresentedViewController != null)
{
// 视图是被presented出来的
rootVC = rootVC.PresentedViewController;
}
if (rootVC.GetType() == typeof(UITabBarController))
{
// 根视图为UITabBarController
currentVC = getCurrentVCFrom((rootVC as UITabBarController).SelectedViewController);
}
else if (rootVC.GetType() == typeof(UINavigationController))
{
// 根视图为UINavigationController
currentVC = getCurrentVCFrom((rootVC as UINavigationController).VisibleViewController);
}
else
{
// 根视图为非导航类
currentVC = rootVC;
}
return currentVC;
}
}
}