Unity3D读取iOS 相册 (不裁剪)

有需要查看安卓读取相册的,请看我上一篇文章: Unity3D读取android相册(不裁剪)

这个主要参考了这篇文章http://blog.csdn.net/AnYuanLzh/article/details/50748928,建议先移步看一下再回来看这篇。
我做了一点修改。主要是不裁剪照片。在代码中有标注。

直接Copy代码:

Xcode部分:

//
//  IOSAlbumCameraController.h
//  Unity-iPhone
//
//  Created by AnYuanLzh
//
//

@interface IOSAlbumCameraController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@end

//
//  OpenPhotoController.m
//
//  Created by AnYuanLzh
//

#import "IOSAlbumCameraController.h"

@implementation IOSAlbumCameraController

- (void)showActionSheet
{
    NSLog(@" --- showActionSheet !!");
    
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
    
    UIAlertAction *albumAction = [UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"click album action!");
        [self showPicker:UIImagePickerControllerSourceTypePhotoLibrary allowsEditing:YES];
    }];
    
    UIAlertAction *cameraAction = [UIAlertAction actionWithTitle:@"相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"click camera action!");
        [self showPicker:UIImagePickerControllerSourceTypeCamera allowsEditing:YES];
    }];
    
    UIAlertAction *album_cameraAction = [UIAlertAction actionWithTitle:@"相册&相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"click album&camera action!");
        //[self showPicker:UIImagePickerControllerSourceTypeCamera];
        [self showPicker:UIImagePickerControllerSourceTypeSavedPhotosAlbum allowsEditing:YES];
    }];
    
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"click cancel action!");
    }];
    
    
    [alertController addAction:albumAction];
    [alertController addAction:cameraAction];
    [alertController addAction:album_cameraAction];
    [alertController addAction:cancelAction];
    
    UIViewController *vc = UnityGetGLViewController();
    [vc presentViewController:alertController animated:YES completion:^{
        NSLog(@"showActionSheet -- completion");
    }];
}

- (void)showPicker:
(UIImagePickerControllerSourceType)type
     allowsEditing:(BOOL)flag
{
    NSLog(@" --- showPicker!!");
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.sourceType = type;
    picker.allowsEditing = flag;
    
    [self presentViewController:picker animated:YES completion:nil];
}

// 打开相册后选择照片时的响应方法
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    NSLog(@" --- imagePickerController didFinishPickingMediaWithInfo!!");
    // Grab the image and write it to disk
    UIImage *image;
    UIImage *image2;
//    image = [info objectForKey:UIImagePickerControllerEditedImage];
//    UIGraphicsBeginImageContext(CGSizeMake(280,428));
//    [image drawInRect:CGRectMake(0, 0, 280, 428)];
//<-主要修改了这里image = [info objectForKey:UIImagePickerControllerEditedImage];->
// 将它改为不编辑类型的参数,如下
    image = [info objectForKey:UIImagePickerControllerOriginalImage];
    image2 = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    // 得到了image,然后用你的函数传回u3d
    NSData *imgData;
    if(UIImagePNGRepresentation(image2) == nil)
    {
        NSLog(@" --- actionSheet slse!! 11 ");
        imgData= UIImageJPEGRepresentation(image, .6);
    }
    else
    {
        NSLog(@" --- actionSheet slse!! 22 ");
        imgData= UIImagePNGRepresentation(image2);
    }
    
    NSString *_encodeImageStr = [imgData base64Encoding];
    UnitySendMessage( "Main Camera", "PickImageCallBack_Base64", _encodeImageStr.UTF8String);
    
    // 关闭相册
    [picker dismissViewControllerAnimated:YES completion:nil];
}

// 打开相册后点击“取消”的响应
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
    NSLog(@" --- imagePickerControllerDidCancel !!");
    [self dismissViewControllerAnimated:YES completion:nil];
}

//- (void)dismissWrappedController
//{
//    NSLog(@" --- dismissWrappedController !!");
//    UIViewController *vc = UnityGetGLViewController();
//
//    if( !vc )
//		return;
//
//    [self performSelector:@selector(removeAndReleaseViewControllerWrapper) withObject:nil afterDelay:1.0];
//
//}
//- (void)removeAndReleaseViewControllerWrapper
//{
//    NSLog(@" --- removeAndReleaseViewControllerWrapper !!");
//	// iPad might have a popover
//	if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && _popoverViewController )
//	{
//		[_popoverViewController dismissPopoverAnimated:YES];
//		self.popoverViewController = nil;
//	}
//}

