IOS研究院之打开照相机与本地相册选择图片(六)

来源:互联网 发布:淘宝店铺掌柜名怎么改 编辑:程序博客网 时间:2024/05/16 17:06

原创文章如需转载请注明:转载自雨松MOMO程序研究院本文链接地址:IOS研究院之打开照相机与本地相册选择图片(六)

Hello 大家好 IOS的文章好久都木有更新了,今天更新一篇哈。 这篇文章主要学习如何在IOS程序中打开照相机与本地相册并且选择一张图片。还是老样子MOMO写了一个简单的测试程序,如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样。最终点击发送将按钮将图片2进制图片上传服务器。

 

 

下面我们仔细学习具体的细节。创建一个空的IOS项目,接着在创建一个ViewController。

AppDelegate.h 应用的代理类 这个没什么好说的就是直接打开刚刚创建的新ViewController。

#import <UIKit/UIKit.h>#import "TestViewController.h"@interface AppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;@property (strong, nonatomic) UINavigationController *navController;@property (strong, nonatomic) UIViewController *viewController;@end

 

AppDelegate.m 在这里就是打开我们创建的TestViewController

#import "AppDelegate.h"@implementation AppDelegate@synthesize window = _window;@synthesize navController;@synthesize viewController;- (void)dealloc{    [_window release];    [super dealloc];}- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];    self.window.backgroundColor = [UIColor whiteColor];    self.viewController =  [[TestViewController alloc]init];    self.navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];    [self.window addSubview:navController.view];    [self.window makeKeyAndVisible];    return YES;}@end

 

TestViewController.h 注意这里面引入了很多代理类。

#import <UIKit/UIKit.h>@interface TestViewController : UIViewController<UITextViewDelegate,UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>{    //输入框    UITextView *_textEditor;    //下拉菜单    UIActionSheet *myActionSheet;    //图片2进制路径    NSString* filePath;}@end

 

TestViewController.m 请大家仔细看这个类, 所有的东西都写在了这里哈。

