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
總結
以上是生活随笔為你收集整理的iOS:图片相关(19-05-09更)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript中的运算符和语句
- 下一篇: MapReduce过程详解及其性能优化