目录

UIImage的加载方式

使用类方法imageNamed:创建

UIImage *image = [UIImage imageNamed:@"ganggang"];   

使用imageNamed:初始化的时候,会先检查缓存中是否存在名为“ganggang”的照片,如不存在,图片首先会被缓存起来,然后才返回要加载的图片对象;如果存在,直接返回要加载的照片对象。

解析:

  1. 该方法会自动地做缓存,一般用于给控件添加素材图片,比如背景图片、placeHolder等。
  2. 大量使用( imageNamed: )会使得占用的内存增加,消耗内存

使用类方法imageWithContentsOfFile:创建

UIImage *image = [UIImage imageWithContentsOfFile:path];   

path是需要加载照片的路径,使用imageWithContentsOfFile:创建UIImage的时候,是直接从磁盘上加载。当收到内存警告时,UIImage对象会被释放,下一次绘图的时候,需要重新加载。 **解析:

  1. 该方法不会做缓存,如果该方法通过 path 能找到对应的文件名, 就返回这个文件的路径;如果找不到, 就返回nil;
  2. 对于大量频繁使用的图片,使用( imageWithContentsOfFile: )方法,虽然内存也会增长很快,但使用完之后就会降下来,不会持续占用大量内存,造成内存的消耗**。

使用类方法imageWithData:创建

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.superqq.com/images/getqrcode.jpg"]];
UIImage *image =[UIImage imageWithData:data]; 

data是照片数据,一般是请求返回的,然后通过imageWithData:创建UIImage。

使用类方法imageWithCGImage:创建

+(UIImage *)imageWithCGImage:(CGImageRef)cgImage;
UIImage *image = [UIImage imageWithCGImage:cgImage]; 

cgImage是定义在QuartzCore框架中的一个结构体指针。这个结构用来创建像素位图,可以通过操作存储的像素位来编辑图片。

使用类方法imageWithCIImage:创建

+(UIImage *)imageWithCIImage:(CIImage *)ciImage
 UIImage *image = [UIImage imageWithCGImage:ciImage];  

CIImage是CoreImage框架中最基本代表图像的对象,在CIImage被CIContext渲染出来之前,他是依赖于滤镜链的,滤镜是不会更改CIImage中的图像数。

图片的压缩处理

图片的压处理

对于“压”的功能,我们可以使用UIImageJPEGRepresentation或UIImagePNGRepresentation方法实现,如:

NSData *imgData = UIImageJPEGRepresentation(image, 0.5);

第一个参数是图片对象,第二个参数是压的系数,其值范围为0~1。

关于关于PNG和JPEG格式压缩

  • UIImageJPEGRepresentation 函数需要两个参数:图片的引用和压缩系数而 UIImagePNGRepresentation只需要图片引用作为参数.
  • UIImagePNGRepresentation(UIImage \*image)要比UIImageJPEGRepresentation(UIImage* image, 1.0)返回的图片数据量大很多.
  • 如果对图片的清晰度要求不是极高,建议使用UIImageJPEGRepresentation,可以大幅度降低图片数据量.比如,刚才拍摄的图片,通过调用UIImageJPEGRepresentation(image, 1.0)读取数据时,返回的数据大小为140K,但更改压缩系数为0.5再读取数据时,返回的数据大小只有11K,大大压缩了图片的数据量,而且清晰度并没有相差多少,图片的质量并没有明显的降低。因此,在读取图片数据内容时,建议优先使用UIImageJPEGRepresentation,并可根据自己的实际使用场景,设置压缩系数,进一步降低图片数据量大小。
  • 提示:压缩系数不宜太低,通常是0.3~0.7,过小则可能会出现黑边等

把图片压缩到指定大小(kb)

代码如下:

UIImage *image=[UIImage imageNamed:@"xxoo.jpeg"]; 
    NSData  *imageData=UIImageJPEGRepresentation(image, 1.f); 
    CGFloat size=40.f;// kb 
    CGFloat scale=size/(imageData.length/1024); 
    NSData *newData=UIImageJPEGRepresentation(image, scale);

图片“缩”处理

通过[sourceImage drawInRect:CGRectMake(0, 0, targetWidth, targetHeight)]可以进行图片“缩”的功能。如下是笔者对图片尺寸缩的api:

- (UIImage*)scaleFromImage:(UIImage*)image scaledToSize:(CGSize)newSize
{
 CGSize imageSize = image.size;
 CGFloat width = imageSize.width;
 CGFloat height = imageSize.height;
     
 if (width <= newSize.width && height <= newSize.height){
  return image;
 }
     
 if (width == 0 || height == 0){
  return image;
 }
     
 CGFloat widthFactor = newSize.width / width;
 CGFloat heightFactor = newSize.height / height;
 CGFloat scaleFactor = (widthFactor<heightFactor?widthFactor:heightFactor);
     
 CGFloat scaledWidth = width * scaleFactor;
 CGFloat scaledHeight = height * scaleFactor;
 CGSize targetSize = CGSizeMake(scaledWidth,scaledHeight);
     
  UIGraphicsBeginImageContext(targetSize);
  [image drawInRect:CGRectMake(0,0,scaledWidth,scaledHeight)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

我们对图片只“压”而不缩,有时候是达不到我们的需求的。因此,适当地对图片“缩”一“缩“尺寸,就可以满足我们的需求。


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!


hetaodie

Mobile development

简单,深入的研究移动客户端开发技术"