Если ваша цель - получить изображение ниже определенной длины данных, сложно угадать, какой коэффициент сжатия вам нужен, если только вы не знаете, что исходное изображение всегда будет иметь определенную длину данных.Вот простой итеративный подход, который использует сжатие JPEG для достижения целевой длины ... скажем, 1 МБ, чтобы соответствовать вопросу:
// sourceImage is whatever image you're starting with
NSData *imageData = [[NSData alloc] init];
for (float compression = 1.0; compression >= 0.0; compression -= .1) {
imageData = UIImageJPEGRepresentation(sourceImage, compression);
NSInteger imageLength = imageData.length;
if (imageLength < 1000000) {
break;
}
}
UIImage *finalImage = [UIImage imageWithData:imageData];
Я видел некоторые подходы, которые используют цикл while
для сжатияизображение на 0,9 или меньше, пока не будет достигнут целевой размер, но я думаю, что вы потеряете качество изображения и циклы процессора, если будете последовательно сжимать / восстанавливать изображение.Кроме того, цикл for
здесь немного безопаснее, потому что он останавливается автоматически после попытки максимально возможного сжатия (ноль).