ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结

本文介绍在iPhone上处理和上传图片的方法,包括使用UIImageJPEGRepresentation和UIImagePNGRepresentation进行图片压缩,从摄像头或相册获取图片,并将其存储在沙盒中。

在Iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需要图片引用作为参数.通过在实际使用过程中,比较发现: UIImagePNGRepresentation(UIImage* image) 要比UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的图片数据量大很多.譬如,同样是读取摄像头拍摄的同样景色的照片, UIImagePNGRepresentation()返回的数据量大小为199K ,而 UIImageJPEGRepresentation(UIImage* image, 1.0)返回的数据量大小只为140KB,比前者少了50多KB.如果对图片的清晰度要求不高,还可以通过设置 UIImageJPEGRepresentation函数的第二个参数,大幅度降低图片数据量.譬如,刚才拍摄的图片, 通过调用UIImageJPEGRepresentation(UIImage* image, 1.0)读取数据时,返回的数据大小为140KB,但更改压缩系数后,通过调用UIImageJPEGRepresentation(UIImage* image, 0.5)读取数据时,返回的数据大小只有11KB多,大大压缩了图片的数据量 ,而且从视角角度看,图片的质量并没有明显的降低.因此,在读取图片数据内容时,建议优先使用UIImageJPEGRepresentation,并可根据自己的实际使用场景,设置压缩系数,进一步降低图片数据量大小。

  1. UIImage *imageNew = [info objectForKey:@"UIImagePickerControllerOriginalImage"];  
  2. imageNew = [self imageWithImage:imageNew scaledToSize:CGSizeMake(100, 100)];  
  3. NSData *imageData = UIImageJPEGRepresentation(imageNew, 0.0001);  
  4.   
  5. m_selectImage = [UIImage imageWithData:imageData]; 

iphone中图像通常存储在4个地方【相册、应用程序包、沙盒、Internet】,通过这4个源,我们就可以存取应用图片。

相册 
    1、iphone的相册包含摄像头胶卷+用户计算机同步的部分照片。用户可以通过UIImagePickerController类提供的交互对话框来从相册中选择图像。但是,注意:相册中的图片机器路径无法直接从应用程序访问,只能通过终端用户去选择和使用相册图片

应用程序包 
    2、应用程序包可能会将图像与可执行程序、Info.plist文件和其他资源一同存储。我们可以通过本地文件路径来读取这些基于包的图像并在应用程序中显示它们。

沙盒 
    3、借助沙盒,我们可以把图片存储到Documents、Library、tmp文件夹中。这些文件均可有应用程序读取,且可以通过文件路径创建图像。尽管沙盒外的部分从技术上说是可行的,但是apple表明这些部分不在appstore应用程序允许访问的范围之内。

Internet 
    4、应用程序可以通过图片的URL来访问Internet上的资源。


下面开始切入正题,从摄像头/相册获取图片,压缩图片,上传图片。


从摄像头/相册获取图片 
    刚刚在上面的知识中提到从摄像头/相册获取图片是面向终端用户的,由用户去浏览并选择图片为程序使用。在这里,我们需要过UIImagePickerController类来和用户交互。

    使用UIImagePickerController和用户交互,我们需要实现2个协议<UIImagePickerControllerDelegate,UINavigationControllerDelegate>。

  1. #pragma mark 从用户相册获取活动图片  
  2. - (void)pickImageFromAlbum  
  3. {  
  4.     imagePicker = [[UIImagePickerController alloc] init];  
  5.     imagePicker.delegate = self;  
  6.     imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
  7.     imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;  
  8.     imagePicker.allowsEditing = YES;  
  9.       
  10.     [self presentModalViewController:imagePicker animated:YES];  
  11. }   
我们来看看上面的从相册获取图片,我们首先要实例化UIImagePickerController对象,然后设置imagePicker对象为当前对象,设置imagePicker的图片来源为UIImagePickerControllerSourceTypePhotoLibrary,表明当前图片的来源为相册,除此之外还可以设置用户对图片是否可编辑。

  1. #pragma mark 从摄像头获取活动图片  
  2. - (void)pickImageFromCamera  
  3. {  
  4.     imagePicker = [[UIImagePickerController alloc] init];  
  5.     imagePicker.delegate = self;  
  6.     imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;  
  7.     imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;  
  8.     imagePicker.allowsEditing = YES;  
  9.       
  10.     [self presentModalViewController:imagePicker animated:YES];  
  11. }   

