1、图片显示相关

  1)、图片聊天背景拉伸不失真

  2)、捏合、双击、下拉缩放

  3)、Banner、相册

  4)、动画

2、图片操作相关

  1)、获取、下载图片(分享、传图片用)

  2)、保存UIImage到本地

  3)、绘制、解压图片

    3-1)、用原尺寸绘制

    3-2)、修改大小绘制,免得每次拿原始大图片缩放显示

  4)、压缩图片

0、写在前面

  1)、图片,显示模式为缩放以充满全屏,需要注意,剪切超出View的部分,否则有时有问题。

self.photoImgV.contentMode = UIViewContentModeScaleAspectFill;
self.photoImgV.clipsToBounds = YES;

  2)、加载网络图片,更新 imageView 尺寸。因为涉及缩放,所以要按比例算高度。

// 缩放,宽度为 SCREEN_WIDTH
self.goodsDetailImgV.contentMode = UIViewContentModeScaleAspectFit;
// 网图加载成功,按比例更新高度
[self.goodsDetailImgV sd_setImageWithURL:[NSURL URLWithString:data[@"pic"]] placeholderImage:[UIImage imageNamed:@"default_image"] completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
[self.goodsDetailImgV mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo( (SCREEN_WIDTH/image.size.width) * image.size.height );
}];
}];

1、图片显示相关

  1)、图片聊天背景拉伸不失真

    1-1)、方法1,比较老的

UIImage *originalImage = [UIImage imageNamed:@"sub.png"];
finalImage = [originalImage stretchableImageWithLeftCapWidth:originalImage.size.width/2 topCapHeight:0];

    1-2)、方法2,比较新的

UIImage *originalImg = [UIImage imageNamed:@"sub"];

CGFloat protectH = originalImg.size.height/2;
CGFloat protectW = originalImg.size.width/2; UIEdgeInsets protectEdg = UIEdgeInsetsMake(protectH, protectW, protectH, protectW); UIImage *finalImg = [originalImg resizableImageWithCapInsets:protectEdg resizingMode:UIImageResizingModeStretch];

  后续补充:

    根据情况,设置 Insets ,不一定都要取中点。意义为,分别保护 {0, 0, 0, 0} 到 {top, left, bottom, right} 距离的图片。

  2)、捏合、双击、下拉缩放

    2-1)、捏合缩放

      1)、设置最大、最小缩放比例

scrollview.maximumZoomScale = 2.0;
scrollview.minimumZoomScale = 0.5;

      2)、设置代理

scrollview.delegate = self;

      3)、添加上ImageView  

imageView.tag = 101;
[scrollview addSubview:imageView];

      4)、给代理要缩放的View(不一定要添加上才可以缩放,可以缩放不在本 scrollview 的View,效果就很奇葩了)

- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
UIImageView *imageView = [scrollView viewWithTag:101];
return imageView;
}

    2-2)、双击缩放  

      0)、需要注意的地方:

        0-1)、scrollView要设最大/小缩放比例!

        0-2)、因为图片层在最上面,且默认不可交互,所以,图片的View记得userInteractionEnabled = YES 。

        0-3)、ScrollView需要缩小尺寸,重设contentsize的时候,如删除某照片,要先清掉超出的的控件、数据。否则拉到底,弹性的时候,还能看到之前的。

      1)、scrollView才可以缩放,所以要把ImageView加在scrollView,给scrollView添加手势识别。

UITapGestureRecognizer *imageTwoTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(twoTapAction:)];
imageTwoTap.numberOfTapsRequired = 2;
[scrollView addGestureRecognizer: imageTwoTap];

      2)、第一次点哪放大哪,第二次恢复原来大小

