2016-04-19 4 views
0

Я изменение размеров различных изображений с этой FUNC:Качество UIImage

func resizeImage(image: UIImage) -> UIImage { 
     var actualHeight: CGFloat = image.size.height 
     var actualWidth: CGFloat = image.size.width 

     let maxHeight: CGFloat = 600.0 
     let maxWidth: CGFloat = text.frame.size.width - 10 

     var imgRatio: CGFloat = actualWidth/actualHeight 
     let maxRatio: CGFloat = maxWidth/maxHeight 
     let compressionQuality: CGFloat = 0.5 
     //50 percent compression 
     if actualHeight > maxHeight || actualWidth > maxWidth { 
      if imgRatio < maxRatio { 
       //adjust width according to maxHeight 
       imgRatio = maxHeight/actualHeight 
       actualWidth = imgRatio * actualWidth 
       actualHeight = maxHeight 
      } 
      else if imgRatio > maxRatio { 
       //adjust height according to maxWidth 
       imgRatio = maxWidth/actualWidth 
       actualHeight = imgRatio * actualHeight 
       actualWidth = maxWidth 
      } 
      else { 
       actualHeight = maxHeight 
       actualWidth = maxWidth 
      } 
     } 
     let rect: CGRect = CGRectMake(0.0, 0.0, actualWidth, actualHeight) 
     UIGraphicsBeginImageContext(rect.size) 
     image.drawInRect(rect) 
     let img: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     let imageData: NSData = UIImageJPEGRepresentation(img, compressionQuality)! 
     UIGraphicsEndImageContext() 

     return UIImage(data: imageData)! 
    } 

Но качество просто ужасно .... Heres картина того, что я получаю ниже:

enter image description here

Я думал, что качество изображения зависит от того, какова была степень сжатия ...? У меня это сейчас на 0,5, как вы можете видеть из моего кода выше, но даже если я его перейду на 1, качество все равно ужасно?

Любые идеи,

Большое спасибо.

+0

0,5 степень сжатия, которая должна быть в оригинальном размере, кажется, является размытым эффектом? – zcui93

+0

@ zcui93 не уверен я понимаю, что вы имеете в виду –

+0

Ваш код выглядит нормально. Не могли бы вы добавить оригинальные и измененные версии одного и того же изображения на вопрос? – Avt

ответ

2

Вместо этого вы должны использовать UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0). Он будет использовать правильную шкалу для вашего устройства. Используемая вами версия (без параметров) использует масштабный коэффициент по умолчанию 1.0. Используя вариант ...WithOptions() и проходящий по шкале 0.0, по умолчанию используется собственный масштаб устройства. Обратите внимание, что это может быть не то, что вы хотите.

Во-вторых, вы можете использовать AVMakeRectWithAspectRatioInsideRect() для расчета вашего целевого размера. В-третьих, вам не нужно проходить через кодировку JPEG, вы можете напрямую вернуть сгенерированное изображение.

Комбинированное, это значительно упрощает код:

func resizeImage(image: UIImage) -> UIImage { 
    let maxSize = CGSize(
    width: text.frame.size.width - 10, 
    height: 600.0 
) 
    let newSize = AVMakeRectWithAspectRatioInsideRect(
    image.size, 
    CGRect(origin: CGPointZero, size: maxSize) 
).size 
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0) 
    image.drawInRect(CGRect(origin: CGPointZero, size: newSize)) 
    let scaled = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return scaled 
} 

EDIT: Это расширение на UIImage, что я использую в проекте:

extension UIImage { 
    /** 
    Returns an scaled version of self that fits within the provided bounding box. 
    It retains aspect ratio, and also retains the rendering mode. 
    - parameter size: The target size, in point 
    - parameter scale: Optional target scale. If omitted, uses the scale of input image 
    - returns: A scaled image 
    */ 
    func imageFittingSize(size: CGSize, scale: CGFloat? = nil) -> UIImage { 
     let newSize = AVMakeRectWithAspectRatioInsideRect(self.size, CGRect(origin: CGPointZero, size: size)).size 
     UIGraphicsBeginImageContextWithOptions(newSize, false, scale ?? self.scale) 
     self.drawInRect(CGRect(origin: CGPointZero, size: newSize)) 
     let scaled = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return scaled.imageWithRenderingMode(renderingMode) 
    } 
} 

Вы можете назвать это на изображении, как так :

let maxSize = CGSize(width: text.frame.size.width - 10, height: 600.0) 
let scaled = image.imageFittingSize(maxSize) 
+0

Привет, спасибо, я предполагаю, что мне нужно установить AVFoundation framework? –

+0

Нет, он включен в SDK iOS, но вам нужно импортировать его в верхней части файла. –

+0

Качество выглядит хорошо, но не правильный размер ... http: //i.stack.imgur.com/pIjNW.png –

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