2015-09-16 6 views
3

Я использую следующие функции, чтобы изменить размеры моих изображений шириной &, но я заметил, что это разрушает качество изображения.Изменение размера изображения без потери качества

class func imageWithSize(image: UIImage,size: CGSize)->UIImage{ 
    if UIScreen.mainScreen().respondsToSelector("scale"){ 
     UIGraphicsBeginImageContextWithOptions(size,false,UIScreen.mainScreen().scale); 
    } 
    else 
    { 
     UIGraphicsBeginImageContext(size); 
    } 

    image.drawInRect(CGRectMake(0, 0, size.width, size.height)); 
    var newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 

class func resizeImageWithAspect(image: UIImage,scaledToMaxWidth width:CGFloat,maxHeight height :CGFloat)->UIImage 
{ 


    let scaleFactor = width/height; 


    let newSize = CGSizeMake(width, height); 

    return imageWithSize(image, size: newSize); 
} 

Есть ли другой способ изменить размер изображений без разрушения качества? Или как я могу исправить мои функции ниже, чтобы не ухудшить качество изображения после изменения размера?

+0

Какое качество у вас есть и какое качество вы ожидаете? – Mats

+0

@Mats Он правильно изменяет размеры изображений до любой ширины и высоты, которые я передаю функции. Проблема в том, что изображение становится размытым. –

+1

FYI - в iOS 4 была добавлена ​​функция 'UIGraphicsBeginImageContextWithOptions'. Проверка, чтобы увидеть, следует ли использовать ее или нет в этот день, а возраст бессмысленен. – rmaddy

ответ

4

Вот мой код Objective-C. Это работа для меня.

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize isAspectRation:(BOOL)aspect { 
    if (!image) { 
     return nil; 
    } 
    //UIGraphicsBeginImageContext(newSize); 
    // In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution). 
    // Pass 1.0 to force exact pixel size. 
    CGFloat originRatio = image.size.width/image.size.height; 
    CGFloat newRatio = newSize.width/newSize.height; 

    CGSize sz; 

    if (!aspect) { 
     sz = newSize; 
    }else { 
     if (originRatio < newRatio) { 
      sz.height = newSize.height; 
      sz.width = newSize.height * originRatio; 
     }else { 
      sz.width = newSize.width; 
      sz.height = newSize.width/originRatio; 
     } 
    } 
    CGFloat scale = 1.0; 
    // if([[UIScreen mainScreen]respondsToSelector:@selector(scale)]) { 
    //  CGFloat tmp = [[UIScreen mainScreen]scale]; 
    //  if (tmp > 1.5) { 
    //   scale = 2.0; 
    //  } 
    // } 
    sz.width /= scale; 
    sz.height /= scale; 
    UIGraphicsBeginImageContextWithOptions(sz, NO, scale); 
    [image drawInRect:CGRectMake(0, 0, sz.width, sz.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

Я видел ваш код в Swift. Я просто конвертирую Objective-C в Swift без проверки. Можете попробовать и дайте мне знать. Благодаря!

struct CommonUtils { 
    static func imageWithImage(image: UIImage, scaleToSize newSize: CGSize, isAspectRation aspect: Bool) -> UIImage{ 

     let originRatio = image.size.width/image.size.height;//CGFloat 
     let newRatio = newSize.width/newSize.height; 

     var sz: CGSize = CGSizeZero 

     if (!aspect) { 
      sz = newSize 
     }else { 
      if (originRatio < newRatio) { 
       sz.height = newSize.height 
       sz.width = newSize.height * originRatio 
      }else { 
       sz.width = newSize.width 
       sz.height = newSize.width/originRatio 
      } 
     } 
     let scale: CGFloat = 1.0 

     sz.width /= scale 
     sz.height /= scale 
     UIGraphicsBeginImageContextWithOptions(sz, false, scale) 
     image.drawInRect(CGRectMake(0, 0, sz.width, sz.height)) 
     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return newImage 
    } 
} 
3
func image(image:UIImage,imageSize:CGSize)->UIImage 
{ 
    UIGraphicsBeginImageContextWithOptions(imageSize, false, 0.0) 
    [image .drawInRect(CGRectMake(0, 3, imageSize.width, imageSize.height))] 
    let newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext() 
    return newImage; 
} 
+2

Рассмотрите возможность добавления контекста/объяснения основных моментов, чтобы ваш ответ был более полезным. – lfurini

1

Вот мой код в стрижа. Для квадратов изображений он работает очень хорошо и не теряет ни одного оригинального качества!

extension UIImage { 

    func resize(targetSize: CGSize) -> UIImage { 
     return UIGraphicsImageRenderer(size:targetSize).image { _ in 
      self.draw(in: CGRect(origin: .zero, size: targetSize)) 
     } 
    } 

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