首页 > 其他分享 >iOS UIImage等比缩放、转到横屏的图片到垂直模式、重制大小resize

iOS UIImage等比缩放、转到横屏的图片到垂直模式、重制大小resize

时间:2023-02-25 14:07:22浏览次数:36  
标签:return 缩放 image iOS NSDictionary 横屏 UIImage 图片 size


UIImage等比缩放

分类方法

@implementation UIImage (Cat)

// 计算等比缩放图片的size
- (CGSize)equalRatioComputeImageWithTargetWidth:(CGFloat)targetWidth targetHeight:(CGFloat)targetHeight {
CGFloat originalWidth = self.size.width;
CGFloat originalHeight = self.size.height;

CGFloat widthFactor = targetWidth / originalWidth;
CGFloat heightFactor = targetHeight / originalHeight;

CGFloat scaleFactor = 0;
if (widthFactor > heightFactor) {
scaleFactor = widthFactor;
} else {
scaleFactor = heightFactor;
}

CGFloat scaledWidth = originalWidth * scaleFactor;
CGFloat scaledHeight = originalHeight * scaleFactor;

return CGSizeMake(scaledWidth, scaledHeight);
}

// 计算等比缩放图片到屏幕大小的size
- (CGSize)equalRatioComputeImageToScreenSize {
CGSize screenSize = [UIScreen mainScreen].bounds.size;
return [self equalRatioComputeImageWithTargetWidth:screenSize.width targetHeight:screenSize.height];
}

}

调用:

// 计算图片等比缩放到屏幕大小的size
CGSize imageMaxSize = [portraitImage equalRatioComputeImageToScreenSize];

转到横屏的图片到垂直模式

@implementation YDImageEXIFTool

// 根据图片的NSData获取图片的EXIF信息
+ (NSDictionary *)getExifInfoWithImageData:(NSData *)imageData {
CGImageSourceRef cImageSource = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
NSDictionary *dict = (NSDictionary *)CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(cImageSource, 0, NULL));
NSDictionary *dictInfo = [NSDictionary dictionaryWithDictionary:dict];
return dictInfo;
}

// 根据图片本地URL获取图片的EXIF信息
+ (NSDictionary *)getExifInfoWithImageURL:(NSURL *)url {
CGImageSourceRef cImageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL);
NSDictionary *dict = (NSDictionary *)CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(cImageSource, 0, NULL));
NSDictionary *dictInfo = [NSDictionary dictionaryWithDictionary:dict];
return dictInfo;
}

// 将图片以JPEG格式写入到本地沙盒的临时文件夹里,并返回本地图片的路径
+ (NSString *)writeJPEGImageToLocalTemporaryFolder:(UIImage *)image {
NSString *imgLocalPath = [NSString stringWithFormat:@"%@/%@.jpg", NSTemporaryDirectory(), [NSUUID UUID].UUIDString];
NSData *jpgNSData = UIImageJPEGRepresentation(image, image.scale);
[jpgNSData writeToFile:imgLocalPath atomically:YES];
return imgLocalPath;
}

// 将UIImage图的方向调正,即竖屏可预览的模式
+ (UIImage *)convertImage:(UIImage *)image toRotation:(UIImageOrientation)orientation {
if (image.imageOrientation == UIImageOrientationUp) return image;
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
/*
Apple Doc: https://developer.apple.com/documentation/uikit/uiimage/1624092-drawinrect?language=objc
解释:drawInRect方法会按照图片的系统默认坐标方向进行绘制,即修正图片不是portrait模式
*/
[image drawInRect:(CGRect){0, 0, image.size}];
UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return normalizedImage;
}

// 将UIImage图的方向调正,即默认竖屏可预览的模式
+ (UIImage *)convertImageToDefaultPortraitMode:(UIImage *)image {
return [YDImageEXIFTool convertImage:image toRotation:UIImageOrientationUp];
}

@end

调用:

// 将图片转换成portrait模式,即垂直可预览模式
UIImage *portraitImage = [YDImageEXIFTool convertImageToDefaultPortraitMode:image];

重制大小resize

