UIImag 构造方式
UIImag 构造方式大致有 4 种方式
- 从本地 bundle 中加载
imageNamed:
,传入一个 bundle 的文件名即可 - 从本地一个文件路径读取
imageWithContentsOfFile:
,需要传一个文件的文件路径 path - 通过二进制数据
NSData
来创建imageWithData:
* 通过一个CoreGraphics
的CGImageRef
来创建,initWithCGImage:
* 通过一个CoreImage
的CIImage
来创建initWithCIImage
通过查阅 Apple 官网文档我们发现有 2 个这样的方法,今天就来一探究竟
1 | + (UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0); |
2 个类方法 2 个实例方法都是类似,这里以 CGImageRef
为例
1 | + (UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0); |
新建的 Xcode 工程选择 single Application
在 storyboard 中拖一个
UIImageView
设置它水平垂直居中对齐,宽带高度随便设一个值不要太大就行,设置UIImageView
的contentMode
为Aspect Fit
方便查看以免变形在
UIImageView
下发放一个UIButton
控件方便后面好对图片进行旋转操作在 viewController 中建立一个
UIImageView
引用,拉出一个 rotate 按钮的IBAction
现在大概界面大概这样
下面我们实现
- (IBAction)rotateImage:(id)sender {}
这个方法
在这里我们想通过点击按钮实现图片旋转
为了方便使用我们使用 Category 的方式实现
新建一个 UIImage 的分类取名叫 Rotate
这里需要传一张要处理的图片和一个待处理成的图片方向
1 | + (UIImage *)rotateImage:(UIImage *)oldImage |
1 | + (UIImage *)rotateImage:(UIImage *)oldImage orientation:(UIImageOrientation)orientation{ |
在 button 点击事件触发时的这样使用
1 | - (IBAction)rotateImage:(id)sender { |
点击按钮测试发现第一次没问题,但是重逢点击无效
原来 + (UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation
方法执行原理是执行前通过 @property(nonatomic,readonly) UIImageOrientation imageOrientation;
接口先判断当前图片的方向是否为将要旋转的方向,如果是就直接返回不做处理,如果不是再作旋转处理,也就是说这个方法并没有实际上旋转 image 的数据,只是用一个枚举标记旋转的状态
如果我们想每次旋转需要直接改变原始 image 的数据该怎么办呢?
在这里我们通过 CGBitmapContext
,使用 CGContextRotateCTM
来设置旋转,再把 UIImage 通过 drawInRect
重新绘制出来,通过 UIGraphicsGetImageFromCurrentImageContext
获得处理后的图片
下面是具体实现
1 | - (UIImage *)fixedRotation{ |
现在再优化一下原来 + (UIImage *)rotateImage:(UIImage *)oldImage orientation:(UIImageOrientation)orientation
方法,修改成这样
1 | + (UIImage *)rotateImage:(UIImage *)oldImage orientation:(UIImageOrientation)orientation{ |
现在再测试一下,well,It‘s OK。
have fun!!!
参考资料
- UIImageOrientation / EXIF orientation sample images
- Apple-UIImage Class Reference
- ios-uiimageview-how-to-handle-uiimage-image-orientation
备注:欢迎转载,但请一定注明出处! http://blog.wangruofeng007.com