UIImageView和UIImage,CGContextRef 的一些知识点
1.UIImageView不支持内部图片平铺(tile)
2.资源中的图片要用小写的,模拟器中可能不区分大小写,但在真机中区分.
[UIImage imageNamed:@""]; 在设备中区分大小写
3.UIView没有背景图属性,有背景色属性.设置背景图可以用addSubView(backgroundImage);,推荐的是设置背景色。
4.[UIImage imageNamed:@""];它是有缓存特性的
+ (UIImage *)imageWithContentsOfFile:(NSString *)path; //does not cache the image object.
imageNamed文档解释:
This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object.
On a device running iOS 4 or later, the behavior is identical if the device’s screen has a scale of1.0
. If the screen has a scale of2.0
, this method first searches for an image file with the same filename with an@2x
suffix appended to it. For example, if the file’s name isbutton
, it first searches forbutton@2x
. If it finds a 2x, it loads that image and sets thescale
property of the returnedUIImage
object to2.0
. Otherwise, it loads the unmodified filename and sets thescale
property to1.0
.
On iOS 4 and later, the name of the file is not required to specify the filename extension. Prior to iOS 4, you must specify the filename extension.
可能在多次操作之后,应用经常发生内存警告从而导致自动退出的问题。定位之后发现是由于[UIImage imageNamed: @""]分配的图像都没有释放引起的。而之前从官方的reference中得到的信息应该是[UIImage imageNamed:@""]分配的图像系统会放到cache里面。而关于cache管理的规则就没有明确的介绍。由此看来[UIImage imageNamed:]只适合与UI界面中小的贴图的读取,而一些比较大的资源文件应该尽量避免使用这个接口。
5. UIImage的 - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight
指定两个方向上不被缩放的部分。
对应的 rightCapWidth = image.size.width - (image.leftCapWidth + 1);
bottomCapHeight = image.size.height - (image.topCapHeight + 1);
leftCapWidth,rightCapWidth之间的,topCapHeight,bottomCapHeight之间的像素被平铺以达到缩放效果。
另外UIView.contentStretch在这里好像不起作用。
注意:使用这个函数时,要取它的返回值。并且 That method could return nil if the base image is less than 5 pixels wide or 5 pixels tallsince it needs the 4 pixels for the caps + 1 pixel to stretch.
示例:设置导航栏上的自定义返回按钮
16.图片圆角化
http://www.cocoachina.com/bbs/read.php?tid=1757&page=1
17. 给图片加滤镜
用Core Graphic的API,把图片解析成RGBA四通道的位图放入内存, 然后内存中有一个数组,数组中的每四个元素都是图像上的一个像素点的RGBA的数值(0-255),改变RGB的数值,再写回去重新生成。
变为黑白照片就是把每个像素点的RGB的值相加求平均值,再回写回去。例如:R=B=G=100,就是灰色的,写 for循环把每个像素点的RGB都改成各自的平均值,照片就变为黑白色了。如果图像变为怀旧照片,就是底色发黄的,就是RG的比值调高,B保持不变,因为红绿相配就是黄色。
借助Android里的ColorMatrix(颜色矩阵)的概念,重要的就是把每个像素点的RGB调整为新值。
http://www.cocoachina.com/bbs/read.php?tid=69525
http://www.cnblogs.com/leon19870907/articles/1978065.html
18. 绘半透明矩形
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(ctx,[[UIColor blackColor] colorWithAlphaComponent:0.5].CGColor);
CGContextAddRect(ctx, CGRectMake(0, 0, 320, 44));
CGContextClosePath(ctx);
CGContextDrawPath(ctx, kCGPathFill);
19. GPUImage
https://github.com/BradLarson/GPUImage
先编译framework目录下GPUImage.xcodeproj,生成.a,再编译examples下某个应用程序。