[ios] iOS图片相关(读取、保存、绘制、其它相关) 【转】
http://blog.csdn.net/marujunyy/article/details/8588688
一.读取图片
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];
- //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);
- 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];
- [image4 drawAtPoint:CGPointMake(100, 0)];
- CGContextDrawImage(ctx, CGRectMake(160, 0, 160, 230), [image CGImage]);
这个是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);
- 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;
- }
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];
缩放图片代码
- -(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;
- #import <QuartzCore/QuartzCore.h>
- -(UIImage *)getImageFromView:(UIView *)orgView{
- UIGraphicsBeginImageContext(orgView.bounds.size);
- [orgView.layer renderInContext:UIGraphicsGetCurrentContext()];
- UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return image;
- }