UIImage类方法总结及UIImage生成方法对比

1、UIImage 生成方法的对比

Apple官方的文档为生成一个UIImage对象提供了两种方法:

1. imageNamed,其参数为图片的名字;优点:加载时会缓存图片,用于图片的频繁使用;缺点:占用内存

2. imageWithContentsOfFile,其参数也是图片文件的路径。优点:仅加载图片,不会缓存,用于价值次数较少的情况,降低内存消耗

那么两种有什么区别吗?

肯定是有的。根据Apple的官方文档:

imageNamed: 这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象如果它存在的话。如果缓存中没有找到相应的图片,这个方法从指定的文档中加载然后缓存并返回这个对象。因此imageNamed的优点是当加载时会缓存图片。所以当图片会频繁的使用时,那么用imageNamed方法会比较好。例如:你需要在 一个TableView里的TableViewCell里都加载同样一个图标,那么用imageNamed加载图像效率很高。系统会把那个图标Cache到内存,在TableViewCell里每次利用那个图 像的时候,只会把图片指针指向同一块内存。正是因此使用imageNamed会缓存图片,即将图片的数据放在内存中,iOS的内存非常珍贵并且在内存消耗过大时,会强制释放内存,即会遇到memory warnings。而在iOS系统里面释放图像的内存是一件比较麻烦的事情,有可能会造成内存泄漏。例如:当一 个UIView对象的animationImages是一个装有UIImage对象动态数组NSMutableArray,并进行逐帧动画。当使用imageNamed的方式加载图像到一个动态数组NSMutableArray,这将会很有可能造成内存泄露。原因很显然的。

imageWithContentsOfFile:仅加载图片,图像数据不会缓存。因此对于较大的图片以及使用情况较少时,那就可以用该方法,降低内存消耗。

下面列举出两种方法的详细用法:

  1. NSString *path = [[NSBundle mainBundle] pathForResource:@”icon” ofType:@”png”];
  2. UIImage *image = [UIImage imageWithContentsOfFile:path];

以及:

  1. NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:“png”];
  2. NSData *image = [NSData dataWithContentsOfFile:filePath];
  3. UIImage *image = [UIImage imageWithData:image]; //or = [UIImage imageWithContentsOfFile:filePath];

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

IOS中对图片的处理  UIImage

相信做项目时肯定会有用到 UIImage 这个类,那我们就来看一下这个类中都有什么内容。

其实这篇文章就是在看文档的时候想记录一下文档中得方法。

UIImage  继承于NSObject

下面介绍一下UIImage中的方法

首先是我们最常用的

通过图片的文件名来获取这个图片

+ (UIImage *)imageNamed:(NSString *)name

//要注意的是这个方法适用于已经导入到工程中的图片

创建新图片

1、+ (UIImage *)imageWithContentsOfFile:(NSString *)path

//通过文件加载指定路径下的文件内容获得新图片

2、+ (UIImage *)imageWithData:(NSData *)data

//通过一个NSData对象来获得图片

3、+ (UIImage *)imageWithData:(NSData *)data scale:(CGFloat)scale

//同上,只是再加上一个图片大小比例,用来改变图片的大小

4、+ (UIImage *)imageWithCGImage:(CGImageRef)cgImage

//使用Quartz 2D对象创建UIImage

5、+ (UIImage *)imageWithCGImage:(CGImageRef)imageRef scale:(CGFloat)scale orientation:(UIImageOrientation)orientation

//制定图片的比例和方向,其中方向是个枚举类。

6、+ (UIImage *)imageWithCIImage:(CIImage *)ciImage

//用一个Core Image 对象创建图像

7、+ (UIImage *)imageWithCIImage:(CIImage *)ciImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation

//再加上比例和图片方向

8、- (UIImage *)imageWithAlignmentRectInsets:(UIEdgeInsets)alignmentInsets

//返回指定矩形区域内的图像

9、+ (UIImage *)animatedImageNamed:(NSString *)name duration:(NSTimeInterval)duration

