Добавление нового фрейма на основе изображения внутри приложения ImageView for PhotoEditing

Я работаю над приложением "Редактирование фотографий", мне нужно добавить кадр на изображение, в основном я использовал другой UIImageView с тем же фреймом моего оригинального UIImageView и просто добавил png-изображение. Теперь проблема в том, что мне нужен кадр, основанный на высоте и ширине рамки внутри изображения. введите описание изображения здесь

как в приведенном выше изображении, мой кадр появляется в целом UIImageView, но мое изображение внутри Imageview является ландшафтом, поэтому, если мое изображение внутри Imageview является ландшафтом, тогда мне нужен альбомный кадр, и если изображение является "Портрет", мне нужен портретный кадр. Как мне это достичь?

У меня есть 2 вида изображения с одинаковой шириной высоты, один из них является исходным представлением изображения, а другой - обрамлением кадра. Теперь у меня есть изображение, используя следующий код

вывод изображения из StoryBoard

@IBOutlet var imgFrame: UIImageView!

Применение рамки к ImageView

                imgFrame.isHidden = false
                imgFrame.image = #imageLiteral(resourceName: "Frame-Style-1.png")

Ответ 1

Думаю, вам нужно две вещи.

Сохраняйте размер рамки UIImageView так же, как и исходный UIImageView.

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

Отрегулируйте размер источника UIImageView до размера изображения.

Самое простое, что вы можете сделать для настройки размера UIImageView на размер UIImage, - это ограничение соотношения сторон. Что еще, я настроил режим содержимого как UIImageView как , чтобы заполнить.

let image = UIImage(named: "portrait")!
let aspectRatio = image.size.height / image.size.width

let aspectRatioConstraint = NSLayoutConstraint(item: userImageView,attribute: .height,relatedBy: .equal,toItem: userImageView,attribute: .width,multiplier: aspectRatio,constant: 0)

userImageView.image = image
userImageView.addConstraint(aspectRatioConstraint)

frameImageView.image = UIImage(named: "landscape-frame")

Вы также должны поместить источник UIImageView внутри контроллера вида, но я оставляю его вам. Это результат, который я получил с помощью этого кода.

portrait result image landscape result image

Это ссылка в пример проекта на GitHub

Ответ 2

сделать innerImageview отображаемое изображение как .scaleAspectFit без пробела:

func set(image: UIImage, to imageView: UIImageView) {
    // 1. find sizeScale
    let sizeScaleX = imgFrame.frame.width / image.size.width
    let sizeScaleY = imgFrame.frame.height / image.size.height
    let sizeScale = sizeScaleX > sizeScaleY ? sizeScaleX : sizeScaleY

    // 2. change imageView frame
    imageView.frame.size = CGSize(width: image.size.width*sizeScale, height: image.size.height*sizeScale)

    // 3. center imageView
    imageView.frame.origin.x = (imgFrame.frame.width-imageView.frame.width)/2
    imageView.frame.origin.y = (imgFrame.frame.height-imageView.frame.height)/2
}

// image is the image what you got (from library/camera or anywhere)
// 1. set image to imgFrame which contain space
imgFrame.image = image
// 2. generate a new image without space
var innerImageView = UIImageView()
set(image: image, to: innerImageView)
// 3. add frame on image
imgFrame.addSubview(innerImageView)

Ответ 3

Предполагая, что это значение вашего mainImageView и изображения (Пейзаж):

mainImageView.frame.size
▿ (500.0, 500.0)
  - width : 500.0
  - height : 500.0

mainImageView.image?.size
▿ Optional<CGSize>
  ▿ some : (1440.0, 800.0)
    - width : 1440.0
    - height : 800.0

Вы знаете, что ширина 500, высота может быть рассчитана так: frame.width / image.width * image.height