iOS圖片上傳及處理
從網路攝影機或者是從相簿中讀取圖片,需要通過UIImagePickerController類來實現,在使用UIImagePickerController時,需要是實現下面兩個協議
1、從相簿中讀取圖片
首先要執行個體化UIImagePickerController對象imagePicker,設定imagePicker的圖片來源為UIImagePickerControllerSourceTypePhotoLibrary,表明當前圖片的來源為使用者的相簿。以及設定圖片是否可被編輯allowsEditing。
#pragma mark - 從使用者相簿擷取圖片- (void)pickImageFromAlbum{ imagePicker = [[UIImagePickerController alloc] init]; imagePicker.delegate =self; imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical; imagePicker.allowsEditing =YES; [self presentModalViewController:imagePicker animated:YES];}
2、從相簿中讀取圖片
#pragma mark - 從網路攝影機擷取圖片- (void)pickImageFromCamera{ imagePicker = [[UIImagePickerController alloc] init]; imagePicker.delegate =self; imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical; imagePicker.allowsEditing =YES; [self presentModalViewController: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;//自訂照片樣式 [self presentViewController:pickerImage animated:YES completion:nil];}
在使用者現則好圖片後,會回調選擇結束的方法
-(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 = [self imageWithImage:imageNew scaledToSize:imageSize]; NSData *imageData = UIImageJPEGRepresentation(imageNew,0.00001); if(m_selectImage==nil) { m_selectImage = [UIImage imageWithData:imageData]; NSLog(@m_selectImage:%@,m_selectImage); [self.takePhotoButton setImage:m_selectImage forState:UIControlStateNormal]; [picker dismissModalViewControllerAnimated:YES]; return ; }}
對圖片進行壓縮
-(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. return newImage;}
將圖片儲存到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]; [self dismissModalViewControllerAnimated:YES]; } else { NSLog(@Media); }
在上面的方法中不能得到圖片的名稱及格式,所以需要將其轉換成NSData二進位儲存
image = [info objectForKey:@UIImagePickerControllerOriginalImage];NSData *data; if (UIImagePNGRepresentation(image) == nil) { data = UIImageJPEGRepresentation(image, 1); } else { data = UIImagePNGRepresentation(image); }
[fileManager createFileAtPath:[filePath stringByAppendingString:@/image.png] contents:data attributes:nil]; //將圖片儲存為PNG格式 [fileManager createFileAtPath:[filePath stringByAppendingString:@/image.jpg] contents:data attributes:nil]; //將圖片儲存為JPEG格式