Какой способ изменить размер UIImage лучше и почему?

Для всех вас графических экспертов мне было интересно, какой из этих двух методов лучше для изменения размера UIImage:

Первый, с которым я столкнулся, прост и популярен и выглядит следующим образом:

-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight
{
    UIGraphicsBeginImageContext(CGSizeMake(resizedWidth ,resizedHeight));
    [image drawInRect:CGRectMake(0, 0, resizedWidth, resizedHeight)];
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();
    return result;
}

Второй метод, который я нашел по этой ссылке http://iphonesdksnippets.com/post/2009/05/06/Resize-image-and-keep-aspect-ratio.aspx и, похоже, выполняет то же самое, что и выше, но гораздо более запутанным (I не понимаю, что там происходит):

-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight
 {
    CGImageRef imageRef = [image CGImage];

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef bitmap = CGBitmapContextCreate(NULL, resizedWidth, resizedHeight, 8, 4 * resizedWidth, colorSpace, kCGImageAlphaPremultipliedFirst);
    CGContextDrawImage(bitmap, CGRectMake(0, 0, resizedWidth, resizedHeight), imageRef);
    CGImageRef ref = CGBitmapContextCreateImage(bitmap);
    UIImage *result = [UIImage imageWithCGImage:ref];

    CGContextRelease(bitmap);
    CGImageRelease(ref);

    return result;  
}

Итак, мой вопрос: какой путь лучше и почему?

Ответ 1

Второй вариант является безопасным потоком.

Ответ 2

Это довольно поздний ответ, но я просто продолжу и добавлю его в любом случае.

Я действительно нашел некоторые поведенческие различия между этими двумя методами, помимо prestanda.

В моем приложении с фотографией у меня есть пользовательский вид камеры, который отправляет любое взятое изображение в пользовательский редактор изображений. В приложении пользовательские представления камеры/редактора являются эксклюзивными. Однако само собственное окно камеры это НЕ.

Итак, всякий раз, когда фотография делалась в портретном режиме, конечный результат искажается. Эти искажения легко обрабатываются путем изменения ширины и высоты, когда ширина < высота.

Первый метод двух вышеуказанных методов (простой) привел к тому, что изображение было повернуто на 90 градусов и все еще искажено. Второе, однако, изменило изображение идеально!

Я предполагаю, что это имеет какое-то отношение к графическому контексту. Второй метод не использует этот контекст, и он работает безупречно в моем случае.

Ответ 3

Это высокоуровневый и низкоуровневый подход.

Что лучше? Зависит от вашей цели.

Подход высокого уровня более читабельен (для меня), возможно, низкоуровневый подход на наносекунде быстрее (не проверял).

Трудно судить алгоритмы...

Ответ 4

Существуют разные способы изменения размера изображения. Даже если у вас новая ширина и новая высота, вы можете либо изменить размер изображения на новый размер, либо проигнорировать пропорции, либо пропорционально масштабировать изображение и обрезать его до нового размера.

В проекте есть чистый API для этого: https://github.com/mustangostang/UIImage-Resize. Он использует первый подход: -)