以上是从摄像头获取图片,和从相册获取图片只是图片来源的设置不一样,摄像头图片的来源为UIImagePickerControllerSourceTypeCamera。

    在和用户交互之后,用户选择好图片后,会回调选择结束的方法。

 

  1. - (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info  
  2. {  
  3.     UIImage *image= [info objectForKey:@"UIImagePickerControllerOriginalImage"];  
  4.     if (picker.sourceType == UIImagePickerControllerSourceTypeCamera)   
  5.     {  
  6. //        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);  
  7.     }  
  8.     theImage = [UtilMethod imageWithImageSimple:image scaledToSize:CGSizeMake(120.0, 120.0)];  
  9.     UIImage *midImage = [UtilMethod imageWithImageSimple:image scaledToSize:CGSizeMake(210.0, 210.0)];  
  10.     UIImage *bigImage = [UtilMethod imageWithImageSimple:image scaledToSize:CGSizeMake(440.0, 440.0)];  
  11.     [theImage retain];  
  12.     [self saveImage:theImage WithName:@"salesImageSmall.jpg"];  
  13.     [self saveImage:midImage WithName:@"salesImageMid.jpg"];  
  14.     [self saveImage:bigImage WithName:@"salesImageBig.jpg"];  
  15.       
  16.     [self dismissModalViewControllerAnimated:YES];  
  17.     [self refreshData];  
  18.     [picker release];  
  19. }  

在回调结束的方法中,我们对图片进行了大小的处理,为图片的上传做准备。

缩放图片 
    缩放图片比较简单,就直接放上代码,让大家参考一下。

  1. //压缩图片  
  2. + (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize  
  3. {  
  4.     // Create a graphics image context  
  5.     UIGraphicsBeginImageContext(newSize);  
  6.       
  7.     // Tell the old image to draw in this new context, with the desired  
  8.     // new size  
  9.     [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];  
  10.       
  11.     // Get the new image from the context  
  12.     UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();  
  13.       
  14.     // End the context  
  15.     UIGraphicsEndImageContext();  
  16.       
  17.     // Return the new image.  
  18.     return newImage;  
  19. }  

存储图像 
    在上面我们获取到了图片并对图片进行了压缩,通过之前的小知识了解到,将应用需要的一些图片存入沙盒是个不错的选择,而且应用程序可以直接通过路径去方法沙盒中的图片,在这里我们将图片存入沙盒中的Documents目录下。

  1. #pragma mark 保存图片到document  
  2. - (void)saveImage:(UIImage *)tempImage WithName:(NSString *)imageName  
  3. {  
  4.     NSData* imageData = UIImagePNGRepresentation(tempImage);  
  5.     NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  6.     NSString* documentsDirectory = [paths objectAtIndex:0];  
  7.     // Now we get the full path to the file  
  8.     NSString* fullPathToFile = [documentsDirectory stringByAppendingPathComponent:imageName];  
  9.     // and then we write it out  
  10.     [imageData writeToFile:fullPathToFile atomically:NO];  
  11. }  

从Documents目录下获取图片 
    要从Documents下面获取图片,我们首先需要获取Documents目录的路径。

  1. #pragma mark 从文档目录下获取Documents路径  
  2. - (NSString *)documentFolderPath  
  3. {  
  4.     return [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];  
  5. }   

然后,我们便可以通过文件名,去访问获取资源了。

View Code
上传图片 
    项目中我们使用了ASIFormHttpRequest的开源框架,http请求的部分代码如下,http返回以及相关回调方法略去。

  1. - (void)upLoadSalesBigImage:(NSString *)bigImage MidImage:(NSString *)midImage SmallImage:(NSString *)smallImage  
  2. {  
  3.     NSURL *url = [NSURL URLWithString:UPLOAD_SERVER_URL];  
  4.     ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];  
  5.     [request setPostValue:@"photo" forKey:@"type"];  
  6.     [request setFile:bigImage forKey:@"file_pic_big"];  
  7.     [request buildPostBody];  
  8.     [request setDelegate:self];  
  9.     [request setTimeOutSeconds:TIME_OUT_SECONDS];  
  10.     [request startAsynchronous];   



下载前可以先看下教程 https://pan.quark.cn/s/a4b39357ea24 SSM框架,涵盖了Spring MVC、Spring以及MyBatis这三个框架,在Java领域内作为构建Web应用程序的常用架构而备受青睐,特别是在电子商务购物平台的设计与实现过程中展现出极高的应用价值。 这三个框架各自承担着特定的功能角色,通过协同运作来达成高效且灵活的业务处理目标。 Spring MVC作为Spring体系结构中的一个关键部分,主要致力于处理HTTP请求与响应,并推行模型-视图-控制器(MVC)的设计模式。 其运作机制中,DispatcherServlet扮演着前端控制器的角色,负责接收HTTP请求,并将其依据请求映射至相应的Controller处理方法。 在Controller执行完业务逻辑后,会将处理结果传递给ModelAndView对象,随后由ViewResolver将其解析为具体视图进行呈现。 Spring MVC还具备数据绑定、验证以及国际化等附加功能,这些特性显著提升了开发工作的效率以及代码的可维护程度。 Spring框架则是一个综合性的企业级应用开发框架,其核心能力包含依赖注入(DI)、面向切面编程(AOP)以及事务管理等关键特性。 DI机制使得开发者能够借助配置文件或注解手段来管理对象的生成与依赖关联,从而有效降低组件之间的耦合性。 AOP技术则适用于实现诸如日志记录、权限管理这类跨领域的功能需求,有助于使代码结构更为清晰。 Spring在事务管理方面提供了编程式和声明式两种处理途径,确保了数据操作过程遵循原子性与一致性原则。 MyBatis则是一个轻量级的数据库访问层框架,其特点在于将SQL语句与Java代码进行分离,并支持动态SQL的编写。 开发者可以在XM...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值