gpt4 book ai didi

ios - 从 NSData 获取时错误的控制文件大小 UIImage

转载 作者:行者123 更新时间:2023-11-28 22:03:03 27 4
gpt4 key购买 nike

我有一种将图像压缩到一定大小的方法,所以我得到了一个具有所需字节的 NSData,但是当我将这个 NSData 转换为 UIImage,并将 UIImage 转换为 NSData 时,我可以检查 NSData 增加的大小(原始值乘以大约 4 个)

UIImage *image = [UIImage imageWithData:imageData];
NSData *newData = UIImageJPEGRepresentation(image,1.0f);

为什么会这样??我只想控制 UIImage 文件大小(用于存储在数据库中)。

我在下面发布我的代码。

提前致谢。

+ (NSData *) dataOfCompressingImage:(UIImage *)pImage toMaxSize:(CGSize)pSize toFileSizeKB:(NSInteger)pFileSizeKB{

CGSize aSize;
if (pSize.width==0 || pSize.height==0){
aSize = pImage.size;
}else{
aSize = pSize;
}

UIImage *currentImage = [self imageWithImage:pImage scaledToSize:aSize];
NSData *imageData = UIImageJPEGRepresentation(currentImage, 1.0f);
NSInteger currentLength = [imageData length];

double factor = 1.0;
double adjustment = 1.0 / sqrt(2.0); // or use 0.8 or whatever you want

while (currentLength >= (pFileSizeKB * 1024)){ //
factor *= adjustment;
NSLog(@"factor: %f", factor);

@autoreleasepool{
imageData = UIImageJPEGRepresentation(currentImage, factor);
}

if (currentLength == [imageData length]){
break; //Exit While. Reached maximum compression level
}else{
currentLength = [imageData length];
}
}

return imageData;
}

最佳答案

发生这种情况是因为当您执行 UIImageJPEGRepresentation 时,您使用的品质因数为 1.0,导致 JPEG 的频率分量以过高的分辨率存储。

这样想,如果您有一个 float 数组,您可以根据需要将它们存储为 double 组。由于数据类型的大小,这些 double 会占用两倍的内存,但由于起始数据的分辨率有限,因此实际上并不能提供更多的分辨率。

关于ios - 从 NSData 获取时错误的控制文件大小 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24656704/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com