日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/19 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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更)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。