相冊圖片選擇器
https://github.com/banchichen/TZImagePickerController
YYImage代替SDWebImage
http://blog.csdn.net/zhonggaorong/article/details/51283448
由URL獲取圖片(異步加載)
SDWebImage用法羞反,只需要提供一個(gè)下載的url和占位圖,就可以在回調(diào)里拿到下載后的圖片
- imageview控件使用
#import <SDWebImage/UIImageView+WebCache.h>
[imageview sd_setImageWithURL:[NSURL URLWithString:@"......"] placeholderImage:[UIImage imageNamed:@"placeholder"] completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
imageview.image = image;
NSLog(@"圖片加載完成");
}];
// 也可以圖片下載完成后,直接顯示下載后的圖片
[imageview sd_setImageWithURL:[NSURL URLWithString:@"....."]];
- Button控件使用
#import <SDWebImage/UIButton+WebCache.h>
[self.headBtn sd_setImageWithURL:[NSURL URLWithString:headImgUrl] forState:UIControlStateNormal placeholderImage:[UIImage imageNamed:@"登錄2"]];
由URL獲取圖片(同步加載)
NSString *imgurl = @".....";
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imgurl]];
UIImage *img3 = [UIImage imageWithData:data];
加載本地圖片
NSString *path = [[NSBundle mainBundle] pathForResource:@"xx" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:path];
或
NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:“png”];
NSData *image = [NSData dataWithContentsOfFile:filePath];
UIImage *image = [UIImage imageWithData:image];
加載方法的區(qū)別
imageWithContentsOfFile
:僅加載圖片讶坯,圖像數(shù)據(jù)不會緩存邓夕。適用于加載較大的圖片以及使用情況較少的場景赖捌,以降低內(nèi)存消耗概耻。
imageNamed
:在系統(tǒng)緩存中查找并返回一個(gè)圖片對象如果它存在的話寂汇。如果緩存中沒有找到相應(yīng)的圖片权逗,這個(gè)方法從指定的文檔中加載然后緩存并返回這個(gè)對象美尸。適用于圖片會頻繁的使用時(shí)。
圖片NSData轉(zhuǎn)換
1.//NSData轉(zhuǎn)換為UIImage
NSData *imageData = [NSData dataWithContentsOfFile: imagePath];
UIImage *image = [UIImage imageWithData: imageData];
2.//UIImage轉(zhuǎn)換為NSData
NSData *imageData = UIImagePNGRepresentation(image);
截屏
-(void)cutScreenPic{
//開啟上下文
CGSize imageSize = self.view.bounds.size;
UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0);
//將某個(gè)View的所有內(nèi)容渲染到圖形的上下文
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
//獲得圖片
UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
//保存
[UIImagePNGRepresentation(image) writeToFile:@"/Users/CC/Desktop/imageName.png" atomically:YES];
}
改變圖片渲染方式(設(shè)置Rander)
img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
壓縮圖片
/* 壓縮圖片至 指定像素 */
- (UIImage *)rescaleImageToPX:(CGFloat )toPX{
CGSize size = self.size;
if(size.width <= toPX && size.height <= toPX)
return self; // 圖片如果比指定像素小斟薇,不需壓縮
CGFloat scale = size.width / size.height; //比例
if(size.width > size.height){
size.width = toPX;
size.height = size.width / scale;
}
else{
size.height = toPX;
size.width = size.height * scale;
}
return [self rescaleImageToSize:size];
}
/* 壓縮圖片至 指定尺寸 */
- (UIImage *)rescaleImageToSize:(CGSize)size
{
CGRect rect = (CGRect){CGPointZero, size};
UIGraphicsBeginImageContext(rect.size);
[self drawInRect:rect];
UIImage *resImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resImage;
}
+ (UIImage *)compressImage:(UIImage *)imgSrc withSize:(CGSize)size {
UIGraphicsBeginImageContext(size);
CGRect rect = {{0,0}, size};
[imgSrc drawInRect:rect];
UIImage *compressedImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return compressedImg;
}
多選圖片
http://www.reibang.com/p/6181f32bb844
聊天泡泡尖角圖片
http://www.reibang.com/p/c6c645394b06
比較兩個(gè)圖片是否相等
- (BOOL)image:(UIImage *)image1 isEqualTo:(UIImage *)image2
{
NSData *data1 = UIImagePNGRepresentation(image1);
NSData *data2 = UIImagePNGRepresentation(image2);
return [data1 isEqual:data2];
}
圖片上傳
用AFN3.0進(jìn)行上傳操作
//首先壓縮圖片
NSData *imageData = UIImageJPEGRepresentation(_imageV.image, 0.1);
- (void)upLoad{
//1. 創(chuàng)建管理者對象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2. 地址师坎、參數(shù),用字典保存堪滨。不需要的可以省略胯陋。
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:_fireID,@"id",_longitude,@"longitude",_latitude,@"latitude", nil];
NSString *urlString = @“... ...”;//(后臺給你url)
//3. post請求
[manager POST:urlString parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// 在網(wǎng)絡(luò)開發(fā)中,上傳文件時(shí)不允許文件重名惶岭,解決方案:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyyMMddHHmmss"; // 設(shè)置時(shí)間格式
NSString *str = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@.png", str];
/*
此方法參數(shù):
1. 要上傳的[二進(jìn)制數(shù)據(jù)]
2. imgFile是對應(yīng)后臺給你url里面的圖片參數(shù)寿弱。
3. 要保存在服務(wù)器上的[文件名]
4. 上傳文件的[mimeType]
*/
[formData appendPartWithFileData:imageData name:@"imgFile" fileName:fileName mimeType:@"image/png"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
// 上傳進(jìn)度
NSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"請求成功:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"請求失敗:%@",error);
}];
}
判斷圖片類型
//封裝工具方法按灶。通過圖片Data數(shù)據(jù)第一個(gè)字節(jié) 來獲取圖片擴(kuò)展名
- (NSString *)contentTypeForImageData:(NSData *)data {
uint8_t c;
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return @"jpeg";
case 0x89:
return @"png";
case 0x47:
return @"gif";
case 0x49:
case 0x4D:
return @"tiff";
case 0x52:
if ([data length] < 12) {
return nil;
}
NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"])
{
return @"webp";
}
return nil;
}
return nil;
}
//外界調(diào)用
//假設(shè)這是一個(gè)網(wǎng)絡(luò)獲取的URL
NSString *path = @"http://pic.rpgsky.net/images/2016/07/26/3508cde5f0d29243c7d2ecbd6b9a30f1.png";
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]];
//調(diào)用獲取圖片擴(kuò)展名
NSString *string = [self contentTypeForImageData:data];
//輸出結(jié)果為 png
NSLog(@"%@",string);
在圖片上繪制文字
//自定義工具方法
- (UIImage *)imageWithTitle:(NSString *)title fontSize:(CGFloat)fontSize
{
//畫布大小
CGSize size=CGSizeMake(self.size.width,self.size.height);
//創(chuàng)建一個(gè)基于位圖的上下文
UIGraphicsBeginImageContextWithOptions(size,NO,0.0);//opaque:NO scale:0.0
[self drawAtPoint:CGPointMake(0.0,0.0)];
//文字居中顯示在畫布上
NSMutableParagraphStyle* paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
paragraphStyle.alignment=NSTextAlignmentCenter;//文字居中
//計(jì)算文字所占的size,文字居中顯示在畫布上
CGSize sizeText=[title boundingRectWithSize:self.size options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}context:nil].size;
CGFloat width = self.size.width;
CGFloat height = self.size.height;
CGRect rect = CGRectMake((width-sizeText.width)/2, (height-sizeText.height)/2, sizeText.width, sizeText.height);
//繪制文字
[title drawInRect:rect withAttributes:@{ NSFontAttributeName:[UIFont systemFontOfSize:fontSize],NSForegroundColorAttributeName:[ UIColor whiteColor],NSParagraphStyleAttributeName:paragraphStyle}];
//返回繪制的新圖形
UIImage *newImage= UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
拉伸圖片
例子:QQ會話窗口症革,氣泡的背景圖片拉伸
// 自定義工具方法
+ (UIImage *)resizeWithImage:(UIImage *)image{
CGFloat top = image.size.height/2.0;
CGFloat left = image.size.width/2.0;
CGFloat bottom = image.size.height/2.0;
CGFloat right = image.size.width/2.0;
return [image resizableImageWithCapInsets:UIEdgeInsetsMake(top, left, bottom, right)resizingMode:UIImageResizingModeStretch];
}
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode;
//此方法返回返回拉伸后的圖像鸯旁。第二個(gè)參數(shù)resizingMode是圖像拉伸模式:
UIImageResizingModeTile 平鋪 噪矛、UIImageResizingModeStretch, 拉伸
獲得灰度圖
+ (UIImage*)covertToGrayImageFromImage:(UIImage*)sourceImage
{
int width = sourceImage.size.width;
int height = sourceImage.size.height;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef context = CGBitmapContextCreate (nil,width,height,8,0,colorSpace,kCGImageAlphaNone);
CGColorSpaceRelease(colorSpace);
if (context == NULL) {
return nil;
}
CGContextDrawImage(context,CGRectMake(0, 0, width, height), sourceImage.CGImage);
CGImageRef contextRef = CGBitmapContextCreateImage(context);
UIImage *grayImage = [UIImage imageWithCGImage:contextRef];
CGContextRelease(context);
CGImageRelease(contextRef);
return grayImage;
}
由View生成圖片
- (UIImage *)makeImageWithView:(UIView *)view withSize:(CGSize)size
{
// 下面方法:第一個(gè)參數(shù) 表示區(qū)域大小。
第二個(gè)參數(shù) 表示是否非透明铺罢。半透明效果需要傳NO艇挨,否則傳YES。
第三個(gè)參數(shù) 是屏幕密度 [UIScreen mainScreen].scale韭赘。
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
獲取圖片中某點(diǎn)的RGB
- (UIColor *)colorAtPixel:(CGPoint)point {
// Cancel if point is outside image coordinates
if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), point)) {
return nil;
}
NSInteger pointX = trunc(point.x);
NSInteger pointY = trunc(point.y);
CGImageRef cgImage = self.CGImage;
NSUInteger width = self.size.width;
NSUInteger height = self.size.height;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
int bytesPerPixel = 4;
int bytesPerRow = bytesPerPixel * 1;
NSUInteger bitsPerComponent = 8;
unsigned char pixelData[4] = { 0, 0, 0, 0 };
CGContextRef context = CGBitmapContextCreate(pixelData,
1,
1,
bitsPerComponent,
bytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextSetBlendMode(context, kCGBlendModeCopy);
// Draw the pixel we are interested in onto the bitmap context
CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height);
CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage);
CGContextRelease(context);
// Convert color values [0..255] to floats [0.0..1.0]
CGFloat red = (CGFloat)pixelData[0] / 255.0f;
CGFloat green = (CGFloat)pixelData[1] / 255.0f;
CGFloat blue = (CGFloat)pixelData[2] / 255.0f;
CGFloat alpha = (CGFloat)pixelData[3] / 255.0f;
return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}
生成純色圖片
- (UIImage *)imageWithColor:(UIColor *)color {
// 描述矩形
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
// 開啟位圖上下文
UIGraphicsBeginImageContext(rect.size);
// 獲取位圖上下文
CGContextRef context = UIGraphicsGetCurrentContext();
// 使用color演示填充上下文
CGContextSetFillColorWithColor(context, [color CGColor]);
// 渲染上下文
CGContextFillRect(context, rect);
// 從上下文中獲取圖片
UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
// 結(jié)束上下文
UIGraphicsEndImageContext();
return theImage;
}
毛玻璃效果
根據(jù)bundle中的文件名讀取圖片
+ (UIImage *)imageWithFileName:(NSString *)name {
NSString *extension = @"png";
NSArray *components = [name componentsSeparatedByString:@"."];
if ([components count] >= 2) {
NSUInteger lastIndex = components.count - 1;
extension = [components objectAtIndex:lastIndex];
name = [name substringToIndex:(name.length-(extension.length+1))];
}
// 如果為Retina屏幕且存在對應(yīng)圖片缩滨,則返回Retina圖片,否則查找普通圖片
if ([UIScreen mainScreen].scale == 2.0) {
name = [name stringByAppendingString:@"@2x"];
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:extension];
if (path != nil) {
return [UIImage imageWithContentsOfFile:path];
}
}
if ([UIScreen mainScreen].scale == 3.0) {
name = [name stringByAppendingString:@"@3x"];
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:extension];
if (path != nil) {
return [UIImage imageWithContentsOfFile:path];
}
}
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:extension];
if (path) {
return [UIImage imageWithContentsOfFile:path];
}
return nil;
}
保存圖片到本地
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Image.png"];
[UIImagePNGRepresentation(image) writeToFile:filePath atomically:YES];
保存圖片到本地相冊
-(void)saveImage:(UIImage *)img{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
});
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
if(error != NULL){
[SVProgressHUD showNOmessage:@"保存失敗"];
}else{
[SVProgressHUD showYESmessage:@"保存成功"];
}
}
保存到新建相冊
https://blog.csdn.net/sdefzhpk/article/details/52763409
圖片合并
//圖片合成
+ (UIImage *)imageCombineImage:(UIImage *)useImage maskImage:(UIImage *)maskImage
{
UIGraphicsBeginImageContextWithOptions(useImage.size ,NO, 0.0);
[useImage drawInRect:CGRectMake(0, 0, useImage.size.width, useImage.size.height)];
//四個(gè)參數(shù)為水印圖片的位置
[maskImage drawInRect:CGRectMake(50, 50, 50, 50)];
//如果要多個(gè)位置顯示泉瞻,繼續(xù)drawInRect就行
//[maskImage drawInRect:CGRectMake(0, useImage.size.height/2, useImage.size.width, useImage.size.height/2)];
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultImage;
}
UIImage和Base64格式圖片相互轉(zhuǎn)化
/* 方法一 */
- (NSString *)encodeToBase64String:(UIImage *)image {
return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
- (UIImage *)decodeBase64ToImage:(NSString *)strEncodeData {
NSData *data = [[NSData alloc]initWithBase64EncodedString:strEncodeData options:NSDataBase64DecodingIgnoreUnknownCharacters];
return [UIImage imageWithData:data];
}
/* 方法二 */
- (BOOL) imageHasAlpha: (UIImage *) image {
CGImageAlphaInfo alpha = CGImageGetAlphaInfo(image.CGImage);
return (alpha == kCGImageAlphaFirst ||
alpha == kCGImageAlphaLast ||
alpha == kCGImageAlphaPremultipliedFirst ||
alpha == kCGImageAlphaPremultipliedLast);
}
- (NSString *) image2DataURL: (UIImage *) image {
NSData *imageData = nil;
NSString *mimeType = nil;
if ([self imageHasAlpha: image]) {
imageData = UIImagePNGRepresentation(image);
mimeType = @"image/png";
} else {
imageData = UIImageJPEGRepresentation(image, 1.0f);
mimeType = @"image/jpeg";
}
return [NSString stringWithFormat:@"data:%@;base64,%@", mimeType,
[imageData base64EncodedStringWithOptions: 0]];
}
- (UIImage *) dataURL2Image: (NSString *) imgSrc
{
NSURL *url = [NSURL URLWithString: imgSrc];
NSData *data = [NSData dataWithContentsOfURL: url];
UIImage *image = [UIImage imageWithData: data];
return image;
}
圖片處理
https://github.com/lisongrc/UIImage-Categories