#define SCALE_WIDTH  60    		//要放大的局部宽度大小
#define SCALE_HEIGHT 60 //要放大的局部高度大小 -(void)twoTapAction:(UITapGestureRecognizer *)tap
{
UIScrollView *scrollView = (UIScrollView *)tap.view;
if (scrollView.zoomScale != 1.0)
{
[scrollView setZoomScale:1.0 animated:YES];
}
else
{
CGPoint tapPoint = [tap locationInView:scrollView];
[scrollView zoomToRect:CGRectMake(tapPoint.x-SCALE_WIDTH/2, tapPoint.y-SCALE_HEIGHT/2, SCALE_WIDTH, SCALE_HEIGHT) animated:YES];
}
}

      3)、需要给代理放大、缩小的ImageView

- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
if ([[scrollView viewWithTag:1000] isMemberOfClass:[UIImageView class]])
{
return [scrollView viewWithTag:1000];
}
return nil;
}

    2-3)、下拉缩放

    //根据手势位置缩放、移动view,判断所在位置需要返回,待补充

  3)、Banner、相册

      1)、图片移动、

  4)、动画

    参照《iOS:动画》 -> "0、写在前面" -> "4)、UIImageView 有自带的动画属性、方法:"

2、图片操作相关

  1)、获取、下载图片(分享、传图片用)

    1-1)、从 SDWebImage 缓存取

SDWebImageManager *manager = [SDWebImageManager sharedManager];

[manager diskImageExistsForURL:url completion:^(BOOL isInCache) {
UIImage *img = nil;
if (isInCache) {
// 有,直接取
img = [[manager imageCache] imageFromDiskCacheForKey:url.absoluteString];
}else{
// 无,下载
}
}];

    1-2)、下载

      1)、同步加载图片(仅做了解)

NSData *imgData = [NSData dataWithContentsOfURL:url];
UIImage *image = [[UIImage alloc] initWithData:imgData];

      2)、异步加载图片(仅做了解)

- (void)loadImageFromWebWithURL:(NSURL*)url
{
dispatch_queue_t queue = dispatch_queue_create("test", NULL);
dispatch_async(queue, ^{
// 获取数据
NSData *data = [NSData dataWithContentsOfURL:url];
// 主线程
dispatch_sync(dispatch_get_main_queue(), ^{
UIImage *image = [UIImage imageWithData:data];
});
});
}

      3)、SDWebImageDownloader 直接下载

SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];

[downloader downloadImageWithURL:url
options:SDWebImageDownloaderHighPriority
progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
// 进度
} completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
// 完成
}];

  2)、保存UIImage到本地

    2-1)、弄成data

// UIImage 转换成 data、图片 保存
UIImage *img = [UIImage imageNamed:@"test"]; //png格式
NSData *imageData = UIImagePNGRepresentation(img); //JEPG格式
NSData *imageData = UIImageJPEGRepresentation(img,1.0);

    2-2)、写入

      1)、直接写入

NSString *cashesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) firstObject];

// png,data写入
[imageData writeToFile:[cashesPath stringByAppendingPathComponent:@"image1.png"] atomically:YES]; // jpg,data写入
[imageData writeToFile:[cashesPath stringByAppendingPathComponent:@"image1.jpg"] atomically:YES];

      2)、用fileManage写入

NSFileManager *fileManager = [NSFileManager defaultManager];

NSString *cashesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) firstObject];

// 将图片保存为PNG格式
[fileManager createFileAtPath:[cashesPath stringByAppendingString:@"/image2.png"] contents:imageData attributes:nil]; // 将图片保存为JPEG格式
[fileManager createFileAtPath:[cashesPath stringByAppendingString:@"/image2.jpg"] contents:imageData attributes:nil];

  补充:测试后,无论 data 还是 fileManage 写入,同格式大小一致。如 image1.png 和 image2.png 。image1.jpg 和image2.jpg。

  3)、绘制、解压图片

    3-1)、用原尺寸绘制

UIGraphicsBeginImageContextWithOptions(image.size, YES, 0);
[image drawAtPoint:CGPointZero];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

  补充:意义不大,文件太大。目的是为了及时解压、刷新UI、且不改变原图片?

    3-2)、修改大小绘制,免得每次拿原始大图片缩放显示

