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

iOS小Demo之获取图片像素数据 #define R(x) ( Mask8(x) ) #define G(x) ( Mask8(x >> 8 ) ) #define B(x) ( Mask8(x >> 16) ) -(void)getImagePixel {     UIImage *baseImage = [UIImage imageNamed:@"base"];     CGImageRef... 阅读详情

一.读取图片

1.从资源(resource)读取
  1. UIImage* image=[UIImage imageNamed:@"1.jpg"];  

2.从网络读取
  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 <ImageIO/ImageIO.h>    
  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];     

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之间类型,并且选择您熟悉的方式来处理图片.
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.不会自动启动动画图片。

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

  1. imgV=[[UIImageView alloc]initWithFrame:CGRectMake(40, 40, 128, 128)];  
  2. [self.window addSubview:imgV];  
  3. [self performSelectorInBackground:@selector(playAnim)withObject:nil];  
  4.   
  5. [imgV release];  
  6. -(void)playAnim{  
  7. for (int i=0;i<101;){  
  8. usleep(100000);  
  9. UIImage *image=[[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d",i+1 ] ofType:@"tiff"]];  
  10. [self performSelectorOnMainThread:@selector(changeImage:) withObject:image waitUntilDone:YES];  
  11. i++;  
  12.   
  13. }  
  14. }   
  15. -(void)changeImage:(UIImage*)image{  
  16. imgV.image=image;   
  17. }   
相关帖子:http://www.cocoachina.com/bbs/read.php?tid=110154

4.UIControl设置UIImage

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

  1. UIImage *bg=[UIImage imageNamed:@"heizi1.jpg"];  
  2.      //图片大于点及区域,缩小下就行  
  3.      bg=[self scaleImage:bg ToSize:(CGSize){100,100}];  
  4.      UIButton* button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];  
  5.      //图片大于button,则会被拉伸,如果小于button则居中显示  
  6.      [button setImage:bg forState:UIControlStateNormal];  

此外多说一句,这个icon图片如果要准备2套图,缩放毕竟消耗效率

缩放图片代码

  1. -(UIImage *)scaleImage:(UIImage *)img ToSize:(CGSize)itemSize{  
  2.   
  3. UIImage *i;  
  4. //    CGSize itemSize=CGSizeMake(30, 30);  
  5. UIGraphicsBeginImageContext(itemSize);  
  6. CGRect imageRect=CGRectMake(0, 0, itemSize.width, itemSize.height);  
  7. [img drawInRect:imageRect];  
  8. i=UIGraphicsGetImageFromCurrentImageContext();  
  9. UIGraphicsEndImageContext();  
  10. return i;  

从view截图出来
  1. #import <QuartzCore/QuartzCore.h>  
  2.   
  3. -(UIImage *)getImageFromView:(UIView *)orgView{  
  4.     UIGraphicsBeginImageContext(orgView.bounds.size);  
  5.     [orgView.layer renderInContext:UIGraphicsGetCurrentContext()];  
  6.     UIImage *image = UIGraphicsGetImageFromCurrentImageContext();  
  7.     UIGraphicsEndImageContext();  
  8.      
  9.     return image;  
  10. }  


iOS开发:iPhone设备图片、音乐、视频获取实践 背景介绍 出于项目需求,需要基于iphone设备内图片及音乐、视频资源完成一些功能。功能包括以几点:1.需要在APP内获得并处理iphone设备内的图片、音频和视频;2.在APP内嵌入拍照入口,可以拍照并展示图片。 开发过程是学习的过程也是解决问题的过程,因此笔者对开发过程中涉及到的iphone设备内图片、音视频获取以及拍照过程中遇到的图片方向问题进行了整理和分析。 开发环境:Xcode10 一、... 阅读详情

相关推荐

ios-iOS本地生成图形验证码,drawRect实现.zip

用drawRect实现了一个图形验证码。喜欢的小伙伴github上star一个,持续关注哦~ github: https://github.com/shenAlexy/GraphCodeView csdn博客地址:http://blog.youkuaiyun.com/shenguanhua 个人微信公众号: iOSDevTeam,随时分享iOS开发干货。

UIImagePickerController从拍照、图库、相册获取图片

iOS 获取图片有三种方法: 1. 直接调用摄像头拍照 2. 从相册中选择 3. 从图库中选择 UIImagePickerController 是系统提供的用来获取图片和视频的接口; 用UIImagePickerController 类来获取图片视频,大体分为以下几个步骤: 1. 初始化UIImagePickerController 类; 2. 设置UII

MayerF的专栏 915

VScode搭建Opencv(C++开发环境)

VScode配置Opencv一、准备软件二 、下载软件1、MinGw下载2、 Cmake下载3、Opencv下载三、编译1、cmake-gui2、make3、install四、 VScode配置1、launch.json2、c_cpp_properties.json3、tasks.json五、测试 用了半天事件,看了各种的博客终于配置成功了,在这里记录并分享一下,让更多的人少走弯路。 本次环境是Win 10. 一、准备软件 我们本次用到的3个软件,(建议读者文件路径,文件版本 尽量都和我相同,这样不容易出错

河旬的博客 8万+

iOS读取图片数据的两种方法:UIImageJPEG和UIImagePNG

UIImageJPEGRepresentation函数有两个参数:引用的图片和压缩系数. UIImagePNGRepresentation(UIImage * image)函数只有一个引用图片参数. UIImagePNGRepresentation(UIImage * image)要比UIImageJPEGPresentation(UIImage * image, 1.0)返回的图片...

weixin_30727835的博客 719

从零开始 使用OMNET++结合VEINS,INET和SUMO的联合仿真

搭建仿真的环境,导入VEINS和INET开源库,使用INET库中提供的网络协议和功能模型来模拟通信协议和网络功能,使用SUMO创建道路网络和车辆轨迹,并导出到OMNeT++中 在OMNeT++中使用VEINS通过socket和SUMO连接,借助VEINS实现的TRACI接口来设置车辆相关的行为和场景,最后在OMNET++中结合VEINS,SUMO和INET运行联合仿真实验,并分析车辆在遇到紧急情况下的通信状况和具体行为

mjmmm的博客 1万+

TMS320F28377D的sys/bios双核工程配置详解——从零搭建到RAM优化

本文详细解析了TMS320F28377D双核系统在sys/bios环境下的工程配置与RAM优化策略。从开发环境搭建、SYS/BIOS工程创建到双核CMD文件配置,提供了实战技巧和常见问题解决方案,帮助开发者高效实现电力电子控制系统中的双核协作与性能优化。

weixin_28292761的博客 600

iPhone/iOS图片读取、保存、绘制

一.读取图片 1.从资源(resource)读取 [cpp] view plaincopyprint? UIImage* image=[UIImage imageNamed:@"1.jpg"];   2.从网络读取 [cpp] view plaincopyprint? NSURL

iphone开发收集盒子 1143

生信小白必看:手把手教你用R语言实现counts/FPKM/TPM互转(附代码)

本文为生信初学者详细讲解如何使用R语言实现counts、FPKM和TPM三种转录组表达量单位的精准转换,包含完整代码示例和常见问题解决方案。重点解析了FPKM与TPM的数学原理及转换方法,帮助读者掌握RNA-seq数据分析中的关键预处理步骤,提升差异表达分析的准确性。

weixin_27442001的博客 495

iOS 保存图片或视频到PhotoLibrary

存储图片到photo library与存储video到photo library的API差不多,但也有所不同。图片是可以直接把数据写入photo library,而video需要先把数据存到临时文件然后,然后通过临时文件的路径去转存到photo library。我们直接来看相应的API:// These methods can be used to add photos or videos to

潇洒的程序员 3万+

告警不是闹钟:AI 如何把告警过滤成真正的“求救信号”?

告警不是闹钟:AI 如何把告警过滤成真正的“求救信号”?

Echo_Wish 240

「UG/NX」BlockUI 树列表(回调函数)

官方对树控件提供了21种回调函数,树的一些操作可以在这些回调函数中进行操作。

何曾参静谧的博客 1326

【Ios】 Unity for iOS 打开相册、相机及保存图片到相册

偶然在网上看到一位博主写的 unity 和ios 交互 个人感觉 功能很全 转载地址:http://blog.youkuaiyun.com/AnYuanLzh/article/details/50748928 在这里简单,实现一个 Unity for iOS 打开相册、相机及保存图片到相册的功能。主要有两个方面:1、unity 与 ios的交互、ios下的objective-c的相关api。具

阿黄的博客 3986

基于Simscape的双PID比例调速阀与比例溢流阀液压控制系统建模与仿真

本文提出了一种基于Simscape的双PID液压控制系统建模方法,通过比例调速阀和比例溢流阀实现液压缸速度与压力的解耦控制。系统采用Simscape Fluids物理建模,精确模拟液压元件非线性特性。文章详细介绍了液压被控对象建模过程,包括动力单元、比例阀组合建模、执行机构及传感器配置。同时设计了双PID控制器架构,分别控制速度环和压力环,并给出参数整定建议。该方法通过物理网络直接模拟流体流动和压力动态,相比传统传递函数法具有更高精度,为液压系统仿真提供了有效解决方案。

AI的内部世界的博客 284
上一篇: iPhone/iOS Core Animation开发总结(CALayer)
下一篇: NSData 转换
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值