跟后台交互,上传图片到服务器,在没有用线连接电脑的时候,APP程序是崩溃的,真机连线测试的时候,显示丢失的连接。
多次测试发现,当选择的图片过多或者是尺寸太大的时候,在页面中展示的UIImage的对象,就会出现这种情况。但并不是所有的机型和系统都会出现,测试崩溃的机型有:iPhone5s(iOS 8)iPhone6p(iOS 9.1)iPhone 6(iOS 10.3),但是在iphone6sp(iOS 11.3)上就不会出现这样的问题。
问题还是要解决的,要么天大的图片不能让用户选择使用。
再有解决办法就是压缩图片,下面简单说一下图片压缩。
1.首先要对图片的尺寸进行处理,进行尺寸上的缩减。个人建议按照原图片的尺寸等比缩减,不要固定尺寸大小(有兴趣的可以试一下)。这里是保证在页面展示选择完成的图片时,老旧设备和系统不会崩溃。
- (UIImage *)OriginImage:(UIImage *)image scaleToSize:(CGSize)size
{
UIGraphicsBeginImageContext(size); //size 为CGSize类型,即你所需要的图片尺寸
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage; //返回的就是已经改变的图片
}
2.在上传的时候,大部分时候都会限制图片上传的大小下面就是总结的网上的压缩的方式:
//压缩图片,image为图片对象,maxlength为文件流的长度。
+ (NSData *)compressImageSize:(UIImage *)image toByte:(NSUInteger)maxLength
{
//要想压缩就使用UIImageJPEGRepresentation
//UIImagePNGRepresentation知会对压缩起反作用
CGFloat compression = 1;
NSData *data = UIImageJPEGRepresentation(image, compression);
if (data.length < maxLength) return data;
CGFloat max = 1;
CGFloat min = 0;
//用最大上传限制作为标准,使用循环查找最接近上传限制大小的压缩值。
for (int i = 0; i < 6; ++i)
{
if (data.length <= maxLength)
{
break;
}
//减半压缩
compression = (max + min) / 2;
data = UIImageJPEGRepresentation(image, compression);
//压缩完的值要小于限制值的百分之九十,说明压缩太过了,这个值不可取,以最小值为(max + min) / 2,最大值为1,取两个数的平均值继续尝试。
if (data.length < maxLength * 0.9)
{
min = compression;
}
//压缩完,发现要大于最大限制值,不可取,将(max + min) / 2作为最大值,最小值为0,取两个数的平均值继续尝试。
else if (data.length > maxLength)
{
max = compression;
}
else
{
break;
}
}
UIImage *resultImage = [UIImage imageWithData:data];
if (data.length < maxLength) return data;
//一般情况下,上面的压缩方式基本能达到要求。
//压缩完成之后,还是没有达到要求。在对尺寸下手
NSUInteger lastDataLength = 0;
while (data.length > maxLength && data.length != lastDataLength)
{
lastDataLength = data.length;
//上传限制的大小/现有的文件大小 作为缩减尺寸的标识
CGFloat ratio = (CGFloat)maxLength / data.length;
CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)),
(NSUInteger)(resultImage.size.height * sqrtf(ratio))); // Use NSUInteger to prevent white blank
UIGraphicsBeginImageContext(size);
[resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
data = UIImageJPEGRepresentation(resultImage, compression);
}
return data;
}