zoukankan      html  css  js  c++  java
  • IOS研究院之打开照相机与本地相册选择图片

    如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样。最终点击发送将按钮将图片2进制图片上传服务器。

     

     

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

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

    1 #import <UIKit/UIKit.h>
    2 #import "TestViewController.h"
    3  
    4 @interface AppDelegate : UIResponder <UIApplicationDelegate>
    5  
    6 @property (strong, nonatomic) UIWindow *window;
    7 @property (strong, nonatomic) UINavigationController *navController;
    8 @property (strong, nonatomic) UIViewController *viewController;
    9 @end

     

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

    01 #import "AppDelegate.h"
    02  
    03 @implementation AppDelegate
    04  
    05 @synthesize window = _window;
    06 @synthesize navController;
    07 @synthesize viewController;
    08  
    09 - (void)dealloc
    10 {
    11     [_window release];
    12     [super dealloc];
    13 }
    14  
    15 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    16 {
    17     self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    18  
    19     self.window.backgroundColor = [UIColor whiteColor];
    20     self.viewController =  [[TestViewController alloc]init];
    21     self.navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
    22     [self.window addSubview:navController.view];
    23  
    24     [self.window makeKeyAndVisible];
    25     return YES;
    26 }
    27  
    28 @end

     

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

    01 #import <UIKit/UIKit.h>
    02  
    03 @interface TestViewController : UIViewController<UITextViewDelegate,UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
    04 {
    05     //输入框
    06     UITextView *_textEditor;
    07  
    08     //下拉菜单
    09     UIActionSheet *myActionSheet;
    10  
    11     //图片2进制路径
    12     NSString* filePath;
    13 }
    14 @end

     

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

    001 #import "TestViewController.h"
    002  
    003 @interface TestViewController ()
    004  
    005 @end
    006  
    007 @implementation TestViewController
    008  
    009 - (void)viewDidLoad
    010 {
    011     [super viewDidLoad];
    012     //导航栏标题
    013     self.navigationItem.title = @"雨松MOMO输入框";
    014  
    015     //导航栏按钮
    016     self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]
    017                                                initWithTitle: @"发送"
    018                                                style: UIBarButtonItemStyleDone
    019                                                target: self
    020                                                action: @selector(sendInfo)] autorelease];
    021  
    022     //输入框显示区域
    023     _textEditor = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
    024     //设置它的代理
    025     _textEditor.delegate = self;
    026     _textEditor.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    027     _textEditor.keyboardType = UIKeyboardTypeDefault;
    028     _textEditor.font = [UIFont systemFontOfSize:20];
    029     _textEditor.text = @"请输入内容";
    030  
    031     //默认软键盘是在触摸区域后才会打开
    032     //这里表示进入当前ViewController直接打开软键盘
    033     [_textEditor becomeFirstResponder];
    034  
    035     //把输入框加在视图中
    036     [self.view addSubview:_textEditor];
    037  
    038     //下方的图片按钮 点击后呼出菜单 打开摄像机 查找本地相册
    039     UIImage *image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"camera" ofType:@"png"]];
    040  
    041     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    042     button.frame = CGRectMake(0, 120, image.size.width, image.size.height);
    043  
    044     [button setImage:image forState:UIControlStateNormal];
    045  
    046     [button addTarget:self action:@selector(openMenu) forControlEvents:UIControlEventTouchUpInside];
    047  
    048     //把它也加在视图当中
    049     [self.view addSubview:button];
    050  
    051 }
    052  
    053 -(void)openMenu
    054 {
    055     //在这里呼出下方菜单按钮项
    056     myActionSheet = [[UIActionSheet alloc]
    057                  initWithTitle:nil
    058                  delegate:self
    059                  cancelButtonTitle:@"取消"
    060                  destructiveButtonTitle:nil
    061                  otherButtonTitles: @"打开照相机", @"从手机相册获取",nil]; 
    062  
    063     [myActionSheet showInView:self.view];
    064     [myActionSheet release];   
    065  
    066 }
    067  
    068 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
    069 {
    070  
    071     //呼出的菜单按钮点击后的响应
    072     if (buttonIndex == myActionSheet.cancelButtonIndex)
    073     {
    074         NSLog(@"取消");
    075     }
    076  
    077     switch (buttonIndex)
    078     {
    079         case 0:  //打开照相机拍照
    080             [self takePhoto];
    081             break;
    082  
    083         case 1:  //打开本地相册
    084             [self LocalPhoto];
    085             break;
    086     }
    087 }
    088  
    089 //开始拍照
    090 -(void)takePhoto
    091 {
    092     UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;
    093     if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])
    094     {
    095         UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    096         picker.delegate = self;
    097         //设置拍照后的图片可被编辑
    098         picker.allowsEditing = YES;
    099         picker.sourceType = sourceType;
    100         [picker release];
    101         [self presentModalViewController:picker animated:YES];
    102     }else
    103     {
    104         NSLog(@"模拟其中无法打开照相机,请在真机中使用");
    105     }
    106 }
    107  
    108 //打开本地相册
    109 -(void)LocalPhoto
    110 {
    111     UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    112  
    113     picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    114     picker.delegate = self;
    115     //设置选择后的图片可被编辑
    116     picker.allowsEditing = YES;
    117     [self presentModalViewController:picker animated:YES];
    118     [picker release];
    119 }
    120  
    121 //当选择一张图片后进入这里
    122 -(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    123  
    124 {
    125  
    126     NSString *type = [info objectForKey:UIImagePickerControllerMediaType];
    127  
    128     //当选择的类型是图片
    129     if ([type isEqualToString:@"public.image"])
    130     {
    131         //先把图片转成NSData
    132         UIImage* image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    133         NSData *data;
    134         if (UIImagePNGRepresentation(image) == nil)
    135         {
    136             data = UIImageJPEGRepresentation(image, 1.0);
    137         }
    138         else
    139         {
    140             data = UIImagePNGRepresentation(image);
    141         }
    142  
    143         //图片保存的路径
    144         //这里将图片放在沙盒的documents文件夹中
    145         NSString * DocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 
    146  
    147         //文件管理器
    148         NSFileManager *fileManager = [NSFileManager defaultManager];
    149  
    150         //把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png
    151         [fileManager createDirectoryAtPath:DocumentsPath withIntermediateDirectories:YES attributes:nil error:nil];
    152         [fileManager createFileAtPath:[DocumentsPath stringByAppendingString:@"/image.png"] contents:data attributes:nil];
    153  
    154         //得到选择后沙盒中图片的完整路径
    155         filePath = [[NSString alloc]initWithFormat:@"%@%@",DocumentsPath,  @"/image.png"];
    156  
    157         //关闭相册界面
    158         [picker dismissModalViewControllerAnimated:YES];
    159  
    160         //创建一个选择后图片的小图标放在下方
    161         //类似微薄选择图后的效果
    162         UIImageView *smallimage = [[[UIImageView alloc] initWithFrame:
    163                                    CGRectMake(50, 120, 40, 40)] autorelease];   
    164  
    165         smallimage.image = image;
    166         //加在视图中
    167         [self.view addSubview:smallimage];
    168  
    169     }
    170  
    171 }
    172  
    173 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
    174 {
    175     NSLog(@"您取消了选择图片");
    176     [picker dismissModalViewControllerAnimated:YES];
    177 }
    178  
    179 -(void)sendInfo
    180 {
    181     NSLog(@"图片的路径是:%@", filePath);
    182  
    183     NSLog(@"您输入框中的内容是:%@", _textEditor.text);
    184 }
    185  
    186 - (void)viewDidUnload
    187 {
    188     [super viewDidUnload];
    189     // Release any retained subviews of the main view.
    190 }
    191  
    192 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    193 {
    194     return (interfaceOrientation == UIInterfaceOrientationPortrait);
    195 }
    196  
    197 @end

     

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

     

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

     

     

     

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

    发送请求

     

    01 NSString *server_base = [NSString stringWithFormat:@"%@/users/uploadResource.json", _server];
    02  
    03 ASINetworkQueue *queue = [[ASINetworkQueue alloc] init]; 
    04  
    05 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:server_base]];
    06  
    07 [ASIHTTPRequest setShouldUpdateNetworkActivityIndicator: NO];
    08 [request setDelegate :self];
    09 [request setDidFinishSelector:@selector(sendCommentSucc:)];
    10 [request setDidFailSelector:@selector(sendCommentFail:)];
    11 // res 就是 需要上传图片文件的路径
    12 [request setFile:res forKey:@"res"];
    13  
    14 [queue addOperation:request];
    15 [queue go];

     

    最后是文本的源码下载地址:http://vdisk.weibo.com/s/accm9

    原文:http://blog.csdn.net/l_ch_g/article/details/11738129

    相关:

    ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结

    http://www.cnblogs.com/skyblue/archive/2013/05/08/3067108.html

  • 相关阅读:
    View Programming Guide for iOS ---- iOS 视图编程指南(四)---Views
    Java设计模式---原型模式(Prototype)
    Java设计模式----建造者模式(Builder)
    Java设计模式----单例模式(Singleton)
    Java设计模式---工厂方法模式(Factory-Method)
    Hibernate之基于外键映射的一对一(1-1)关联关系
    Hibernate关联关系之双向1—n
    修改Map中确定key对应的value问题
    Hibernate关联关系之——单向n-1
    Hibernate之Session对象的相关方法以及持久化对象的状态
  • 原文地址:https://www.cnblogs.com/langtianya/p/4004751.html
Copyright © 2011-2022 走看看