//+(void) saveImageToPhotosAlbum:(NSString*) base64
//{
//    NSLog(@"base64: ");
//    NSLog(base64);
//    const char* string = [base64 UTF8String];
//    NSData* imageData = [NSData dataWithBytes:string length:strlen(string)+1];
//    UIImage* image = [UIImage imageWithData:imageData];
//    UIImageWriteToSavedPhotosAlbum(image,
//                                   self,
//                                   @selector(image:didFinishSavingWithError:contextInfo:),
//                                   NULL);
//}
+(void) saveImageToPhotosAlbum:(NSString*) readAdr
{
    NSLog(@"readAdr: ");
    NSLog(readAdr);
    UIImage* image = [UIImage imageWithContentsOfFile:readAdr];
    UIImageWriteToSavedPhotosAlbum(image,
                                   self,
                                   @selector(image:didFinishSavingWithError:contextInfo:),
                                   NULL);
}

+(void) image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo
{
    NSString* result;
    if(error)
    {
        result = @"图片保存到相册失败!";
    }
    else
    {
        result = @"图片保存到相册成功!";
    }
    UnitySendMessage( "Main Camera", "SaveImageToPhotosAlbumCallBack", result.UTF8String);
}

@end

//------------- called by unity -----begin-----------------
#if defined (__cplusplus)
extern "C" {
#endif
    
    // 弹出一个菜单项:相册、相机
    void _showActionSheet()
    {
        NSLog(@" -unity call-- _showActionSheet !!");
        IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];
        UIViewController *vc = UnityGetGLViewController();
        [vc.view addSubview: app.view];
        
        [app showActionSheet];
    }
    
    // 打开相册
    void _iosOpenPhotoLibrary()
    {
        if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
        {
            IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];
            UIViewController *vc = UnityGetGLViewController();
            [vc.view addSubview: app.view];
            
            [app showPicker:UIImagePickerControllerSourceTypePhotoLibrary allowsEditing:NO];
        }
        else
        {
            UnitySendMessage( "Main Camera", "PickImageCallBack_Base64", (@"").UTF8String);
        }
    }
    
    // 打开相册
    void _iosOpenPhotoAlbums()
    {
        if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
        {
            IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];
            UIViewController *vc = UnityGetGLViewController();
            [vc.view addSubview: app.view];
            
            [app showPicker:UIImagePickerControllerSourceTypeSavedPhotosAlbum allowsEditing:NO];
        }
        else
        {
            _iosOpenPhotoLibrary();
        }
    }
    
    // 打开相机
    void _iosOpenCamera()
    {
        if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
        {
            IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];
            UIViewController *vc = UnityGetGLViewController();
            [vc.view addSubview: app.view];
            
            [app showPicker:UIImagePickerControllerSourceTypeCamera allowsEditing:NO];
        }
        else
        {
            UnitySendMessage( "Main Camera", "PickImageCallBack_Base64", (@"").UTF8String);
        }
    }
    
    
    // 打开相册--可编辑
    void _iosOpenPhotoLibrary_allowsEditing()
    {
        if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
        {
            IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];
            UIViewController *vc = UnityGetGLViewController();
            [vc.view addSubview: app.view];
            
            [app showPicker:UIImagePickerControllerSourceTypePhotoLibrary allowsEditing:YES];
        }
        else
        {
            UnitySendMessage( "Main Camera", "PickImageCallBack_Base64", (@"").UTF8String);
        }
        
    }
    
    // 打开相册--可编辑
    void _iosOpenPhotoAlbums_allowsEditing()
    {
        if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
        {
            NSLog(@"打开相册");
            IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];
            UIViewController *vc = UnityGetGLViewController();
            [vc.view addSubview: app.view];
            
            [app showPicker:UIImagePickerControllerSourceTypeSavedPhotosAlbum allowsEditing:YES];
        }
        else
        {
             NSLog(@"打开相册==这是啥?");
            _iosOpenPhotoLibrary();
        }
        
    }
    
    // 打开相机--可编辑
    void _iosOpenCamera_allowsEditing()
    {
        if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
        {
            IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];
            UIViewController *vc = UnityGetGLViewController();
            [vc.view addSubview: app.view];
            
            [app showPicker:UIImagePickerControllerSourceTypeCamera allowsEditing:YES];
        }
        else
        {
            UnitySendMessage( "Main Camera", "PickImageCallBack_Base64", (@"").UTF8String);
        }
    }
    
    // 保存照片到相册
    //    void _iosSaveImageToPhotosAlbum(char* base64)
    //    {
    //        NSString* temp = [NSString stringWithUTF8String:base64];
    //        [IOSAlbumCameraController saveImageToPhotosAlbum:temp];
    //    }
    void _iosSaveImageToPhotosAlbum(char* readAddr)
    {
        NSString* temp = [NSString stringWithUTF8String:readAddr];
        [IOSAlbumCameraController saveImageToPhotosAlbum:temp];
    }
    
