iOS-打开照相机&打开本地相册&图片上传

ResourceFrom:http://www.xuanyusong.com/archives/1493

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.rootViewController = navController;
    
    [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; 
        [self presentModalViewController:picker animated:YES];
        [picker release];
    }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];
}

- (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];
文本源码下载地址:http://download.csdn.net/detail/wuming22222/7894859
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值