2015-05-29 8 views
10

Chciałbym zmienić rozmiar obrazu za pomocą metody drawInRect, ale chciałbym również zachować odpowiedni współczynnik proporcji przy wypełnianiu całkowicie danej klatki (jako .ScaleAspectFill dla UIViewContentMode). Ktoś ma na to gotową odpowiedź?Zmiana rozmiaru obrazu za pomocą funkcji drawInRect przy zachowaniu współczynnika kształtu, jak w przypadku wypełnienia skali skali?

Oto mój kod (dość proste ...):

func scaled100Image() -> UIImage { 
    let newSize = CGSize(width: 100, height: 100) 
    UIGraphicsBeginImageContext(newSize) 
    self.pictures[0].drawInRect(CGRect(x: 0, y: 0, width: 100, height: 100)) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return newImage 
} 

Odpowiedz

24

OK, więc nie ma gotowych odpowiedzi ... Napisałem szybki rozszerzenie dla UIImage, nie krępuj się go używać, jeśli trzeba to.

Oto ona:

extension UIImage { 
    func drawInRectAspectFill(rect: CGRect) { 
     let targetSize = rect.size 
     if targetSize == CGSizeZero { 
      return self.drawInRect(rect) 
     } 
     let widthRatio = targetSize.width/self.size.width 
     let heightRatio = targetSize.height/self.size.height 
     let scalingFactor = max(widthRatio, heightRatio) 
     let newSize = CGSize(width: self.size.width * scalingFactor, 
          height: self.size.height * scalingFactor) 
     UIGraphicsBeginImageContext(targetSize) 
     let origin = CGPoint(x: (targetSize.width - newSize.width)/2, 
          y: (targetSize.height - newSize.height)/2) 
     self.drawInRect(CGRect(origin: origin, size: newSize)) 
     let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     scaledImage.drawInRect(rect) 
    } 
} 

Tak więc w powyższym przykładzie, należy użyć go tak:

self.pictures[0].drawInRectAspectFill(CGRect(x: 0, y: 0, width: 100, height: 100)) 
+0

Jesteś moim bohaterem – MScottWaller

+0

Nie tak dobrze dla mnie. Stracę 40 MB za każdym razem, gdy uruchomię to, co powoduje awarię mojej aplikacji, ponieważ próbuję skalować wiele zdjęć naraz. – RowanPD

+0

Użyj skali, aby obraz nie był rozmazany - 'UIGraphicsBeginImageContextWithOptions (targetSize, true, UIScreen.mainScreen(). Scale)' –

1

Wersja Objective-C, jeśli ktoś to potrzebne (Wklej ten kod Wewnątrz kategoria UIImage):

- (void) drawInRectAspectFill:(CGRect) recto { 

CGSize targetSize = recto.size; 
if (targetSize.width <= CGSizeZero.width && targetSize.height <= CGSizeZero.height) { 
    return [self drawInRect:recto]; 
} 

float widthRatio = targetSize.width/self.size.width; 
float heightRatio = targetSize.height/self.size.height; 
float scalingFactor = fmax(widthRatio, heightRatio); 
CGSize newSize = CGSizeMake(self.size.width * scalingFactor, self.size.height * scalingFactor); 

UIGraphicsBeginImageContext(targetSize); 

CGPoint origin = CGPointMake((targetSize.width-newSize.width)/2,(targetSize.height - newSize.height)/2); 

[self drawInRect:CGRectMake(origin.x, origin.y, newSize.width, newSize.height)]; 
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

[scaledImage drawInRect:recto]; 

}