标签:
注:引擎版本unity4.x
最近项目需求,需要做用户头像,要求:
1. 可以从本地上传
2. 本地裁剪
3. 压缩控制大小
4. 在三个平台实现PC/Android/IOS
弄了好几天总是搞完了总结一下
在网上找了一段时间,有人推荐了一个插件,网盘地址忘记存了,直接上代码吧
OpenPhotoController.h :
@interface OpenPhotoController : NSObject<UIApplicationDelegate,UIImagePickerControllerDelegate, UIActionSheetDelegate,UINavigationControllerDelegate>
{
    
    UIView*                _rootView;
    UIViewController*    _rootController;
@private
    id _popoverViewController;
}
@property (nonatomic, retain) id popoverViewController;
@end
OpenPhotoController.mm:
#import "OpenPhotoController.h"
@implementation OpenPhotoController
@synthesize popoverViewController = _popoverViewController;
-(void)showActionSheet
{
    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil
                                                delegate:self
                                                cancelButtonTitle:NSLocalizedString( @"取消", nil )
                                                destructiveButtonTitle:nil
											    otherButtonTitles:NSLocalizedString( @"拍照", nil ), NSLocalizedString( @"相册", nil ), nil];
	
	if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
		[sheet showFromRect:CGRectMake( 0, 0, 128, 128 ) inView:UnityGetGLViewController().view animated:YES];
	else
		[sheet showInView:UnityGetGLViewController().view];
	
	//[sheet release];
    
}
- (void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
	if( buttonIndex == 0 )
	{
		[self showPicker:UIImagePickerControllerSourceTypeCamera];
	}
	else if( buttonIndex == 1 )
	{
		[self showPicker:UIImagePickerControllerSourceTypePhotoLibrary];
	}
	else // Cancelled
	{
		//UnityPause( false );
		//UnitySendMessage( "EtceteraManager", "imagePickerDidCancel", "" );
	}
}
- (void)showPicker:(UIImagePickerControllerSourceType)type
{
	UIImagePickerController *picker = [[UIImagePickerController alloc] init];
	picker.delegate = self;
	picker.sourceType = type;
	picker.allowsEditing = YES;
	
	// We need to display this in a popover on iPad
	if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
	{
		Class popoverClass = NSClassFromString( @"UIPopoverController" );
		if( !popoverClass )
			return;
        
		_popoverViewController = [[popoverClass alloc] initWithContentViewController:picker];
		[_popoverViewController setDelegate:self];
		//picker.modalInPopover = YES;
		
		// Display the popover
		[_popoverViewController presentPopoverFromRect:CGRectMake( 0, 0, 128, 128 )
												inView:UnityGetGLViewController().view
							  permittedArrowDirections:UIPopoverArrowDirectionAny
											  animated:YES];
	}
	else
	{
		// wrap and show the modal
        UIViewController *vc = UnityGetGLViewController();
		[vc presentModalViewController:picker animated:YES];
	}
}
- (void)popoverControllerDidDismissPopover:(UIPopoverController*)popoverController
{
	self.popoverViewController = nil;
	//UnityPause( false );
	
	//UnitySendMessage( "EtceteraManager", "imagePickerDidCancel", "" );
}
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
	// Grab the image and write it to disk
	UIImage *image;
	UIImage *image2;
    //	if( _pickerAllowsEditing )
    image = [info objectForKey:UIImagePickerControllerEditedImage];
    //        else
    //            image = [info objectForKey:UIImagePickerControllerOriginalImage];
    
    //NSLog( @"picker got image with orientation: %i", image.imageOrientation );
    UIGraphicsBeginImageContext(CGSizeMake(128,128));
    [image drawInRect:CGRectMake(0, 0, 128, 128)];
    image2 = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    // 得到了image,然后用你的函数传回u3d
    NSData *imgData;
    if(UIImagePNGRepresentation(image2) == nil)
    {
         imgData= UIImageJPEGRepresentation(image2, 0.5);
    }
    else
    {
         imgData= UIImageJPEGRepresentation(image2, 0.5);
    }
    
    NSString *_encodeImageStr = [imgData base64Encoding];
    
    UnitySendMessage( "UnityIOSBridge", "PhotoCallBack", _encodeImageStr.UTF8String);
	// Dimiss the pickerController
	[self dismissWrappedController];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
	// dismiss the wrapper, unpause and notifiy Unity what happened
	[self dismissWrappedController];
	//UnityPause( false );
	//UnitySendMessage( "EtceteraManager", "imagePickerDidCancel", "" );
}
- (void)dismissWrappedController
{
	//UnityPause( false );
    
	UIViewController *vc = UnityGetGLViewController();
	
	// No view controller? Get out of here.
	if( !vc )
		return;
	
	// dismiss the view controller
	[vc dismissModalViewControllerAnimated:YES];
    
	// remove the wrapper view controller
	[self performSelector:@selector(removeAndReleaseViewControllerWrapper) withObject:nil afterDelay:1.0];
	
	//UnitySendMessage( "EtceteraManager", "dismissingViewController", "" );
}
- (void)removeAndReleaseViewControllerWrapper
{
	// iPad might have a popover
	if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && _popoverViewController )
	{
		[_popoverViewController dismissPopoverAnimated:YES];
		self.popoverViewController = nil;
	}
}
@end
extern "C"
{
    void openPhoto()//相册
    {
        //UnityPause( true );
        OpenPhotoController * app = [[OpenPhotoController alloc] init];
        // No need to give a choice for devices with no camera
        if( ![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] )
        {
            [app showPicker:UIImagePickerControllerSourceTypeSavedPhotosAlbum];
            return;
        }
        [app showActionSheet];
        
    }
    
}
直接把这俩文件放在Plugins的iOS目录下,或者打包出Xcode工程后再导入这俩文件也可以,推荐第一种,做版本控制的时候比较方便
[DllImport("__Internal")]
private static extern void openPhoto();
 public void OpenPhoto(string vName) 
 {
        #if UNITY_IPHONE
            openPhoto();
        #endif
 }  
注:
imgData= UIImageJPEGRepresentation(image2, 0.5);是压缩文件 0.5是压缩质量
上传本地图片部分搞定!
标签:
原文地址:http://blog.csdn.net/u014261855/article/details/51351334