iOS图片相关(读取、保存、绘制、其它相关)

本文详细介绍iOS平台上的图片处理方法,包括从不同来源读取图片、保存图片至本地、使用多种方式绘制图片,以及图片的转换和特殊效果实现等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.读取图片

1.从资源(resource)读取
UIImage* image=[UIImage imageNamed:@"1.jpg"];
2.从网络读取 
NSURL *url=[NSURL URLWithString:@"http://www.sinaimg.cn/qc/photo_auto/chezhan/2012/50/00/15/80046_950.jpg"];  
UIImage *imgFromUrl =[[UIImage alloc]initWithData:[NSData dataWithContentsOfURL:url]];
3.从手机本地读取
//读取本地图片非resource  
NSString *aPath3=[NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];  
UIImage *imgFromUrl3=[[UIImage alloc]initWithContentsOfFile:aPath3];  
UIImageView* imageView3=[[UIImageView alloc]initWithImage:imgFromUrl3]; 
4.从现有的context中获得图像
//add ImageIO.framework and #import <ImageIO/ImageIO.h>    
CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);  
CGImageRef img= CGImageSourceCreateImageAtIndex(source,0,NULL);  
CGContextRef ctx=UIGraphicsGetCurrentContext();  
CGContextSaveGState(ctx);  
//transformCTM的2种方式  
//CGContextConcatCTM(ctx, CGAffineTransformMakeScale(.2, -0.2));  
//CGContextScaleCTM(ctx,1,-1);  
//注意坐标要反下,用ctx来作为图片源   
CGImageRef capture=CGBitmapContextCreateImage(ctx);  
CGContextDrawImage(ctx, CGRectMake(160, 0, 160, 230), [image CGImage]);  
CGContextDrawImage(ctx, CGRectMake(160, 230, 160, 230), img);  
CGImageRef capture2=CGBitmapContextCreateImage(ctx);
5.用Quartz的CGImageSourceRef来读取图片
CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);  
CGImageRef img= CGImageSourceCreateImageAtIndex(source,0,NULL);  

二.保存图片

1.转换成NSData来保存图片(imgFromUrl是UIImage)
//保存图片 2种获取路径都可以  
//NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
//NSString*documentsDirectory=[paths objectAtIndex:0];    
//NSString*aPath=[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.jpg",@"test"]];   
NSString *aPath=[NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];  
NSData *imgData = UIImageJPEGRepresentation(imgFromUrl,0);      
[imgData writeToFile:aPath atomically:YES]; 
2.用Quartz的CGImageDestinationRef来输出图片,这个方式不常见,所以不做介绍,详细可以看apple文档Quartz 2D Programming Guide


三.绘制图(draw|painting)

1.UIImageView方式加入到UIView层
UIImageView* imageView=[[UIImageView alloc]initWithImage:image];  
imageView.frame=CGRectMake(0, 0, 320, 480);  
[self addSubview:imageView];  
[imageView release];
2.[img drawAtPoint]系列方法
[image4 drawAtPoint:CGPointMake(100, 0)]; 
3.CGContextDrawImage
CGContextDrawImage(ctx, CGRectMake(160, 0, 160, 230), [image CGImage]); 
4.CGLayer
这个是apple推荐的一种offscreen的绘制方法,相比bitmapContext更好,因为它似乎会利用iphone硬件(drawing-card)加速
CGLayerRef cg=CGLayerCreateWithContext(ctx, CGSizeMake(320, 480), NULL);  
//需要将CGLayerContext来作为缓存context,这个是必须的  
CGContextRef layerContext=CGLayerGetContext(cg);  
CGContextDrawImage(layerContext, CGRectMake(160, 230, 160, 230), img);   
CGContextDrawLayerAtPoint(ctx, CGPointMake(0, 0), cg);  
5.CALayer的contents
UIImage* image=[UIImage imageNamed:@"1.jpg"];  
CALayer *ly=[CALayer layer];  
ly.frame=CGRectMake(0, 0, 320, 460);  
ly.contents=[image CGImage];  
[self.layer addSublayer:ly]; 

四.其它

1.CGImage和UIImage互换
这样就可以随时切换UIKit和Quartz之间类型,并且选择您熟悉的方式来处理图片.
CGImage cgImage=[uiImage CGImage];
UIImage* uiImage=[UIImage imageWithCGImage:cgImage];
2.UIImage resizableImageWithCapInsets的问题
假设一张44x29的图片,同样的Insets=UIEdgeInsetsMake(10,10,10,10)在@2x情况和非@2x情况下,表现会有不同,非@2x是OK正常的,但是如果同样尺寸的图片变成@2x,则导致在切换过渡的时候会很卡,应该是在不同的重绘导致的,表面原因是因为Insets设置的是点,在@2x情况下拉伸,其实拉升的像素是上面20,下面也是20,但是图片其实只有29,所以导致不正确,只要将insets设置成=UIEdgeInsetsMake(5,10,5,10)就正常了,所以以后要注意了。

3.动画图片使用注意

animationImage 设置完毕以后要startAnimation.不会自动启动动画图片。

此外在读取大量动画图片的时候不太适合用这个方法,因为一下子那么多图片容易爆掉。可以用这个方法替代,具体我也没试,方法就是手动切换图片,并非直接使用系统方法而已。

imgV=[[UIImageView alloc]initWithFrame:CGRectMake(40, 40, 128, 128)];  
[self.window addSubview:imgV];  
[self performSelectorInBackground:@selector(playAnim)withObject:nil];  
  
[imgV release];  
-(void)playAnim{  
for (int i=0;i<101;){  
usleep(100000);  
UIImage *image=[[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d",i+1 ] ofType:@"tiff"]];  
[self performSelectorOnMainThread:@selector(changeImage:) withObject:image waitUntilDone:YES];  
i++;  
  
}  
}   
-(void)changeImage:(UIImage*)image{  
imgV.image=image;   
} 

相关帖子:http://www.cocoachina.com/bbs/read.php?tid=110154

4.UIControl设置UIImage

问题描述主要是有一个很小的叉按钮,需要响应很大的点击区域,这个其实很简单,代码如下:

UIImage *bg=[UIImage imageNamed:@"heizi1.jpg"];  
     //图片大于点及区域,缩小下就行  
     bg=[self scaleImage:bg ToSize:(CGSize){100,100}];  
     UIButton* button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];  
     //图片大于button,则会被拉伸,如果小于button则居中显示  
     [button setImage:bg forState:UIControlStateNormal];
此外多说一句,这个icon图片如果要准备2套图,缩放毕竟消耗效率

缩放图片代码

-(UIImage *)scaleImage:(UIImage *)img ToSize:(CGSize)itemSize{  
  
UIImage *i;  
//    CGSize itemSize=CGSizeMake(30, 30);  
UIGraphicsBeginImageContext(itemSize);  
CGRect imageRect=CGRectMake(0, 0, itemSize.width, itemSize.height);  
[img drawInRect:imageRect];  
i=UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext();  
return i;  
从view截图出来

#import <QuartzCore/QuartzCore.h>  
  
-(UIImage *)getImageFromView:(UIView *)orgView{  
    UIGraphicsBeginImageContext(orgView.bounds.size);  
    [orgView.layer renderInContext:UIGraphicsGetCurrentContext()];  
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();  
    UIGraphicsEndImageContext();  
     
    return image;  
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值