美文网首页iOS随记
iOS 图片保存到沙盒中尺寸变大问题

iOS 图片保存到沙盒中尺寸变大问题

作者: valiant_xin | 来源:发表于2020-04-03 11:00 被阅读0次

前段时间在做项目的时候遇到图片保存到沙盒中尺寸变大问题???
尺寸变大?为什么之前没有注意到?
虽然用其他方法给暂时解决了问题,但是一直存有疑惑。今天闲来无事,把之前的问题重新拿出来探究一下。

第一步,将一张图片直接保存到沙盒中进行测试。

[UIImageJPEGRepresentation(image, 1) writeToFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/1.jpg"] atomically:YES];
[UIImageJPEGRepresentation(image, 0.6) writeToFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/2.jpg"] atomically:YES];
[UIImagePNGRepresentation(image) writeToFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/3.png"] atomically:YES];

发现在沙盒中三张图片的尺寸都没有改变。

第二步,探索问题。
因为我之前是将图片重新绘制,然后试用writeToFile方法保存图片到沙盒的,有可能是因为流程上的问题?之所以说是流程上的问题,是因为之前重新绘制的图片拿出来后查看了图片的尺寸并没有变大,但是保存的时候就会变大。

// 4 方式
    UIGraphicsBeginImageContextWithOptions(image.size, NO, 1);
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    UIImage *image4 = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [self writeImageWithImage:image4 Name:@"4"];
    
    // 5 方式
    UIGraphicsBeginImageContextWithOptions(image.size, YES, 1);
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    UIImage *image5 = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [self writeImageWithImage:image5 Name:@"5"];
    
    // 6 方式 -> 图片尺寸会变大
    UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    UIImage *image6 = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [self writeImageWithImage:image6 Name:@"6"];
    
    // 7 方式 -> 图片尺寸会变大
    UIGraphicsBeginImageContextWithOptions(image.size, YES, 0);
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    UIImage *image7 = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [self writeImageWithImage:image7 Name:@"7"];
    
    // 8 方式
    UIGraphicsBeginImageContext(image.size);
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    UIImage *image8 = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [self writeImageWithImage:image8 Name:@"8"];
- (void)writeImageWithImage:(UIImage *)image Name:(NSString *)imagename {
    [UIImageJPEGRepresentation(image, 1) writeToFile:[NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%@.jpg",imagename]] atomically:YES];
    [UIImageJPEGRepresentation(image, 0.6) writeToFile:[NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%@_2.jpg",imagename]] atomically:YES];
    [UIImagePNGRepresentation(image) writeToFile:[NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/%@.png",imagename]] atomically:YES];
}

经过测试发现,方式6和方式7会使图片变大,变大的比例和UIScreen的scale一致。他们之间的共性就是UIGraphicsBeginImageContextWithOptions方法的第三个参数传入的值都为0.猜想有可能是因为我们设置为0时,它会按照UIScreen的scale来进行绘制。

进一步猜想,这个UIGraphicsBeginImageContextWithOptions的scale会造成什么样的后果呢?

// 9 方式
    UIGraphicsBeginImageContextWithOptions(image.size, YES, 0.5);
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    UIImage *image9 = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [self writeImageWithImage:image9 Name:@"9"];
    
    // 10 方式
    UIGraphicsBeginImageContextWithOptions(image.size, YES, 2);
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    UIImage *image10 = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [self writeImageWithImage:image10 Name:@"10"];

经过测试,image.size打印是原始尺寸,写入沙盒的是根据scale改变后的尺寸,重新从沙盒中加载的image尺寸也是改变后的尺寸。
具体底层是什么原因造成这样的现象目前还不清楚,如果有明白的,欢迎帮忙解惑。

相关文章

  • iOS 图片保存到沙盒中尺寸变大问题

    前段时间在做项目的时候遇到图片保存到沙盒中尺寸变大问题???尺寸变大?为什么之前没有注意到?虽然用其他方法给暂时解...

  • iOS 对UIView截图的一些事

    常用的对UIView的基本截图方法: 使用上面方法截图后,如果保存到沙盒: 你可能会发现图片的尺寸变大了,比如是你...

  • iOS UIImageView

    jpg 格式转化 png png 格式转化 jpg 将GIF分解为一帧帧 并保存到沙盒中 编辑图片- 旋转图片然后...

  • Swift下载图片(缓存图片)储存到沙盒中

    刚接触Swift没有2个月,相信Swift会越来越火的.现在我学的还是2.3,3虽然出了,可是我们公司的2.3版本...

  • SDWebImage原理

    1、从内存中(字典)找图片(当这个图片在本次程序加载过),找到直接使用; 2、从沙盒中找,找到直接使用,缓存到内存...

  • 笔记 - copy五道题看看

    一、穷举iOS下所有的本地持久化方案。答:所有的本地持久化数据存储的本质都是写文件,而且只能存到沙盒中。沙盒机制是...

  • SDWebImage原理

    1,从内存中(字典)找图片(当这个图片在本次程序中加载过),找到直接使用。2,从沙盒中找,找到直接使用,缓存到内存...

  • iOS开发笔记 NSUserDefaults 存储可变数组问题

    不多废话,我在项目里遇到了这么一个问题:把数据存到一个可变数组里,然后用NSUserDefaults 存到沙盒中;...

  • iOS面试题:iOS中常用的数据存储方式有哪些?

    原文:iOS面试题大全 综合所有的本地持久化数据存储的本质都是写文件,而且只能存到沙盒中。沙盒机制是苹果的一项安全...

  • 2021iOS面试题总结day2

    准备:1.iOS的数据持久化方案所有的本地持久化数据存储的本质都是写文件,而且只能存到沙盒中。沙盒机制是苹果的一项...

网友评论

    本文标题:iOS 图片保存到沙盒中尺寸变大问题

    本文链接:https://www.haomeiwen.com/subject/zmacphtx.html