【IOS】读取、保存图片的各种方法

一.读取图片

1.从资源(resource)读取

1 UIImage* image=[UIImage imageNamed:@"1.jpg"]; 

2.从网络读取【最好使用EGOImageView来获取网络图片】

1 NSURL *url=[NSURL URLWithString:@"http://www.sinaimg.cn/qc/photo_auto/chezhan/2012/50/00/15/80046_950.jpg"];
2 UIImage *imgFromUrl =[[UIImage alloc]initWithData:[NSData dataWithContentsOfURL:url]]; 

3.从手机本地读取

1 //读取本地图片非resource
2 NSString *aPath3=[NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];
3 UIImage *imgFromUrl3=[[UIImage alloc]initWithContentsOfFile:aPath3];
4 UIImageView* imageView3=[[UIImageView alloc]initWithImage:imgFromUrl3];  

4.从现有的context中获得图像

 1 //add ImageIO.framework and #import
 2 CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
 3 CGImageRef img= CGImageSourceCreateImageAtIndex(source,0,NULL);
 4 CGContextRef ctx=UIGraphicsGetCurrentContext();
 5 CGContextSaveGState(ctx);
 6 //transformCTM的2种方式
 7 //CGContextConcatCTM(ctx, CGAffineTransformMakeScale(.2, -0.2));
 8 //CGContextScaleCTM(ctx,1,-1);
 9 //注意坐标要反下,用ctx来作为图片源
10 CGImageRef capture=CGBitmapContextCreateImage(ctx);
11 CGContextDrawImage(ctx, CGRectMake(160, 0, 160, 230), [image CGImage]);
12 CGContextDrawImage(ctx, CGRectMake(160, 230, 160, 230), img);
13 CGImageRef capture2=CGBitmapContextCreateImage(ctx);  

5.用Quartz的CGImageSourceRef来读取图片

1 CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
2 CGImageRef img= CGImageSourceCreateImageAtIndex(source,0,NULL);  

二.保存图片

1.转换成NSData来保存图片(imgFromUrl是UIImage)

1 //保存图片 2种获取路径都可以
2 //NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
3 //NSString*documentsDirectory=[paths objectAtIndex:0];
4 //NSString*aPath=[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.jpg",@"test"]];
5 NSString *aPath=[NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];
6 NSData *imgData = UIImageJPEGRepresentation(imgFromUrl,0);
7 [imgData writeToFile:aPath atomically:YES];

用UIImageWriteToSavedPhotosAlbum往照片库里面存图片时,经常发生缩略图能看到但原图消失的问题

用 UIImageWriteToSavedPhotosAlbum(imageSave, nil, nil, nil), imageSave是UIImage类型,这样就保存进去了。

而且注意图片不宜过大,以免程序崩溃

【将图片保存在手机相册中】

UIImageWriteToSavedPhotosAlbum(imgView.image,nil,nil,nil);

保存图片拓展:有时候应用可能被手机禁止访问相册,导致图片保存失败

应用中有时我们会有保存图片的需求,如利用UIImagePickerController用IOS设备内置的相机拍照,或是有时我们在应用程序中利用UIKit的 UIGraphicsBeginImageContext,UIGraphicsEndImageContext,UIGraphicsGetImageFromCurrentImageContext方法创建一张图像需要进行保存。

IOS的UIKit Framework提供了UIImageWriteToSavedPhotosAlbum方法对图像进行保存,该方法会将image保存至用户的相册中,描述如下:

 1 void UIImageWriteToSavedPhotosAlbum (
 2    UIImage  *image,
 3    id       completionTarget,
 4    SEL      completionSelector,
 5    void     *contextInfo
 6 );
 7 参数说明:
 8         image
 9             带保存的图片UImage对象
10         completionTarget
11             图像保存至相册后调用completionTarget指定的selector(可选)
12         completionSelector
13                 completionTarget的方法对应的选择器,相当于回调方法,需满足以下格式
14
15 - (void) image: (UIImage *) image
16 didFinishSavingWithError: (NSError *) error
17                 contextInfo: (void *) contextInfo; 

contextInfo指定了在回调中可选择传入的数据。

当我们需要异步获得图像保存结果的消息时,我们需要指定completionTarget对象以及其completionSelector对应的选择器。示例如下:

 1 - (void)saveImageToPhotos:(UIImage*)savedImage
 2 {
 3     UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
 4 }
 5 // 指定回调方法
 6 - (void)image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo
 7 {
 8     NSString *msg = nil ;
 9     if(error != NULL){
10         msg = @"保存图片失败" ;
11     }else{
12         msg = @"保存图片成功" ;
13     }
14     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"保存图片结果提示"
15                                                         message:msg
16                                                        delegate:self
17                                               cancelButtonTitle:@"确定"
18                                               otherButtonTitles:nil];
19     [alert show];
20 }
21
22 // 调用示例
23 UIImage *savedImage = [UIImage imageNamed:"savedImage.png"];
24
25 [self saveImageToPhotos:savedImage];

2.用Quartz的CGImageDestinationRef来输出图片,这个方式不常见,所以不做介绍,详细可以看apple文档Quartz 2D Programming Guide

三.绘制图(draw|painting)

1.UIImageView方式加入到UIView层

1 UIImageView* imageView=[[UIImageView alloc]initWithImage:image];
2 imageView.frame=CGRectMake(0, 0, 320, 480);
3 [self addSubview:imageView];
4 [imageView release];  

2.[img drawAtPoint]系列方法