- (UIImage *)resizeImageToSize:(CGSize)size mode:(UIViewContentMode)mode {
NSAssert([[NSThread currentThread] isMainThread], @"must be in main thread");
UIImageView *view = [[UIImageView alloc] initWithImage:self];
view.contentMode = mode;
view.frame = CGRectMake(0, 0, size.width, size.height);
view.backgroundColor = [UIColor clearColor];
UIGraphicsBeginImageContextWithOptions(size, NO, 1);
CGContextRef context = UIGraphicsGetCurrentContext();
[view.layer renderInContext:context];
UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return snapshotImage;
}

调用:

// 重制image的大小
UIImage *resizedImage = [portraitImage resizeImageToSize:imageMaxSize mode:UIViewContentModeScaleAspectFill];

一个完整的例子

比如你在上传图片前,希望不管是横着拍的,还是竖着排的,还是全景图,还是超长大图,都可以这么转换

// 将图片转换成portrait模式
UIImage *portraitImage = [YDImageEXIFTool convertImageToDefaultPortraitMode:image];

// 计算图片等比缩放到屏幕大小的size
CGSize imageMaxSize = [portraitImage equalRatioComputeImageToScreenSize];

// 重制image的大小
UIImage *resizedImage = [portraitImage resizeImageToSize:imageMaxSize mode:UIViewContentModeScaleAspectFill];

最后将resizedImage发送到服务器
​​​NSData *jpegData = UIImageJPEGRepresentation(resizedImage, 1.0);​


标签:return,缩放,image,iOS,NSDictionary,横屏,UIImage,图片,size
From: https://blog.51cto.com/u_14062833/6085416

相关文章

  • iOS启动优化/耗电优化
    一、启动优化1.pre-main阶段我们可以通过苹果提供了XCode内建的测量方法,1.点击项目名称2.​​Editscheme...​​3.左侧​​Run​​4.中间顶部菜单​​Auguments​​5.......
  • iOS卡顿检测方案
    方案一:基于RunLoop主线程绝大部分计算或者绘制任务都是以Runloop为单位发生。单次Runloop如果时长超过16ms,就会导致UI体验的卡顿。那如何检测单次Runloop的耗时呢?Runloop的......
  • iOS的文件校验码生成 - ObjC编写
    一般我们比较文件的完整性,就是对文件进行哈希计算,通常就是MD5或者SHA256或者SHA1计算,如果生成的结果字符串是一样的,则表明文件没有被篡改比如我们在网络上下载的安装包,下载......
  • 适配 iOS 13 设置 deviceToken
    在iOS13之前的版本使用下面代码可以将获取到的deviceToken,转为NSString类型,并去掉其中的空格和尖括号,作为参数传入setDeviceToken:方法中。-(void)application:(UI......
  • iOS日志记录和异常捕获
    日志记录iOS日志记录当前文件的堆栈、类名、函数名、行号及文件路径等信息NSArray*array=[NSThreadcallStackSymbols];NSLog(@"堆栈信息:%@",array);NSLog(@"当......
  • 在 Vue 项目中使用 axios 的三种方式
    首先npmiaxios,npm下载axios插件.第一种方式:直接在vue组件中导入axios,并直接引用.注意一点,axios是一个基于promise网络请求库,这意味着,你必须使......
  • IOS 实现OCR图片文字。从Tesseract到苹果自带OCR识别
    项目中需要实现识别图片文字功能,首先我们使用Tesseract来实现。但是它的识别效果很不精准。发现苹果自带Vision库效果非常好。而且现在支持的语言比较多。demo中支持了ipho......
  • iOS App上架App Store详细教程
    ​编辑编辑切换为居中添加图片注释,不超过140字(可选)​​注意:下载AU后需安装java8运行环境才能启动;安装好了最新Java8运行环境,解压AU软件包,无需安装,Windows64位系统点......
  • iOS App上架App Store详细教程
      ​编辑切换为居中添加图片注释,不超过140字(可选)注意:下载AU后需安装java8运行环境才能启动;安装好了最新Java8运行环境,解压AU软件包,无需......
  • Ios上架app无需688,xcode打包导出IPA,供人内测
    无需支付688苹果开发者账号,xcode打包导出ipa,提供他人进行内测众所周知,在开发苹果应用时需要使用签名(证书)才能进行打包安装苹果IPA,作为刚接触ios开发的同学,只是学习iosapp开......