提到從攝像頭/相冊獲取圖片是面向終端用戶的,由用戶去瀏覽并選擇圖片為程序使用。在這里,我們需要過UIImagePickerController類來和用戶交互。
使用UIImagePickerController和用戶交互,我們需要實現(xiàn)2個協(xié)議。
View Code
代碼如下復制代碼
#pragma mark從用戶相冊獲取活動圖片
- (void)pickImageFromAlbum
{
imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate =self;
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
imagePicker.allowsEditing =YES;
[selfpresentModalViewController:imagePicker animated:YES];
}
我們來看看上面的從相冊獲取圖片,我們首先要實例化UIImagePickerController對象,然后設置imagePicker對象為當前對象,設置imagePicker的圖片來源為UIImagePickerControllerSourceTypePhotoLibrary,表明當前圖片的來源為相冊,除此之外還可以設置用戶對圖片是否可編輯。
View Code
代碼如下復制代碼
#pragma mark從攝像頭獲取活動圖片
- (void)pickImageFromCamera
{
imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate =self;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
imagePicker.allowsEditing =YES;
[selfpresentModalViewController:imagePicker animated:YES];
}
//打開相機
- (IBAction)touch_photo:(id)sender {
// for iphone
UIImagePickerController *pickerImage = [[UIImagePickerController alloc] init];
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
pickerImage.sourceType = UIImagePickerControllerSourceTypeCamera;
pickerImage.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:pickerImage.sourceType];
}
pickerImage.delegate =self;
pickerImage.allowsEditing =YES;//自定義照片樣式
[selfpresentViewController:pickerImage animated:YEScompletion:nil];
}
以上是從攝像頭獲取圖片,和從相冊獲取圖片只是圖片來源的設置不一樣,攝像頭圖片的來源為UIImagePickerControllerSourceTypeCamera。
在和用戶交互之后,用戶選擇好圖片后,會回調選擇結束的方法。
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
//初始化imageNew為從相機中獲得的--
UIImage *imageNew = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
//設置image的尺寸
CGSize imagesize = imageNew.size;
imagesize.height =626;
imagesize.width =413;
//對圖片大小進行壓縮--
imageNew = [selfimageWithImage:imageNew scaledToSize:imagesize];
NSData *imageData = UIImageJPEGRepresentation(imageNew,0.00001);
if(m_selectImage==nil)
{
m_selectImage = [UIImage imageWithData:imageData];
NSLog(@"m_selectImage:%@",m_selectImage);
[self.TakePhotoBtn setImage:m_selectImage forState:UIControlStateNormal];
[picker dismissModalViewControllerAnimated:YES];
return;
}
[picker release];
}
//對圖片尺寸進行壓縮--
-(UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize
{
// Create a graphics image context
UIGraphicsBeginImageContext(newSize);
// Tell the old image to draw in this new context, with the desired
// new size
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
// Get the new image from the context
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
// End the context
UIGraphicsEndImageContext();
// Return the new image.
returnnewImage;
}
圖片保存到本地document里面--以及圖片格式的轉換
IOS開發(fā)之保存圖片到Documents目錄及PNG,JPEG格式相互轉換
-?(void)imagePickerController:(UIImagePickerController?*)picker?didFinishPickingMediaWithInfo:(NSDictionary*)info?{
NSString?*mediaType?=?[info?objectForKey:UIImagePickerControllerMediaType];
if?([mediaType?isEqualToString:@"public.image"]){
image?=?[info?objectForKey:@"UIImagePickerControllerOriginalImage"];
NSData?*data;
if?(UIImagePNGRepresentation(image)?==?nil)?{
data?=?UIImageJPEGRepresentation(image,?1);
}?else?{
data?=?UIImagePNGRepresentation(image);
}
NSFileManager?*fileManager?=?[NSFileManager?defaultManager];
NSString?*filePath?=?[NSString?stringWithString:[self?getPath:@"image1"]];?????????//將圖片存儲到本地documents
[fileManager?createDirectoryAtPath:filePath?withIntermediateDirectories:YES?attributes:nil?error:nil];
[fileManager?createFileAtPath:[filePath?stringByAppendingString:@"/image.png"]?contents:dataattributes:nil];
UIImage?*editedImage?=?[[UIImage?alloc]?init];
editedImage?=?image;
CGRect?rect?=?CGRectMake(0,?0,?64,?96);
UIGraphicsBeginImageContext(rect.size);
[editedImage?drawInRect:rect];
editedImage?=?UIGraphicsGetImageFromCurrentImageContext();
UIButton?*imageButton?=?[UIButton?buttonWithType:UIButtonTypeCustom];
imageButton.frame?=?CGRectMake(10,?10,?64,?96);
[imageButton?setImage:editedImage?forState:UIControlStateNormal];
[self.view?addSubview:imageButton];
[imageButton?addTarget:self?action:@selector(imageAction:)forControlEvents:UIControlEventTouchUpInside];
[ipc?dismissModalViewControllerAnimated:YES];
}?else?{
NSLog(@"MEdia");
}
上面的代碼是當從相冊里面選取圖片之后保存到本地程序沙盒,在上面我們得到的圖片中不能夠得到圖片名字,
以及不清楚圖片格式,所以這個時候我們需要將其轉換成NSdata二進制存儲,
image?=?[info?objectForKey:@"UIImagePickerControllerOriginalImage"];
NSData?*data;
if?(UIImagePNGRepresentation(image)?==?nil)?{
data?=?UIImageJPEGRepresentation(image,?1);
}?else?{
data?=?UIImagePNGRepresentation(image);
}
UIImagePNGRepresentation轉換PNG格式的圖片為二進制,如果圖片的格式為JPEG則返回nil;
[fileManager?createFileAtPath:[filePath?stringByAppendingString:@"/image.png"]?contents:data?attributes:nil];????將圖片保存為PNG格式
[fileManager?createFileAtPath:[filePath?stringByAppendingString:@"/image.jpg"]?contents:data?attributes:nil];???將圖片保存為JPEG格式
我們也可以寫成下面的格式存儲圖片
NSString?*pngImage?=?[filePath?stringByAppendingPathComponent:@"Documents/image.png"];
NSString?*jpgImage?=?[filePath?stringByAppendingPathComponent:@"Documents/image.jpg"];
[data?writeToFile:pngImage?atomically:YES];
[data?writeToFile:jpgImage?atomically:YES];