1 [image4 drawAtPoint:CGPointMake(100, 0)];    

3.CGContextDrawImage

1 CGContextDrawImage(ctx, CGRectMake(160, 0, 160, 230), [image CGImage]); 

4.CGLayer

这个是apple推荐的一种offscreen的绘制方法,相比bitmapContext更好,因为它似乎会利用iphone硬件(drawing-card)加速

1 CGLayerRef cg=CGLayerCreateWithContext(ctx, CGSizeMake(320, 480), NULL);
2 //需要将CGLayerContext来作为缓存context,这个是必须的
3 CGContextRef layerContext=CGLayerGetContext(cg);
4 CGContextDrawImage(layerContext, CGRectMake(160, 230, 160, 230), img);
5 CGContextDrawLayerAtPoint(ctx, CGPointMake(0, 0), cg);  

5.CALayer的contents

1 UIImage* image=[UIImage imageNamed:@"1.jpg"];
2 CALayer *ly=[CALayer layer];
3 ly.frame=CGRectMake(0, 0, 320, 460);
4 ly.contents=[image CGImage];
5 [self.layer addSublayer:ly];  

四.其它

1.CGImage和UIImage互换

这样就可以随时切换UIKit和Quartz之间类型,并且选择您熟悉的方式来处理图片.

1 CGImage cgImage=[uiImage CGImage];
2 UIImage* uiImage=[UIImage imageWithCGImage:cgImage];
时间: 2024-10-11 22:47:22

【IOS】读取、保存图片的各种方法的相关文章

IOS 读取本地的Json/plist 文件

一.一般本地可以存储轻量级数据存储 plist  这个主要是操作字典 方法如下: NSString * sampleFile= [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"sections_auth=4.plist"]; NSDictionary* dic_sections = [NSDictionary dictionaryWithContentsOfFile:sampleFile]; 二.

iOS系统网络抓包方法

在进行iOS开发过程中,经常会遇到各种各样的网络访问问题,以前苦于没有抓包工具,很多网络问题解决起来很痛苦.现在终于好了,本文提供两种方式进行网络抓包: 1. 网络共享 + 可视化抓包工具 基本原理 原理比较简单,ios设备通过代理方式共享连接mac电脑的无线网卡,使用抓包工具抓包,然后进行分析(我们推荐使用Wireshark,在MAC系统上也可以使用Paros工具). 现在以MAC系统下Paros工具为例,详细描述下抓包过程: 操作步骤 1)  首先将MAC电脑的以太网共享给airport,使

ios中图像进行压缩方法汇总

ios中图像进行压缩方法汇总 在Iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需 要图片引用作为参数. 方法一: 代码如下: - (UIImage*)scaleFromImage:(UIImage*)image scaledToSize:(CGSize)

IOS中block的使用方法

X.1 初探Block 在这一小节我们先用一些简单范例来导入block的概念. X.1.1 宣告和使用Block 我们使用「^」运算子来宣告一个block变数,而且在block的定义最后面要加上「;」来表示一个完整的述句(也就是将整个block定义视为前面章节所介绍的简单述句,因为整个定义必须是一个完整的句子,所以必须在最后面加上分号),下面是一个block的范例: 1: int multiplier = 7 ; 2: int (^myBlock)( int ) = ^( int num) 3:

ios图片拉伸两种方法

ios图片拉伸两种方法 UIImage *image = [UIImage imageNamed:@"qq"]; 第一种: // 左端盖宽度 NSInteger leftCapWidth = image.size.width * 0.5f; // 顶端盖高度 NSInteger topCapHeight = image.size.height * 0.5f; // 重新赋值 image = [image stretchableImageWithLeftCapWidth:leftCapW

Javascript写入txt和读取txt文件的方法

文章主要介绍了Javascript写入txt和读取txt文件的方法,需要的朋友可以参考下1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码 代码如下: Var fso=new ActiveXObject(Scripting.FileSystemObject); 创建一个可以将文件翻译成文件流的对象. 第二步:用于创建一个textStream 对象 括号里边有三个属性 1. 文件的绝对路径 2. 文件的常数 只读=1,只写=2 ,追加=8 等权限.(Fo

cisco低端交换机IOS升级失败的处理方法

大家都知道,cisco设备IOS升级是很简单的,就只要搭个ftp或tftp服务器,然后在cisco设备上使用 copy tftp:(或ftp:)flash:(高端设备一般为sup-bootdisk:) 就可以了.并且高端设备升级失败后,即使你删除了原有的IOS,也只需要弄一张flash卡,将IOS直接拷至flash卡,然后插至引擎上带的 flash卡插槽,再设置一下IOS文件位置就可以了.但低端设备没有配置flash插槽,此时怎么办呢?可能大家已经想到使用xmodem方式将IOS 文件拷到设备的

iOS中数组遍历的方法及比较

数组遍历是编码中很常见的一种需求,我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 因为iOS是兼容C语言的,所以C语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的系统的语言数组,大约有30多个数据,虽然还不够模拟大批量的数据,但对于方法的验证是没有问题的了. NSArray *langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"]; 第一种方法

黑马程序员_学习IOS之字典常用的方法

字典是无序的 数组是有序的.字典分为:可变字典和不可变字典  不可变字典对象 NSDictionary * dict = [[NSDictionary alloc]initWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3",@"four",@"4", nil]; //value = ke

C#中常用的几种读取XML文件的方法

XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具.XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用.微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件. “在程序中访问