IOS UIImage类方法总结

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;
}  

@end

  

时间: 2024-12-19 12:10:38

IOS UIImage类方法总结的相关文章

iOS UIImage(转载)

UIImage 是一种比较有难度的显示图片的方式,UIImage 可以从文件或者 ImageData 中来显示图片. 如果可以图形化操作,建议使用 ImageView 这个 Control 来显示图片,毕竟是图形化可视操作. 当从 ImageData 中创建图片的时候,一定要注意图片的大小和尺寸,因为这样是存在内存中,如果图片过大或者图片过多,很容易引起内存泄漏:如果是从 文件 中选择图片,则可以手工选择图片是否缓存在内存中. UIImage 支持的图片类型有:tiff,tif,jpg,jpeg

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

1.UIImage 生成方法的对比 Apple官方的文档为生成一个UIImage对象提供了两种方法: 1. imageNamed,其参数为图片的名字:优点:加载时会缓存图片,用于图片的频繁使用:缺点:占用内存 2. imageWithContentsOfFile,其参数也是图片文件的路径.优点:仅加载图片,不会缓存,用于价值次数较少的情况,降低内存消耗 那么两种有什么区别吗? 肯定是有的.根据Apple的官方文档: imageNamed: 这个方法用一个指定的名字在系统缓存中查找并返回一个图片对

iOS UIimage的拉伸的三种方法

第一种方法 // - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight __TVOS_PROHIBITED; //leftCapWidth:左边不拉伸区域 //topCapHeight:上面不拉伸区域 UIImage *image =[UIImageimageNamed:@"chatdetail_info_other"]; UI

ios uiimage初始化时的两种方法

第一种方式:UIImage *image = [UIImage imageNamed:@"image"]; 使用这种方式,第一次读取的时候,先把这个图片存到缓存里,下次再使用时直接从缓存中读取:优点:只有第一次使用的时候稍慢,接下来在使用就会稍快:缺点:如果在当前工程中只使用一次会浪费内存. 第二种方式:initWithContentsOfFiles初始化时,每次都会根据路径去读取,不会占用内存,如果图片在当前工程中只使用一次,应该选择这个方法.

iOS UIImage 使用resizableImageWithCapInsets 适配UIImageView

//定义要选取图片的那一部分进行伸展,这个Inset就是图片的一部分,类似于截图工具中的rect,一定要全都是图片的内容层 UIEdgeInsets inset; inset.top = 0; inset.left = 5; inset.right = 35; inset.bottom = 0; // 本文选择的图片sender.png大小是40*40 UIImage *newImage = [[UIImage imageNamed:@"sender"] resizableImageW

iOS UIImage 拉伸问题 (适用于UIButton等需要局部拉伸的情况)

图片 有的切图切很大 还占用ipa大小,有时候 切图 只需要 局部或者说 一个压缩的图片的抽象状态 直接上代码 CGFloat top = 10; // 顶端盖高度 CGFloat bottom = 10 ; // 底端盖高度 CGFloat left = 10; // 左端盖宽度 CGFloat right = 10; // 右端盖宽度 UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right); [optionButton

IOS—静态方法(类方法)和实例方法

1.实例方法/动态方法 a).标识符:- b).调用方式:(实例对象    函数) c).实例方法在堆栈上. 2.静态方法/类方法 a).标识符:+ b).调用方式:(类    函数) c).静态方法在堆上分配内存. 3.静态方法和实例方法的区分 a).静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存.事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载.调用的速度基本上没有差别. b).静态方法在堆上分配内存,实例方法在堆栈上.事实上所

IOS - UIImage加载内存性能比较

+ (UIImage )imageNamed:(NSString )name + (UIImage )imageNamed:(NSString )name 这种加载会有缓存,图片所占用的内存会一直停留在程序中,name是图片文件名 UIImage *textviewBackgroundImage= [[UIImage imageNamed:@"service_textview_background.png"] + (UIColor )colorWithPatternImage:(UII

IOS UIImage 模糊

#import <UIKit/UIKit.h> #import <Accelerate/Accelerate.h> #import <QuartzCore/QuartzCore.h> @interface UIImage (Blur) // 0.0 to 1.0 - (UIImage*)blurredImage:(CGFloat)blurAmount; @end #import "UIImage+Blur.h" @implementation UII