iPhone/iOS图片相关(读取、保存、绘制、其它相关)
2016-05-15 13:38
627 查看
一.读取图片
1.从资源(resource)读取[cpp]
view plain
copy
print?
UIImage* image=[UIImage imageNamed:@"1.jpg"];
2.从网络读取
[cpp]
view plain
copy
print?
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.从手机本地读取
[cpp]
view plain
copy
print?
//读取本地图片非resource
NSString *aPath3=[NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];
UIImage *imgFromUrl3=[[UIImage alloc]initWithContentsOfFile:aPath3];
UIImageView* imageView3=[[UIImageView alloc]initWithImage:imgFromUrl3];
4.从现有的context中获得图像
[cpp]
view plain
copy
print?
//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来读取图片
[cpp]
view plain
copy
print?
CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
CGImageRef img= CGImageSourceCreateImageAtIndex(source,0,NULL);
二.保存图片
1.转换成NSData来保存图片(imgFromUrl是UIImage)[cpp]
view plain
copy
print?
//保存图片 2种获取路径都可以
//NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//NSString*documentsDirectory=[paths objectAtIndex:0];
//NSString*aPath=[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.jpg",@"test"]];
"%@/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层[cpp]
view plain
copy
print?
UIImageView* imageView=[[UIImageView alloc]initWithImage:image];
imageView.frame=CGRectMake(0, 0, 320, 480);
[self addSubview:imageView];
[imageView release];
2.[img drawAtPoint]系列方法
[cpp]
view plain
copy
print?
[image4 drawAtPoint:CGPointMake(100, 0)];
3.CGContextDrawImage
[cpp]
view plain
copy
print?
CGContextDrawImage(ctx, CGRectMake(160, 0, 160, 230), [image CGImage]);
4.CGLayer
这个是apple推荐的一种offscreen的绘制方法,相比bitmapContext更好,因为它似乎会利用iphone硬件(drawing-card)加速
[cpp]
view plain
copy
print?
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
[cpp]
view plain
copy
print?
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.不会自动启动动画图片。
此外在读取大量动画图片的时候不太适合用这个方法,因为一下子那么多图片容易爆掉。可以用这个方法替代,具体我也没试,方法就是手动切换图片,并非直接使用系统方法而已。
[cpp]
view plain
copy
print?
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
问题描述主要是有一个很小的叉按钮,需要响应很大的点击区域,这个其实很简单,代码如下:
[cpp]
view plain
copy
print?
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套图,缩放毕竟消耗效率
缩放图片代码
[cpp]
view plain
copy
print?
-(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截图出来
[cpp]
view plain
copy
print?
#import <QuartzCore/QuartzCore.h>
-(UIImage *)getImageFromView:(UIView *)orgView{
UIGraphicsBeginImageContext(orgView.bounds.size);
[orgView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
从网络下载图片,保存,并用 UIImageView 从保存中显示
//从网络下载图片 -(UIImage *) getImageFromURL:(NSString *)fileURL { NSLog(@"执行图片下载函数"); UIImage * result; NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]]; result = [UIImage imageWithData:data]; return result; } //将所下载的图片保存到本地 -(void) saveImage:(UIImage *)image withFileName:(NSString *)imageName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath { if ([[extension lowercaseString] isEqualToString:@"png"]) { [UIImagePNGRepresentation(image) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]] options:NSAtomicWrite error:nil]; } else if ([[extension lowercaseString] isEqualToString:@"jpg"] || [[extension lowercaseString] isEqualToString:@"jpeg"]) { [UIImageJPEGRepresentation(image, 1.0) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]] options:NSAtomicWrite error:nil]; } else { //ALog(@"Image Save Failed\\nExtension: (%@) is not recognized, use (PNG/JPG)", extension); NSLog(@"文件后缀不认识"); } } //读取本地保存的图片 -(UIImage *) loadImage:(NSString *)fileName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath { UIImage * result = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.%@", directoryPath, fileName, extension]]; return result; } //从网络下载图片,保存,并用 UIImageView 从保存中显示 NSString * documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSLog(@"保存路径:%@",documentsDirectoryPath); //Get Image From URL UIImage * imageFromURL = [self getImageFromURL:@"http://file.duteba.com/phone/2009/04/5/ftGxL8kcUL.jpg"]; //Save Image to Directory [self saveImage:imageFromURL withFileName:@"MyImage" ofType:@"jpg" inDirectory:documentsDirectoryPath]; //Load Image From Directory UIImage * imageFromWeb = [self loadImage:@"MyImage" ofType:@"jpg" inDirectory:documentsDirectoryPath]; [img setImage:imageFromWeb]; //取得目录下所有文件名 NSArray *file = [[[NSFileManager alloc] init] subpathsAtPath:documentsDirectoryPath]; //NSLog(@"%d",[file count]); NSLog(@"%@",file); //该片段来自于http://outofmemory.cn
相关文章推荐
- 2016年最新苹果开发者账号注册申请流程最强详解!
- IOS之路--用oc实现类
- iOS开发(OC)——单击手势与tableView的点击冲突
- 浅谈iOS中的闭包
- iOS开源项目
- 2016最新iOS三方支付问题处理
- 【iOS】SDWebImage的图片缓存机制
- 在ios 7下,使用@import代替#import
- iOS开源库源码解析之SDWebImage
- iOS真机调试的验证项
- iOS - block、代理、通知
- iOS开发之关于Socket通讯方式
- iOS开发之关于Runtime运行时:类与对象
- 【iOS】配置和使用静态库
- iOS : 静态库制作
- iOS定位-核心定位框架CLLocation
- iOS开发——响应链(Responder Chain)的深入理解和代码示例
- iOS开发--关于TableViewCell的可视化设置细节
- iOS-Runtime知识点整理,ios-runtime知识点
- iOS中书写代码规范