#import "TestViewController.h"@interface TestViewController ()@end@implementation TestViewController- (void)viewDidLoad{    [super viewDidLoad];    //导航栏标题self.navigationItem.title = @"雨松MOMO输入框";    //导航栏按钮    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]                                               initWithTitle: @"发送"                                               style: UIBarButtonItemStyleDone                                               target: self                                               action: @selector(sendInfo)] autorelease];    //输入框显示区域    _textEditor = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];    //设置它的代理    _textEditor.delegate = self;    _textEditor.autoresizingMask = UIViewAutoresizingFlexibleWidth;    _textEditor.keyboardType = UIKeyboardTypeDefault;    _textEditor.font = [UIFont systemFontOfSize:20];    _textEditor.text = @"请输入内容";    //默认软键盘是在触摸区域后才会打开    //这里表示进入当前ViewController直接打开软键盘    [_textEditor becomeFirstResponder];    //把输入框加在视图中    [self.view addSubview:_textEditor];    //下方的图片按钮 点击后呼出菜单 打开摄像机 查找本地相册    UIImage *image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"camera" ofType:@"png"]];    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];    button.frame = CGRectMake(0, 120, image.size.width, image.size.height);    [button setImage:image forState:UIControlStateNormal];    [button addTarget:self action:@selector(openMenu) forControlEvents:UIControlEventTouchUpInside];    //把它也加在视图当中    [self.view addSubview:button];}-(void)openMenu{    //在这里呼出下方菜单按钮项    myActionSheet = [[UIActionSheet alloc]                 initWithTitle:nil                 delegate:self                 cancelButtonTitle:@"取消"                 destructiveButtonTitle:nil                 otherButtonTitles: @"打开照相机", @"从手机相册获取",nil];      [myActionSheet showInView:self.view];    [myActionSheet release];    }- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{     //呼出的菜单按钮点击后的响应    if (buttonIndex == myActionSheet.cancelButtonIndex)    {        NSLog(@"取消");    }    switch (buttonIndex)    {        case 0:  //打开照相机拍照            [self takePhoto];            break;         case 1:  //打开本地相册            [self LocalPhoto];            break;    }}//开始拍照-(void)takePhoto{    UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;    if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])    {        UIImagePickerController *picker = [[UIImagePickerController alloc] init];        picker.delegate = self;        //设置拍照后的图片可被编辑        picker.allowsEditing = YES;        picker.sourceType = sourceType;        [picker release];        [self presentModalViewController:picker animated:YES];    }else    {        NSLog(@"模拟其中无法打开照相机,请在真机中使用");    }}//打开本地相册-(void)LocalPhoto{    UIImagePickerController *picker = [[UIImagePickerController alloc] init];    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;    picker.delegate = self;    //设置选择后的图片可被编辑    picker.allowsEditing = YES;    [self presentModalViewController:picker animated:YES];    [picker release];}//当选择一张图片后进入这里-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{    NSString *type = [info objectForKey:UIImagePickerControllerMediaType];    //当选择的类型是图片    if ([type isEqualToString:@"public.image"])    {        //先把图片转成NSData        UIImage* image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];        NSData *data;        if (UIImagePNGRepresentation(image) == nil)        {            data = UIImageJPEGRepresentation(image, 1.0);        }        else        {            data = UIImagePNGRepresentation(image);        }        //图片保存的路径        //这里将图片放在沙盒的documents文件夹中        NSString * DocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];          //文件管理器        NSFileManager *fileManager = [NSFileManager defaultManager];        //把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png        [fileManager createDirectoryAtPath:DocumentsPath withIntermediateDirectories:YES attributes:nil error:nil];        [fileManager createFileAtPath:[DocumentsPath stringByAppendingString:@"/image.png"] contents:data attributes:nil];        //得到选择后沙盒中图片的完整路径        filePath = [[NSString alloc]initWithFormat:@"%@%@",DocumentsPath,  @"/image.png"];        //关闭相册界面        [picker dismissModalViewControllerAnimated:YES];        //创建一个选择后图片的小图标放在下方        //类似微薄选择图后的效果        UIImageView *smallimage = [[[UIImageView alloc] initWithFrame:                                   CGRectMake(50, 120, 40, 40)] autorelease];            smallimage.image = image;        //加在视图中        [self.view addSubview:smallimage];    } }- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{    NSLog(@"您取消了选择图片");    [picker dismissModalViewControllerAnimated:YES];}-(void)sendInfo{    NSLog(@"图片的路径是:%@", filePath);    NSLog(@"您输入框中的内容是:%@", _textEditor.text);}- (void)viewDidUnload{    [super viewDidUnload];    // Release any retained subviews of the main view.}- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{    return (interfaceOrientation == UIInterfaceOrientationPortrait);}@end

 

如下图所示,打开下拉菜单按钮开始选择打开相机 或者 打开本地相册。模拟器中是无法打开照相机的的,切记。

 

如下图所示,这里就是我本地的相册啦,里面保存了几张图片,选择一张即可。

 

 

 

我在这里再说说图片上传, 图片上传我们采用的是2进制ASIHTTPRequest 来完成的。

发送请求

 

    NSString *server_base = [NSString stringWithFormat:@"%@/users/uploadResource.json", _server];    ASINetworkQueue *queue = [[ASINetworkQueue alloc] init];      ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:server_base]];    [ASIHTTPRequest setShouldUpdateNetworkActivityIndicator: NO];    [request setDelegate :self];    [request setDidFinishSelector:@selector(sendCommentSucc:)];    [request setDidFailSelector:@selector(sendCommentFail:)];    // res 就是 需要上传图片文件的路径    [request setFile:res forKey:@"res"];    [queue addOperation:request];    [queue go];

 

最后是文本的源码,雨松MOMO祝大家学习愉快,不早了,我也得睡觉啦,1点多了。。。

下载地址:http://vdisk.weibo.com/s/accm9

原创粉丝点击