1:首先几个必须得返回值
//相机是否可用
- (BOOL) isCameraAvailable{
return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
}
//后置相机是否可用
- (BOOL) isRearCameraAvailable{
return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];
}
//前置相机是否可用
- (BOOL) isFrontCameraAvailable {
return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];
}
//是否支持相册
- (BOOL) isPhotoLibraryAvailable{
return [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary];
}
//是否支持相机
- (BOOL) doesCameraSupportTakingPhotos {
return [self cameraSupportsMedia:(__bridge NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypeCamera];
}
//相册获取视频
- (BOOL) canUserPickVideosFromPhotoLibrary{
return [self
cameraSupportsMedia:(__bridge NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypePhotoLibrary];
}
//相册获取图片
- (BOOL) canUserPickPhotosFromPhotoLibrary{
return [self
cameraSupportsMedia:(__bridge NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypePhotoLibrary];
}
//返回所需要的媒体类型是否被支持
- (BOOL) cameraSupportsMedia:(NSString *)paramMediaType sourceType:(UIImagePickerControllerSourceType)paramSourceType{
__block BOOL result = NO;
if ([paramMediaType length] == 0) {
return NO;
}
//获得相机模式下支持的媒体类型
NSArray *availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:paramSourceType];
//如果支持的媒体类型中有需要就返回YES
[availableMediaTypes enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
NSString *mediaType = (NSString *)obj;
if ([mediaType isEqualToString:paramMediaType]){
result = YES;
*stop= YES;
}
}];
return result;
}
注释 : 检查媒体来源调用UIImagePickerController类的静态方isSourceTypeAvailable来检查
sourceType是一个UIImagePickerControllerSourceType类型的枚举值,它表示图像选取控制器的3种不同的媒体来源模式:
1>: UIImagePickerControllerSourceTypePhotoLibrary:照片库模式。图像选取控制器以该模式显示时会浏览系统照片库的根目录。
2>: UIImagePickerControllerSourceTypeCamera:相机模式,图像选取控制器以该模式显示时可以进行拍照或摄像。
3>: UIImagePickerControllerSourceTypeSavedPhotosAlbum:相机胶卷模式,图像选取控制器以该模式显示时会浏览相机胶卷目录。
2 : 使用相机拍图
// 拍照
if ([self isCameraAvailable] && [self doesCameraSupportTakingPhotos]) {
UIImagePickerController *controller = [[UIImagePickerController alloc] init];
controller.sourceType = UIImagePickerControllerSourceTypeCamera;
if ([self isFrontCameraAvailable]) {
controller.cameraDevice = UIImagePickerControllerCameraDeviceFront;
}
NSMutableArray *mediaTypes = [[NSMutableArray alloc] init];
[mediaTypes addObject:(__bridge NSString *)kUTTypeImage];
controller.mediaTypes = mediaTypes;
controller.delegate = self;
[self presentViewController:controller
animated:YES
completion:^(void){
NSLog(@"Picker View Controller is presented");
}];
}else{
Show_AlterView(NSLocalizedString(@"不支持相机", nil));
}
3 : 相册选取
if ([self isPhotoLibraryAvailable]) {
UIImagePickerController *controller = [[UIImagePickerController alloc] init];
controller.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
NSMutableArray *mediaTypes = [[NSMutableArray alloc] init];
[mediaTypes addObject:(__bridge NSString *)kUTTypeImage];
controller.mediaTypes = mediaTypes;
controller.delegate = self;
[self presentViewController:controller
animated:YES
completion:^(void){
NSLog(@"Picker View Controller is presented");
}];
}
}else{
Show_AlterView(NSLocalizedString(@"不支持系统相册", nil));
}
4 : 实现相册代理
包含第三方类 : VPImageCropperViewController
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
[picker dismissViewControllerAnimated:YES completion:^() {
UIImage *portraitImg = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
// portraitImg = [self imageByScalingToMaxSize:portraitImg];
// 裁剪 另外一个类库做裁剪 3.0是图片能放大的倍数
VPImageCropperViewController *imgEditorVC = [[VPImageCropperViewController alloc] initWithImage:portraitImg cropFrame:CGRectMake(0, 100.0f, self.view.frame.size.width, self.view.frame.size.width) limitScaleRatio:3.0];
imgEditorVC.delegate = self;
[self presentViewController:imgEditorVC animated:YES completion:^{
// TO DO
}];
}];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissViewControllerAnimated:YES completion:^(){
}];
}
//实现三方代理 直接返回界面即可
#pragma mark VPImageCropperDelegate
- (void)imageCropper:(VPImageCropperViewController *)cropperViewController didFinished:(UIImage *)editedImage {
//处理获取的结果图,设为头像啊,生成二维码啊 什么的editedImage
[cropperViewController dismissViewControllerAnimated:YES completion:^{
// TO DO
}];
}
- (void)imageCropperDidCancel:(VPImageCropperViewController *)cropperViewController {
[cropperViewController dismissViewControllerAnimated:YES completion:^{
}];
}
接下来就是post上传到服务器了
//先将图片转换成二进制数据流
NSData* imageData = UIImagePNGRepresentation(editedImage);
//设置接收响应类型为标准HTTP类型(默认为响应类型为JSON)
AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
// manager.responseSerializer = [AFHTTPResponseSerializer serializer];得到的responseObject还是二进制可用字符串接受//NSString *headerImageUrl = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",nil];
AFHTTPRequestOperation * o2= [manager POST:上传的url parameters:上传的参数字典param constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
//将得到的二进制图片拼接到表单中 /** data,指定上传的二进制流;name,服务器端所需参数名;fileName,指定文件名;mimeType,指定文件格式 */
[formData appendPartWithFileData:data name:@"file"fileName:@"icon.png"mimeType:@"image/png"];
//多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)
}success:^(AFHTTPRequestOperation *operation,id responseObject){
NSDictionary *dic = (NSDictionary *)responseObject;
//返回得到的字典
}failure:^(AFHTTPRequestOperation *operation,NSError *error) {
AnyLog(@"下载图片失败");
}];
//上传操作进度
[o2 setUploadProgressBlock:^(NSUInteger bytesWritten,long long totalBytesWritten, long long totalBytesExpectedToWrite) {
}];
// UIProgressView * progressV2 = [[UIProgressViewalloc]initWithProgressViewStyle:UIProgressViewStyleDefault];
//
// [progressV2 setProgressWithUploadProgressOfOperation:o2animated:YES];
//
// [progressV2 setFrame:CGRectMake(0,130, 320, 30)];
//
// [self.view addSubview:progressV2];