2012-06-01 3 views
0

В IOS Как обрезать прямоугольное изображение в квадратный почтовый ящик, чтобы он поддерживал исходное соотношение сторон, а оставшиеся пространства были заполнены черным. Например. стратегия «pad», которую transloadit использует для обрезки/изменения размеров своих изображений.Как обрезать почтовый ящик в iOS

http://transloadit.com/docs/image-resize

ответ

1

Для всех, кто наткнулся на этот вопрос и многие другие, как на это без четкого ответа, я написал аккуратную небольшую категорию, которая выполняет это на уровне модели, изменяя непосредственно UIImage, а не просто изменяя представление. Просто используйте этот метод, возвращенное изображение будет помещено в квадратную форму, независимо от того, какая сторона больше.

- (UIImage *) letterboxedImageIfNecessary 
{ 
    CGFloat width = self.size.width; 
    CGFloat height = self.size.height; 

    // no letterboxing needed, already a square 
    if(width == height) 
    { 
     return self; 
    } 

    // find the larger side 
    CGFloat squareSize = MAX(width,height); 

    UIGraphicsBeginImageContext(CGSizeMake(squareSize, squareSize)); 

    // draw black background 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0); 
    CGContextFillRect(context, CGRectMake(0, 0, squareSize, squareSize)); 

    // draw image in the middle 
    [self drawInRect:CGRectMake((squareSize - width)/2, (squareSize - height)/2, width, height)]; 

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 
0

Вы должны установить contentMode в UIImageView с UIViewContentModeScaleAspectFit. Вы также можете найти эту опцию для UIImageView, если вы используете раскадровку.

Комплект backgroundColor UIImageView на черный (или другой цвет по вашему выбору).

0

Просто для удобства - Heres быстрое переписывают ответ @ Димы:

import UIKit 

extension UIImage 
{ 
    func letterboxImage() -> UIImage 
    { 
     let width = self.size.width 
     let height = self.size.height 

     // no letterboxing needed, already a square 
     if(width == height) 
     { 
      return self 
     } 

     // find the larger side 
     let squareSize = max(width, height) 

     UIGraphicsBeginImageContext(CGSizeMake(squareSize, squareSize)) 

     // draw black background 
     let context = UIGraphicsGetCurrentContext() 
     CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0) 
     CGContextFillRect(context, CGRectMake(0, 0, squareSize, squareSize)) 

     // draw image in the middle 
     self.drawInRect(CGRectMake((squareSize-width)/2, (squareSize - height)/2, width, height)) 

     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return newImage 
    } 
} 
Смежные вопросы