Какой метод изменения размера UIImage лучше и почему? - PullRequest
10 голосов
/ 16 ноября 2011

Всем вам, графическим специалистам, мне было интересно, какой из этих двух методов лучше для изменения размера 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 и, похоже, выполняет то же, что и выше, но гораздо более сложный (я не очень понимаю, что в нем происходит):

-(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;  
}

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

Ответы [ 4 ]

4 голосов
/ 27 апреля 2012

Второй потокобезопасен.

1 голос
/ 16 марта 2013

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

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

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

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

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

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

0 голосов
/ 16 апреля 2013

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

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

0 голосов
/ 16 ноября 2011

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

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

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

Сложно судить об алгоритмах ...

...