2015-05-29 36 views
10

Bir görüntüyü drawInRect yöntemiyle yeniden boyutlandırmak istiyorum, ancak doğru çerçeve oranını korumak isterim. Ayrıca, verilen çerçeveyi (.ScaleAspectFill, UIViewContentMode için yaptığı gibi) doldurur. Bunun için herkesin hazır bir cevabı var mı? İşte Bir görüntüyü, Scale Aspect Fill gibi en boy oranını korurken drawInRect ile yeniden boyutlandırın.

(... oldukça basit) benim kodudur:

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 
} 

cevap

24

Tamam, bu nedenle hazır cevap ... Ben UIImage için hızlı bir uzantısı, sen gerekiyorsa bunu kullanmaktan çekinmeyin yazdı o. İşte

öyle:

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) 
    } 
} 

Yani yukarıdaki örnekte, bunu böyle kullanın:

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

Sen benim kahramanımsın – MScottWaller

+0

Benim için çok iyi değil. Bunu her çalıştırdığımda 40MB kaybediyorum ve bir kerede çok sayıda fotoğrafı küçültmeye çalıştığım için uygulamam çöküyor. – RowanPD

+0

Ölçek kullan, bu nedenle görüntü bulanık değil - "UIGraphicsBeginImageContextWithOptions (targetSize, true, UIScreen.mainScreen(). Scale)" –

1

Objective-C sürümü, birisi de gerekirse (a içinde bu kodu yapıştırın UIImage kategorisi):

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

}

İlgili konular