打开照相机与本地相册选择图片

来源:互联网 发布:数控车床攻丝 编程 编辑:程序博客网 时间:2024/04/30 04:30

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

如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样。最终点击发送将按钮将图片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 来完成的。

发送请求

 

01NSString *server_base = [NSString stringWithFormat:@"%@/users/uploadResource.json", _server];
02 
03ASINetworkQueue *queue = [[ASINetworkQueue alloc] init]; 
04 
05ASIFormDataRequest *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

0 0
原创粉丝点击