2013-07-18 4 views
3

Я знаю, что этот вопрос задан несколько раз, но их ответы делают мои изображения свободными. Все они становятся неровными. Поэтому, несмотря на то, что он правильно растёт и правильно изменяет его, он теряет качество.UIImage изменить размер и обрезать по размеру рамки

Точно так же вы можете проверить это, это алгоритм, который в каждом посте:

- (UIImage*)scaleAndCropImage:(UIImage *)aImage forSize:(CGSize)targetSize 
{ 
UIImage *sourceImage = aImage; 
UIImage *newImage = nil; 
CGSize imageSize = sourceImage.size; 
CGFloat width = imageSize.width; 
CGFloat height = imageSize.height; 
CGFloat targetWidth = targetSize.width; 
CGFloat targetHeight = targetSize.height; 
CGFloat scaleFactor = 0.0; 
CGFloat scaledWidth = targetWidth; 
CGFloat scaledHeight = targetHeight; 
CGPoint thumbnailPoint = CGPointMake(0.0,0.0); 

if (CGSizeEqualToSize(imageSize, targetSize) == NO) 
{ 
    CGFloat widthFactor = targetWidth/width; 
    CGFloat heightFactor = targetHeight/height; 

    if (widthFactor > heightFactor) 
    { 
     scaleFactor = widthFactor; // scale to fit height 
    } 
    else 
    { 
     scaleFactor = heightFactor; // scale to fit width 
    } 

    scaledWidth = width * scaleFactor; 
    scaledHeight = height * scaleFactor; 

    // center the image 
    if (widthFactor > heightFactor) 
    { 
     thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
    } 
    else 
    { 
     if (widthFactor < heightFactor) 
     { 
      thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; 
     } 
    } 
} 

UIGraphicsBeginImageContext(targetSize); // this will crop 

CGRect thumbnailRect = CGRectZero; 
thumbnailRect.origin = thumbnailPoint; 
thumbnailRect.size.width = scaledWidth; 
thumbnailRect.size.height = scaledHeight; 

[sourceImage drawInRect:thumbnailRect]; 

newImage = UIGraphicsGetImageFromCurrentImageContext(); 

if(newImage == nil) 
{ 
    NSLog(@"could not scale image"); 
} 

//pop the context to get back to the default 
UIGraphicsEndImageContext(); 

return newImage; 
} 
+0

вы должны использовать UIGraphicsBeginImageContextWithOptions (targetSize, ложный, 0,0), так что фактор правильного масштаба получает применительно к растровому изображению, не уверен, что это вызывает вашу проблему, но может на дисплее сетчатки – peko

+0

блестящий, можете ли вы ответить на этот вопрос? – subharb

+0

Если это вызвало вашу проблему, обязательно – peko

ответ

0

Вы должны использовать UIGraphicsBeginImageContextWithOptions(targetSize, false, 0.0) вместо UIGraphicsBeginImageContext(targetSize), поэтому правильный масштабный коэффициент применяется к растровому изображению.

Задание 0.0 в качестве коэффициента масштабирования задает масштабный коэффициент по отношению к основному экрану устройства. Вызова только UIGraphicsBeginImageContext() такое же, как вызов UIGraphicsBeginImageContextWithOptions(..) с масштабным коэффициентом 1,0

для более подробной информации посмотри на: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/Reference/reference.html#//apple_ref/c/func/UIGraphicsBeginImageContextWithOptions

5

На линии, где ваш начать с UIGraphicsImageContext, используйте UIGraphicsBeginImageContextWithOptions вместо UIGraphicsBeginImageContext. Попробуйте что-то вроде этого:

UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0) 

Обратите внимание на три параметра, принятые выше, я пойду через них в порядке:

  1. targetSize является размер изображения измеряется в точках (не пикселей)
  2. NO - значение BOOL (может быть ДА или НЕТ), которое указывает, является ли изображение 100% непрозрачным или нет. Установка этого параметра в NO будет сохранять прозрачность и создать альфа-канал для обработки прозрачности.
  3. наиболее важный часть вышеуказанного кода является окончательным параметром, 0.0. Это коэффициент масштабирования изображения, который будет применяться. Указание значения на 0.0 устанавливает масштабный коэффициент экрана текущего устройства. Это означает, что качество будет сохранено и особенно хорошо проявится на дисплеях Retina.

Вот Apple Documentation на UIGraphicsBeginImageContextWithOptions.

Смежные вопросы