//创建一个动态图片,动态图片持续的时间为duration

10、+ (UIImage *)animatedImageWithImages:(NSArray *)images duration:(NSTimeInterval)duration

//用一组图片创建一个动态图片,动态持续时间duration

11、+ (UIImage *)animatedResizableImageNamed:(NSString *)name capInsets:(UIEdgeInsets)capInsets duration:(NSTimeInterval)duration

//创建一个在可变大小的图片上指定矩形区域内的动态图片

12、+ (UIImage *)animatedResizableImageNamed:(NSString *)name capInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode duration:(NSTimeInterval)duration

//同上,只是多了一个图片变化的方式,具体来说就是平铺或者拉伸

13、- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

//用制定矩形区域创建图像

14、- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode

//同上,指定图片变化方式

初始化图片 

方法的作用在从上面的一些方法中都能找到原型,这里就不一一注释了

1、– initWithContentsOfFile:  //从文件加载图片

2、– initWithData:                  //用NSData对象初始化图片

3、– initWithData:scale:      //用NSData对象,指定的比例,初始化图片

4、– initWithCGImage:

5、– initWithCGImage:scale:orientation:

6、– initWithCIImage:

7、– initWithCIImage:scale:orientation:

绘画图片

1、– drawAtPoint:

//在指定的点开始绘画图片,这个点就是图片的做上角顶点

2、- (void)drawAtPoint:(CGPoint)point blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha

//在指定的点绘制整个图片,并使用自定义图片复合模式,并设置透明度

3、– drawInRect:

//在指定区域内绘制图片,可根据需要缩放图片

4、– drawInRect:blendMode:alpha:

//参照上面第二条

5、– drawAsPatternInRect:

//在指定区域内,平铺图片

image的属性

  imageOrientation   //图片的方向

   size   //图片的大小size

   scale   //图片的比例

   resizingMode  //图片变化方式

   CGImage  //潜在的Quartz image

   CIImage  //潜在的Core Image

   images  //返回一个由图片组成的数组,针对于由一组图片生成的动态图片

   duration  //返回动态图片持续的时间(即动态图片播放一遍的时间)

   capInsets  //图片上选定的区域

   alignmentRectInsets  //图片平铺的区域

iOS自带的提供了一个API如下

[html] view plaincopy

NSData *UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality);   

在Iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需要图片引用作为参数.通过在实际使用过程中,比较发现: UIImagePNGRepresentation(UIImage* image) 要比UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的图片数据量大很多.譬如,同样是读取摄像头拍摄的同样景色的照片, UIImagePNGRepresentation()返回的数据量大小为199K ,而 UIImageJPEGRepresentation(UIImage* image, 1.0)返回的数据量大小只为140KB,比前者少了50多KB.如果对图片的清晰度要求不高,还可以通过设置 UIImageJPEGRepresentation函数的第二个参数,大幅度降低图片数据量.譬如,刚才拍摄的图片, 通过调用UIImageJPEGRepresentation(UIImage* image, 1.0)读取数据时,返回的数据大小为140KB,但更改压缩系数后,通过调用UIImageJPEGRepresentation(UIImage* image, 0.5)读取数据时,返回的数据大小只有11KB多,大大压缩了图片的数据量 ,而且从视角角度看,图片的质量并没有明显的降低.因此,在读取图片数据内容时,建议优先使用UIImageJPEGRepresentation,并可根据自己的实际使用场景,设置压缩系数,进一步降低图片数据量大小。

[html] view plaincopy

UIImage *imageNew = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 

imageNew = [self imageWithImage:imageNew scaledToSize:CGSizeMake(100, 100)]; 

NSData *imageData = UIImageJPEGRepresentation(imageNew, 0.0001); 

  

m_selectImage = [UIImage imageWithData:imageData]; 

.h具体code

 

[html] view plaincopy

#import <Foundation/Foundation.h> 

  

