这个示例程序主要用到了IOS中的UIImageView、UIImagePickerViewController、UIImage、NSFileManager等知识,结合这些知识构成一个小的应用程序,主要功能是对相册图片进行读取、存储到指定文件夹、从指定文件夹读取出来。这方面的知识在正式项目中用的是比较多的。做Android开发中,经常会使用到将图片保存到SD卡和从SD卡读取图片的操作,相比于Android在这方面的操作,IOS要方便许多。
基本功能是从相册选取一张图片,选完后显示在界面的UIImageView控件中,点击保存到文件夹按钮后就将图片保存到Documents下的ImageFile文件夹中,以image.png命名。退出程序下次进来时,可以选择从文件夹读取图片,如果有则读取出来显示在UIImageView上,如果没有则提示文件不存在。
首先来看看最后效果:
·从相册选取图片后显示在界面上
这里对功能进行了一点改进,点击打开相册按钮后出来一个UIActionSheet操作选项框,可以选择是从相机获取图片还是从相册获取。代码也做出了一点修改。
·点击保存到文件夹按钮后提示信息
·点击读取图片按钮后的提示信息(图片不存在)
·如果存在则将图片显示出来
保存图片成功后,按照前一篇文章提到的方法,可以到Finder下查看文件信息:
下面是实现部分,首先看看布局文件:
下面是代码:
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIActionSheetDelegate> @property (retain, nonatomic) IBOutlet UIImageView *imageView; @property (retain, nonatomic) UIButton *saveToFileButton; //打开相册 - (IBAction)openAlbum:(id)sender; //从文件夹读取图片 - (IBAction)readImage:(id)sender; @end
下面是ViewController.m文件
#import "ViewController.h" //保存到文件夹按钮的标签,选取图片前,这个按钮是隐藏的 #define SAVE_BUTTON_TAG 101 @interface ViewController () @end @implementation ViewController @synthesize imageView = _imageView; @synthesize saveToFileButton = _saveToFileButton; - (void)viewDidLoad { [super viewDidLoad]; //根据设置的tag获取按钮控件 self.saveToFileButton = (UIButton *)[self.view viewWithTag:SAVE_BUTTON_TAG]; //添加对象事件 [self.saveToFileButton addTarget:self action:@selector(saveToFileBtnTapped:) forControlEvents:UIControlEventTouchUpInside]; //设置为不可见 self.saveToFileButton.hidden = YES; } - (void)viewDidUnload { [self setImageView:nil]; [self setSaveToFileButton:nil]; [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } - (void)dealloc { [self.imageView release]; [self.saveToFileButton release]; [super dealloc]; } - (IBAction)openAlbum:(id)sender { UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"选择图片" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照",@"相册", nil]; [actionSheet showInView:self.view]; [actionSheet release]; } //从文件夹读取图片 - (IBAction)readImage:(id)sender { NSString *imagePath = [self imageSavedPath:@"image.png"]; NSFileManager *fileManager = [NSFileManager defaultManager]; //判断文件是否存在 if (![fileManager fileExistsAtPath:imagePath]) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Note" message:@"文件不存在" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alertView show]; [alertView release]; }else { //从指定目录读取图片 UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; self.imageView.image = image; } } //保存到文件按钮事件 - (void)saveToFileBtnTapped:(id)sender { NSString *imagePath = [self imageSavedPath:@"image.png"]; BOOL isSaveSuccess = [self saveToDocument:self.imageView.image withFilePath:imagePath]; if (isSaveSuccess) { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"操作结果" message:@"保存图片成功" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alertView show]; [alertView release]; }else { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"操作结果" message:@"保存图片失败" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alertView show]; [alertView release]; } } //将选取的图片保存到目录文件夹下 -(BOOL)saveToDocument:(UIImage *) image withFilePath:(NSString *) filePath { if ((image == nil) || (filePath == nil) || [filePath isEqualToString:@""]) { return NO; } @try { NSData *imageData = nil; //获取文件扩展名 NSString *extention = [filePath pathExtension]; if ([extention isEqualToString:@"png"]) { //返回PNG格式的图片数据 imageData = UIImagePNGRepresentation(image); }else{ //返回JPG格式的图片数据,第二个参数为压缩质量:0:best 1:lost imageData = UIImageJPEGRepresentation(image, 0); } if (imageData == nil || [imageData length] <= 0) { return NO; } //将图片写入指定路径 [imageData writeToFile:filePath atomically:YES]; return YES; } @catch (NSException *exception) { NSLog(@"保存图片失败"); } return NO; } //根据图片名将图片保存到ImageFile文件夹中 -(NSString *)imageSavedPath:(NSString *) imageName { //获取Documents文件夹目录 NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath = [path objectAtIndex:0]; //获取文件管理器 NSFileManager *fileManager = [NSFileManager defaultManager]; //指定新建文件夹路径 NSString *imageDocPath = [documentPath stringByAppendingPathComponent:@"ImageFile"]; //创建ImageFile文件夹 [fileManager createDirectoryAtPath:imageDocPath withIntermediateDirectories:YES attributes:nil error:nil]; //返回保存图片的路径(图片保存在ImageFile文件夹下) NSString * imagePath = [imageDocPath stringByAppendingPathComponent:imageName]; return imagePath; } #pragma Delegate method UIImagePickerControllerDelegate //图像选取器的委托方法,选完图片后回调该方法 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo { if (image != nil) { //选定照片后在界面显示照片并把保存按钮设为可见 self.imageView.image = image; self.saveToFileButton.hidden = NO; } //关闭图像选择器 [self dismissModalViewControllerAnimated:YES]; } -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { //获取图片选取器 UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; //指定代理 imagePicker.delegate = self; //打开图片后允许编辑 imagePicker.allowsEditing = YES; //判断图片源的类型 if (buttonIndex == 0) { if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { //相机 imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; } }else if (buttonIndex == 1) { if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){ //图片库 imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; } // if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) { // //相册 // imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; // } }else if (buttonIndex == [actionSheet cancelButtonIndex]) { return; } //打开图片选择模态视图 [self presentModalViewController:imagePicker animated:YES]; [imagePicker release]; } @end
加入我们的QQ群或微信公众账号请查看: Ryan's zone公众账号及QQ群
欢迎关注我的新浪微博和我交流:@唐韧_Ryan