Ответ 1
Второй вариант является безопасным потоком.
Для всех вас графических экспертов мне было интересно, какой из этих двух методов лучше для изменения размера 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;
}
Итак, мой вопрос: какой путь лучше и почему?
Второй вариант является безопасным потоком.
Это довольно поздний ответ, но я просто продолжу и добавлю его в любом случае.
Я действительно нашел некоторые поведенческие различия между этими двумя методами, помимо prestanda.
В моем приложении с фотографией у меня есть пользовательский вид камеры, который отправляет любое взятое изображение в пользовательский редактор изображений. В приложении пользовательские представления камеры/редактора являются эксклюзивными. Однако само собственное окно камеры это НЕ.
Итак, всякий раз, когда фотография делалась в портретном режиме, конечный результат искажается. Эти искажения легко обрабатываются путем изменения ширины и высоты, когда ширина < высота.
Первый метод двух вышеуказанных методов (простой) привел к тому, что изображение было повернуто на 90 градусов и все еще искажено. Второе, однако, изменило изображение идеально!
Я предполагаю, что это имеет какое-то отношение к графическому контексту. Второй метод не использует этот контекст, и он работает безупречно в моем случае.
Это высокоуровневый и низкоуровневый подход.
Что лучше? Зависит от вашей цели.
Подход высокого уровня более читабельен (для меня), возможно, низкоуровневый подход на наносекунде быстрее (не проверял).
Трудно судить алгоритмы...
Существуют разные способы изменения размера изображения. Даже если у вас новая ширина и новая высота, вы можете либо изменить размер изображения на новый размер, либо проигнорировать пропорции, либо пропорционально масштабировать изображение и обрезать его до нового размера.
В проекте есть чистый API для этого: https://github.com/mustangostang/UIImage-Resize. Он использует первый подход: -)