@interface UIImage (UIImageExt) 

  

- (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size; 

  

- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize; 

@end

.m具体code

[html] view plaincopy

#import "UIImageExt.h" 

  

  

@implementation UIImage (UIImageExt) 

  

- (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size{ 

    // 创建一个bitmap的context 

    // 并把它设置成为当前正在使用的context 

    UIGraphicsBeginImageContext(size); 

    // 绘制改变大小的图片 

    [img drawInRect:CGRectMake(0, 0, size.width, size.height)]; 

    // 从当前context中创建一个改变大小后的图片 

    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 

    // 使当前的context出堆栈 

    UIGraphicsEndImageContext(); 

    // 返回新的改变大小后的图片 

    return scaledImage; 

  

  

  

- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize 

    UIImage *sourceImage = self

    UIImage *newImage = nil

    CGSize imageSize = sourceImage.size; 

    CGFloat width = imageSize.width; 

    CGFloat height = imageSize.height; 

    CGFloat targetWidth = targetSize.width; 

    CGFloat targetHeight = targetSize.height; 

    CGFloat scaleFactor = 0.0; 

    CGFloat scaledWidth = targetWidth; 

    CGFloat scaledHeight = targetHeight; 

    CGPoint thumbnailPoint = CGPointMake(0.0,0.0); 

      

    if (CGSizeEqualToSize(imageSize, targetSize) == NO

    

        CGFloat widthFactor = targetWidth / width; 

        CGFloat heightFactor = targetHeight / height; 

          

        if (widthFactor > heightFactor) 

            scaleFactor = widthFactor; // scale to fit height 

        else

            scaleFactor = heightFactor; // scale to fit width 

        scaledWidth  = width * scaleFactor; 

        scaledHeight = height * scaleFactor; 

          

        // center the image 

        if (widthFactor > heightFactor) 

        

            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 

        

        else

            if (widthFactor < heightFactor) 

            

                thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; 

            

    

      

    UIGraphicsBeginImageContext(targetSize); // this will crop 

      

    CGRect thumbnailRect = CGRectZero; 

    thumbnailRect.origin = thumbnailPoint; 

    thumbnailRect.size.width  = scaledWidth; 

    thumbnailRect.size.height = scaledHeight; 

      

    [sourceImage drawInRect:thumbnailRect]; 

      

    newImage = UIGraphicsGetImageFromCurrentImageContext(); 

    if(newImage == nil

        NSLog(@"could not scale image"); 

      

    //pop the context to get back to the default 

    UIGraphicsEndImageContext(); 

    return newImage; 

  <br>/** 返回一张经过处理的图片*/<br>+ (UIImage *)createCompressesImageWithName:(NSString *)imageName<br>{<br>    <br>    UIImage *newImage = [UIImage imageWithImageSimple:[UIImage imageWithName:imageName] scaledToSize:[UIImage imageWithName:imageName].size];<br><br>    return newImage;<br>}<br>

@end

时间: 2024-08-04 14:36:38

UIImage类方法总结及UIImage生成方法对比的相关文章

IOS UIImage类方法总结

IOS中对图片的处理 UIImage 相信做项目时肯定会有用到 UIImage 这个类,那我们就来看一下这个类中都有什么内容. 其实这篇文章就是在看文档的时候想记录一下文档中得方法. UIImage 继承于NSObject 下面介绍一下UIImage中的方法 首先是我们最常用的 通过图片的文件名来获取这个图片 + (UIImage *)imageNamed:(NSString *)name //要注意的是这个方法适用于已经导入到工程中的图片 创建新图片 1.+ (UIImage *)imageW

多个UIImage合并成一个UIImage

多个UIImage合并成一个UIImage 创建两个UIImage UIImage *image1 = [UIImage imageNamed:@"iOSDevTip"]; UIImage *image2 = [UIImage imageNamed:@"CodePush"]; 创建UIImage的方法有很多种,我们就简单的通过imageNamed:方法来创建. 合并之后的size CGSize size = CGSizeMake(image1.size.width

集合之equals与hashCode方法对比

一  equals equals方法是Object级的,默认对比两个对象的内存地址,很多类都重写了该方法,对比对象的实际内容,一般对比同一类对象相同属性的属性值是否相同. 二 hashCode 1.哈希表 哈希表是一个数组,数组中的每一个元素都是一个单向链表,同一单向链表中的节点具有相同的属性,属性值是数组的下标,这个相同的属性被称作hashCode哈希值. 2.hashCode哈希值的作用与意义 在hashCode产生前,检索集合需要逐个对比,查询效率低.如果根据某一属性将集合中属性值相同的元

河流逻辑结构图生成方法

河流逻辑结构图生成方法 ? ????某些时候为了显示河流之间的关系,需要生成河流的逻辑结构图.这种逻辑结构图有点像线网的逻辑结构,至需要显示基本的结构和连通关系,而不需要展示真实的空间地理位置.例如平常在地铁站内看到的地铁线路图,就是逻辑结构图. ????由于河流数据采集的时候本身就是真实的道理数据,要变成结构图,需要做一些特殊的处理.在ArcGIS里面,可以使用逻辑示意图扩展模块(Schematics)去生成,其生成的前提条件是先构建河流的集合网络.下面是河流逻辑结构图生成的步骤: 构建河流的

react系列-事件绑定的几种方法对比

前言 本文主要给大家介绍了关于React事件绑定的几种方法对比的相关呢荣,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. React事件绑定 由于类的方法默认不会绑定this,因此在调用的时候如果忘记绑定,this的值将会是undefined. 通常如果不是直接调用,应该为方法绑定this.绑定方式有以下几种: 1. 在构造函数中使用bind绑定this ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Button extends

JavaScript数组方法对比(深度学习数组)

JavaScript数组方法对比 众所周知,JavaScript提供了许多对数组进行改变的方法,但是有些会对原数组进行影响,有些不会.下边就列举出来. 一.新增 影响原数组 array.push()  //向数组的末尾添加一个或更多元素,并返回新的长度. var array =[1,2,3,4,5]; array.push(6); // [1,2,3,4,5,6]; array.unshift() //向数组的开头添加一个或更多元素,并返回新的长度. var array =[1,2,3,4,5]

[计算机漫谈]伪随机数生成方法

大家好.今天说点儿关于程序设计过程中产生随机数的方法. (一)JAVA伪随机数生成方法 随机数在程序设计过程中,特别是在实践环境模拟和测试等领域中得到很广泛的应用,我们在编程的过程中也时不时需要使用到随机数.计算机中的随机数,并不是真正的随机数,而是叫做"伪随机数",是计算机通过某种特别算法模拟产生的. 在JAVA语言中,我们可以通过Math类的random方法产生区间[0,1)的随机数,若要产生[a,a+b)之间的伪随机数,可以通过语句 a + b * Math.random();

git patch生成方法

先把修改commit掉,然后生产修改patch给提交代码的同事,具体操作步骤如下: 修改代码的同事: git format-patch al821_xxx origin/al821_xxx 会生成:0001-HQ00656135-xxx-al821_xxx.patch这样的patch文件 把这个patch给提交代码的同事 提交代码的同事,执行: git am 0001-HQ00656135-xxx-al821_xxx.patch 然后可以检查这个提交记录有没有问题,如果没有问题 执行git pu

C# 代码生成器 (存储过程生成方法)

最近研究C#,发现写代码很麻烦,特别是创建实体.模型.接口.工厂.存储过程之类,网上有些开源的,但是不完整,也不能完整的按需求生成,于是,花了三天的时候,结合前辈的一些经验,整合了一些代码生成器,以下是存储过程的生成方法,可以借鉴一下,水平有限,请多指教. 1 /// <summary> 2 /// 创建存储过程 3 /// </summary> 4 public string GetStorage(CodeTable codeTable) 5 { 6 7 Model.Server