#if defined (__cplusplus)
}
#endif
//------------- called by unity -----end-----------------

Unity3D:

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class IOSAlbumCamera : MonoBehaviour
{
	[DllImport ("__Internal")]
	private static extern void _iosOpenPhotoLibrary();
	[DllImport ("__Internal")]
	private static extern void _iosOpenPhotoAlbums();
	[DllImport ("__Internal")]
	private static extern void _iosOpenCamera();
	[DllImport ("__Internal")]
	private static extern void _iosOpenPhotoLibrary_allowsEditing();	
	[DllImport ("__Internal")]
	private static extern void _iosOpenPhotoAlbums_allowsEditing();	
	[DllImport ("__Internal")]
	private static extern void _iosOpenCamera_allowsEditing();
	[DllImport ("__Internal")]
	private static extern void _iosSaveImageToPhotosAlbum(string readAddr);

    /// <summary>
    /// 打开照片
    /// </summary>
    /// <param name="allowsEditing"></param>
	public static void iosOpenPhotoLibrary(bool allowsEditing=false)
	{
		if (allowsEditing)
			_iosOpenPhotoLibrary_allowsEditing ();
		else
			_iosOpenPhotoLibrary ();
	}

    /// <summary>
    /// 打开相册
    /// </summary>
    /// <param name="allowsEditing"></param>
	public static void iosOpenPhotoAlbums(bool allowsEditing=false)
	{
		if (allowsEditing)
			_iosOpenPhotoAlbums_allowsEditing ();
		else
			_iosOpenPhotoAlbums ();
	}

    /// <summary>
    /// 打开相机
    /// </summary>
    /// <param name="allowsEditing"></param>
	public static void iosOpenCamera(bool allowsEditing=false)
	{
		if (allowsEditing)
			_iosOpenCamera_allowsEditing ();
		else
			_iosOpenCamera ();
	}

    /// <summary>
    /// 保存图片到相册
    /// </summary>
    /// <param name="readAddr"></param>
	public static void iosSaveImageToPhotosAlbum(string readAddr)
	{
		_iosSaveImageToPhotosAlbum (readAddr);
	}

    /// <summary>
    /// 将ios传过的string转成u3d中的texture
    /// </summary>
    /// <param name="base64"></param>
    /// <returns></returns>
	public static Texture2D Base64StringToTexture2D(string base64)
	{
		Texture2D tex = new Texture2D (256, 256, TextureFormat.ARGB32, false);
		try
		{
			byte[] bytes = System.Convert.FromBase64String(base64);
			bool isOK= tex.LoadImage(bytes);
			Debug.Log("Are You OK? " + isOK.ToString());
		}
		catch(System.Exception ex)
		{
            Debug.LogError(ex.Message);
		}
		return tex;
	}    

	private static IOSAlbumCamera _instance;
	public static IOSAlbumCamera Instance{get{ return _instance; }}

	public System.Action<string> CallBack_PickImage_With_Base64;
	public System.Action<string> CallBack_ImageSavedToAlbum;

	void Awake()
	{
		if (_instance != null)
		{
			DestroyImmediate(this);
			return;
		}
		_instance = this;
//		GameObject go = new GameObject ("IOSAlbumCamera");
//		_instance = go.AddComponent<IOSAlbumCamera> ();
	}

	/// <summary>
	/// 打开相册相机后的从ios回调到unity的方法
	/// </summary>
	/// <param name="base64">Base64.</param>
	void PickImageCallBack_Base64(string base64)
	{
		Debug.Log("选图后回调 了 ");
		if(CallBack_PickImage_With_Base64!=null)
		{
			CallBack_PickImage_With_Base64(base64);
		}
	}

    /// <summary>
    /// 保存图片到相册后,从ios回调到unity的方法
    /// </summary>
    /// <param name="msg">Message.</param>
    void SaveImageToPhotosAlbumCallBack(string msg)
	{
		Debug.Log (" -- msg: " + msg);
		if(CallBack_ImageSavedToAlbum!=null)
		{
			CallBack_ImageSavedToAlbum(msg);
		}
	}




}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值