UIGraphicsBeginImageContextWithOptions(size, YES, 0);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

  补充:1、注意size的设置。

        1)、如果是按原图片的size比例,最大一边为1280,绘制没问题。

        2)、如果是按显示控件 UIImageView 等固定size绘制,可能会出现,图片变形以填充满size。

     2、UIGraphicsBeginImageContextWithOptions(size, YES, 0) 会比 UIGraphicsBeginImageContext(size) 效果好。

  4)、压缩图片

// 最大边长
#define kMaxLength 1280.0
// JPG格式压缩质量 0 - 1
#define kJPGCompressionQuality 0.5 #pragma mark - 根据宽高压缩图片
- (UIImage*)imageWithImage:(UIImage*)originalImage scaleToSize:(CGSize)finalSize{
UIGraphicsBeginImageContextWithOptions(finalSize, YES, 0);
[originalImage drawInRect:CGRectMake(0, 0, finalSize.width, finalSize.height)];
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return finalImage;
} #pragma mark - 压缩一张图片 自定义最大宽高
- (UIImage*)imageWithImage:(UIImage*)originalImage maxLength:(CGFloat)maxLength{
CGFloat originalImageW = originalImage.size.width;
CGFloat originalImageH = originalImage.size.height;
//宽高比
// CGFloat aspectRatio = originalImageW / originalImageH;
CGFloat finalImageW = originalImageW;
CGFloat finalImageH = originalImageH; if(originalImageW > maxLength || originalImageH > maxLength){
//超过设置的最大宽度 判断那个边最长
if(originalImageW > originalImageH){
//宽度大于高度
finalImageW = maxLength;
finalImageH = (maxLength * originalImageH)/originalImageW;
}else{
finalImageH = maxLength;
finalImageW = (maxLength * originalImageW)/originalImageH;
}
} UIImage *finalImage = [self imageWithImage:originalImage scaleToSize:CGSizeMake(finalImageW, finalImageH)];
NSData *finalImageData = nil;
if (UIImagePNGRepresentation(finalImage) == nil) {
finalImageData = UIImageJPEGRepresentation(finalImage, kJPGCompressionQuality);
}else{
finalImageData = UIImagePNGRepresentation(finalImage);
} return [UIImage imageWithData:finalImageData];
} #pragma mark - 压缩多张图片 自定义最大宽高
- (NSArray<UIImage*>*)imageArrayWithImageArray:(NSArray<UIImage*>*)originalImageArray maxLength:(CGFloat)maxLength{
NSMutableArray *finalImageArray = [NSMutableArray array];
for (int i = 0; i<originalImageArray.count; i++) {
UIImage *finalImage = [self imageWithImage:originalImageArray[i] maxLength:maxLength];
[finalImageArray addObject:finalImage];
}
return finalImageArray;
} #pragma mark - 压缩一张图片 最大宽或高1280
- (UIImage*)imageWithImage:(UIImage*)image{
return [self imageWithImage:image maxLength:kMaxLength];
} #pragma mark - 压缩多张图片 最大宽或高1280
- (NSArray<UIImage*>*)imageArrayWithImageArray:(NSArray<UIImage*>*)imageArr{
return [self imageArrayWithImageArray:imageArr maxLength:kMaxLength];
}

  补充:   

    1、在方法 - (UIImage*)imageWithImage:(UIImage*)originalImage maxLength:(CGFloat)maxLength

      不管尺寸是否低于设定的最大宽高,都会被绘制,可选择优化。

    2、修改自《iOS-微信分享多张图片(UIActivityViewController多图分享和多图分享失败)》  -- ZFJ_张福杰   CSDN

