說起UIImage我們應(yīng)該都不會陌生紫岩,平常用的也比較多但是發(fā)現(xiàn)我自己只是用到了最基本的一些操作,近來我也是看邊學(xué)習(xí)然后分享一些學(xué)到的東西精偿,擴(kuò)展下這方面的內(nèi)容棘劣。我將會分享學(xué)到一下方面知識:
1.圖片任意角度旋轉(zhuǎn)
2.圖片裁剪剪切
3.圖片拉伸
4.截屏
5 圖片添加文字及水印
1.圖片任意位置角度旋轉(zhuǎn)
其實(shí)說起圖片旋轉(zhuǎn),我們基本都會想到講UIImageVIew frame旋轉(zhuǎn)一定角度至扰,這個其實(shí)是旋轉(zhuǎn)圖片所在視圖的View鳍徽,但是我們這個圖片旋轉(zhuǎn)是旋轉(zhuǎn)圖片本身,而不是旋轉(zhuǎn)View敢课。
下面就看具體代碼實(shí)現(xiàn)阶祭,改加注釋的地方我基本上都加了注釋
先看下效果圖,由于旋轉(zhuǎn)之后超出圖片原有尺寸范圍部分看不到了直秆,所以圖片旋轉(zhuǎn)之后會可視范圍越來越小最后是個正多邊形了:
//
// UIImage+ImageRotate.m
// UIImageViewExtend
//
// Created by penglei on 2017/11/14.
// Copyright ? 2017年 penglei. All rights reserved.
//
#import "UIImage+ImageRotate.h"
#import <QuartzCore/QuartzCore.h>
#import <Accelerate/Accelerate.h>
@implementation UIImage (ImageRotate)
/**
將圖片內(nèi)容本身旋轉(zhuǎn)一定角度濒募,不是旋轉(zhuǎn)將UIImageView視圖旋轉(zhuǎn)
@param degree 旋轉(zhuǎn)的弧度 比如旋轉(zhuǎn)45度應(yīng)該傳入 45*3.14/180
@return 返回旋轉(zhuǎn)成功后的圖片
*/
- (UIImage *)imageRoateInegree:(float)degree {
//圖片實(shí)際像素 等于圖片像素 *放大因子scale
size_t width = (size_t)self.size.width * self.scale;
size_t height = (size_t)self.size.height * self.scale;
//表示每行圖片字節(jié)數(shù)
size_t bytesRerRow = width * 4;
CGImageAlphaInfo alphaInfo = kCGImageAlphaPremultipliedFirst;
//配置上下文參數(shù)
/*
第一個參數(shù) 要渲染的繪制內(nèi)存地址,這個內(nèi)存塊的大小至少是(bytesPerRow*height)個字節(jié)圾结。如果傳空值瑰剃,則是由上下文自動分配的
第二個參數(shù) 實(shí)際寬度像素
第三個參數(shù) 實(shí)際像素高度
第四個參數(shù) 內(nèi)存中像素每個組件位數(shù) 對于32位像素格式和RGB 顏色空間,你應(yīng)該將這個值設(shè)為8.
第五個參數(shù) 每行所占字節(jié)數(shù)
第六個參數(shù) 上下文使用的顏色空間
第七個參數(shù) alpha通道 指定bitmap是否包含alpha通道筝野,像素中alpha通道的相對位置
**/
CGContextRef imageContext = CGBitmapContextCreate(NULL, width, height, 8, bytesRerRow, CGColorSpaceCreateDeviceRGB(), kCGBitmapByteOrderDefault | alphaInfo);
if (!imageContext) {
return nil;
}
CGContextDrawImage(imageContext, CGRectMake(0, 0, width, height), self.CGImage);
/**
旋轉(zhuǎn)圖片
ARGB88 表示32位像素RGB位圖 正好對應(yīng)上面?zhèn)魅氲慕M件位數(shù) 8
第一個參數(shù) 旋轉(zhuǎn)之前圖片
第二個參數(shù) 旋轉(zhuǎn)之后圖片
第三個參數(shù) 緩沖區(qū)晌姚,當(dāng)需要相當(dāng)短的時間內(nèi)頻繁調(diào)用函數(shù),或者需要實(shí)時
*性能保證(使鎖問題)那么你應(yīng)該分配自己的臨時緩沖區(qū)遗座∫荩可傳空,有上下文自己分配
第四個參數(shù) 旋轉(zhuǎn)角度
第五個參數(shù) 背景顏色
第六個參數(shù) 填充顏色
*/
uint8_t *imagedata = (uint8_t *)CGBitmapContextGetData(imageContext);
vImage_Buffer src = {imagedata,height,width,bytesRerRow};
vImage_Buffer dest = {imagedata,height,width,bytesRerRow};
//白色
Pixel_8888 backColor = {0,0,0,0};
vImageRotate_ARGB8888(&src, &dest,NULL,degree, backColor, kvImageBackgroundColorFill);
CGImageRef rotateImageRef = CGBitmapContextCreateImage(imageContext);
UIImage *rotateImage = [UIImage imageWithCGImage:rotateImageRef scale:self.scale orientation:self.imageOrientation];
CFRelease(rotateImageRef);
return rotateImage ;
}
@end
注意:1. 需要倒入頭文件<QuartzCore/QuartzCore.h> <Accelerate/Accelerate.h>
- 如果運(yùn)行過程中報(bào)錯
CGBitmapContextCreate: unsupported parameter combination: set CGBITMAP_CONTEXT_LOG_ERRORS environmental variable to see the details 請檢查CGImageAlphaInfo alphaInfo = kCGImageAlphaPremultipliedFirst途蒋;是否配置正確猛遍。
題外話:我也是邊看邊學(xué),不知不覺已經(jīng)快凌晨一點(diǎn)了剩下的明天夜晚再補(bǔ)充吧号坡。先晚安??