iOS:图片相关(19-05-09更)

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:urloptions:SDWebImageDownloaderHighPriorityprogress:^(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

 

转载于:https://www.cnblogs.com/leonlincq/p/8330418.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

导航能力堪比GPS!动物们是这样做到的

相关新闻截图文章转载自微信公众号GIS圈&#xff0c;来源&#xff1a;新华网&#xff08;内容来源科技日报&#xff09;&#xff0c;版权归原作者及刊载媒体所有。不久前&#xff0c;一则新闻引发了众多网友关注&#xff1a;内蒙古巴彦淖尔市乌拉特草原上的一只骆驼去年被卖到了…

python写法教程_Python的表达式写法

Python的表达式写法与C/C类似。只是在某些写法有所差别。主要的算术运算符与C/C类似。表示加法或者取正,-表示减法或者取负, * 表示乘法,/表示除法,//表示整除, * * 乘方, ~表示取补, %表示取模。>>, <, 用于比较两个表达式的值&#xff0c;分别表示大于、小于、等于、…

fread()

fread() 读取文件 转载于:https://www.cnblogs.com/xiaobiaomei/p/8330432.html

python安装oracle驱动_Python安装Oracle数据库驱动

1.环境设置[rootoracle ~]# cat /etc/redhat-releaseCentOS release 6.9 (Final)[rootoracle ~]# python -VPython 2.6.6版本&#xff1a;Oracle 12c2.前提&#xff1a;安装cx_Oracle模块依赖包由于使用Python连接Oracle&#xff0c;所以需要下载oracle客户端包oracle-instantc…

百度李彦宏:无人驾驶何时商用

来源&#xff1a;TechWeb.com.cn【TechWeb】9月15日消息&#xff0c;百度世界2020大会今日线上开幕&#xff0c;百度创始人李彦宏化身主持人兼主播&#xff0c;携手央视主持人康辉共同主持了这一场线上直播&#xff0c;为大家带来了百度在无人驾驶、AI能力、AI应用等领域的最新…

开始记录学习的足迹

随着年龄的增大&#xff0c;记忆力也越来越差&#xff0c;信息社会&#xff0c;知识大爆炸。涉及到的相关知识和内容越来越多&#xff0c;与我而言&#xff0c;非常有必要建个博客&#xff0c;作为记录学习的内容&#xff0c;留下学习的足迹。特此声明&#xff0c;本博客主要是…

qt mysql 系统时间_使用QT和参数在SQLite数据库中插入日期时间

我想从C/QT应用程序执行插入到SQLite数据库。 我想要插入数据的表格中的一列是datetime(yyyy-mm-dd hh&#xff1a;mm&#xff1a;ss)。使用QT和参数在SQLite数据库中插入日期时间我有尝试使用此代码&#xff1a;...query.prepare("INSERT INTO table (table_date_time, .…

郭仁忠:基于GIS的智慧城市工程逻辑 | GTC主会场报告(视频+PPT)

来源&#xff1a;GIS软件技术大会“智慧城市建设如火如荼&#xff0c;从概念、规划方案到落地实现&#xff0c;业界都有着不同的理解&#xff0c;呈现出“百家争鸣”的局面。在2020 GIS 软件技术大会主题大会上&#xff0c;中国工程院院士、深圳大学智慧城市研究院院长郭仁忠作…

传奇地图事件触发脚本

比如玩家在游戏中进入某个地图击杀某个怪物掉落了装备&#xff0c;游戏公告就会全服红字提醒。这就是一个触发&#xff0c;当怪物死亡掉落 指定物品就表示产生了触发事件&#xff0c;MapEvent.txt 支持一下触发 1、丢弃物品触发2、拾取物品触发3、挖矿6、爆物品MapEvent.txt文件…

js json过滤_如何在浏览器不崩溃的情况下过滤 200 万行数据?

最近我分配到了一个非常有趣的任务&#xff1a;在前端显示 1GB 文件和 200 万行数据&#xff0c;并实现过滤&#xff0c;在这篇文章中&#xff0c;我将分享我是如何完成这个任务的。背景我曾经创建了一个简单的 React 应用程序。这个应用程序从服务器加载一些数据&#xff0c;并…

联合国旗舰报告《全球生物多样性展望》发布:面对最糟糕的生物多样性保护成绩单,人类该何去何从?...

来源&#xff1a;阿拉善SEE公益机构2020年9月15日 &#xff0c;联合国《生物多样性公约》&#xff08;CBD&#xff09;发布了一份重量级的旗舰报告——第五版《全球生物多样性展望》&#xff08;Global Biodiversity Outlook 5&#xff09;。该报告显示&#xff0c;CBD于2010年…

function函数嵌套 matlab_MATLAB嵌套函数

嵌套函数的定义嵌套函数&#xff0c;即nested function&#xff0c;就是嵌套在函数体内部的函数。嵌套函数可以出现在一个函数体内部的任何位置&#xff0c;开始以function声明&#xff0c;结束的时候加上end。需要说明的是包含有嵌套函数的函数&#xff0c;无论它是主函数、子…

Java 代码复用 —— 泛型

public interface Comparable<T> {public int compareTo(T o); } 1. 接口&#xff08;Comparable&#xff1a;可比较接口&#xff09; public static boolean less(Comparable v, Comparable w) {return v.compareTo(w) < 0; } 当然也可以将参数中的 Comparable 具化为…

阿里云发布首台云电脑“无影”,传统 PC 已“末路”?

来源 | 硬核编辑部作者 | 硬核云顶宫在9月17日的云栖大会上&#xff0c;阿里云智能总裁、达摩院院长发布阿里云第一台云电脑——“无影”。这是一台长在云上的“超级电脑”&#xff0c;只需将一张名片夹大小的 C-Key 上连接一块屏幕&#xff0c;就可以进入专属云电脑桌面&#…

金星可能存在生命?科学家发现大气中有磷化氢,剧毒气体或是生物代谢产物...

文章来源&#xff1a;量子位最新消息&#xff0c;英国皇家天文学会发布了一条激动人心的新进展&#xff1a;金星上可能存在着生命迹象。因为科学家发现&#xff0c;金星大气中存在着浓度异常的磷化氢(PH3)气体&#xff0c;达到20ppb&#xff08;亿分之二&#xff09;。这种剧毒…

python怎么输入两个数然后求差值_python两个日期之间天差值获取

因为我也刚刚接触python&#xff0c;这个原则上也是百度找到的&#xff0c;原来那位我也找不到了......主要就是使用datetime进行转化然后进行相减&#xff0c;获得如[diff_days] : 00:00:00形式的结果&#xff0c;这里我是把结果转成string去做截取了。需要引入time,datetime两…

php简单的用户留言板实现内容(1-23)

静态模版来源 可视化布局 代码实现 <?php header(content-type:text/html;charsetutf-8); date_default_timezone_set("Asia/Shanghai"); /*构思&#xff1a;建立一个文本文件&#xff0c;通过操作文件&#xff0c;写入数据、读取数据&#xff01;file_get_conte…

3D芯片大脑:在芯片上培养脑细胞,还能用来测试新药

来源&#xff1a;MEMS在科学实验中&#xff0c;研究人员往往首先以小白鼠为实验对象。虽然是科研需要&#xff0c;但有人谴责这是对生命的亵渎。此外&#xff0c;动物测试成本高且耗时&#xff0c;同时无法精确体现人类的反应。那么有没有其他替代品呢&#xff1f;来自劳伦斯利…

mysql install安装报错_mysql安装报错

错误1make: *** No targets specified and no makefile found. Stop.1、wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.6.tar.gz2.、tar zxvf ncurses-5.6.tar.gz3、 ./configure -prefix/usr/local -with-shared-without-debug4、make5、make install报错2&#xff1a;I…

Linux中几个实用快捷键

返回上层目录&#xff1a; cd ..命令提示符&#xff1a; userubuntu&#xff1a; 之前的部分为当前用户ID名称&#xff1b; 之后冒号之前是主机名称sudo &#xff1a;&#xff08;Superusers Do&#xff09; 以超级用户执行在相对路径中&#xff0c; . 表示当前目录&#xff0…