iOS:图片相关(18-02-12更)的更多相关文章

  1. iPhone/iOS图片相关(读取、保存、绘制、其它相关)

    http://blog.csdn.net/jerryvon/article/details/7526147 20:50:42 一.读取图片 1.从资源(resource)读取 UIImage* ima ...

  2. 实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面

    简介 一个简单的关于页面,有一个图片,版本号,App名称等,着重演示各个系列的文章完整集成示例. 动机与意义 这是系列文章的最后一篇.今天抽空写下,收下尾.文章本身会在第四篇的基础上,简单扩充下代码, ...

  3. 实现iOS图片等资源文件的热更新化(零): 序

    必要的序 以后在写系列文章,准备把基本的规划和动机等,单独作为一个小的序言部分给独立出来.序言部分,可以较为完整地交待系列文章的写作动机,所展示的编码技术可能的应用场景等.个人,我还是比较看重文章或者 ...

  4. 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹

    简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...

  5. ios 缓存相关信息收集

    链接:http://www.cnblogs.com/pengyingh/category/353093.html 使用NSURLCache让本地数据来代替远程UIWebView请求 摘要: 原文作者: ...

  6. 大屏iPhone的适配 +iOS 图片尺寸要求

    摘自:http://blog.ibireme.com/2014/09/16/adapted_to_iphone6/ 苹果公司官网设计介绍到:Retina显示屏的超高像素密度已超过人眼能分辨的范围.Re ...

  7. iOS 图片的解压缩

    一.图片加载的工作流 概括来说,从磁盘中加载一张图片,并将它显示到屏幕上,中间的主要工作流如下: 假设我们使用 +imageWithContentsOfFile: 方法从磁盘中加载一张图片,此时的图片 ...

  8. iOS 图片压缩方法

    iOS 图片压缩方法 两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size). 压缩图片质量 NSData *data = UIImageJPEGReprese ...

  9. iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  10. 微信小程序--图片相关问题合辑

    图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.preview ...

随机推荐

  1. Web Api ——创建WebAPI

    方法在Win10 + VS2017(MVC5)测试通过 1.建立 WebApi项目: 选择菜单 “文件->新建醒目->web ->ASP.NET Web 应用程序” 输入项目名称和位 ...

  2. win8、win10出现已禁用IEM时的处理办法

    计算机管理--任务计划程序--任务计划程序库--Microsoft--Windows--TextServicesFramework--MsCtfMonitor--运行即可

  3. Python爬虫教程-02-使用urlopen

    Spider-02-使用urlopen 做一个最简单的python爬虫,使用爬虫爬取:智联招聘某招聘信息的DOM urllib 包含模块 - urllib.request:打开和读取urls - ur ...

  4. 由Dialog里面嵌套ListView之后的高度自适应引起的ListView性能优化

    先说ListView给高的正确做法. android:layout_height属性: 必须将ListView的布局高度属性设置为非"wrap_content"(可以是" ...

  5. 13.用别名(alias)创建你自己的命令

    现在是时候,感受第一次编程经历了!我们将用 alias 命令创建我们自己的命令.但在 开始之前,我们需要展示一个命令行小技巧.可以把多个命令放在同一行上,命令之间 用”;”分开.它像这样工作: com ...

  6. 五大常用算法之四:回溯法[zz]

    http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html 1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试 ...

  7. django的orm操作的补充

    ---恢复内容开始--- 你在建立一个登陆的时候需要用到auth这个用户登陆模块 这个时候就需要用到user表中的信息你就可以继承 这个时候我们的用户表中继承我们user继承的表 ABstractUs ...

  8. “互联网+”背景下使用微信公众号增强班主任工作与整合教学资源(泰微课)

    前记:此文是我爱人一项作业.因为我本人对于微信这一块比较熟悉,就参与这项作业中.此文已经参加移动和教育相关活动.作者是我爱人,如有转载请署名作者. 一.什么是"互联网+"? 早在1 ...

  9. iOS8模糊效果UIVisualEffectView的使用

    iOS8模糊效果UIVisualEffectView的使用 效果: 源码: // // ViewController.m // EffectView // // Created by XianMing ...

  10. Python实例---利用正则实现计算器[FTL版]

    import re # 格式化 def format_str(str): str = str.replace('--', '+') str = str.replace('-+', '-') str = ...