Картон UIImage без использования масштаба

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

Пример скриншота

Таким образом, изображение лица в левом верхнем углу клавиатуры - это просто кнопка UIB с исходной фотографией на заднем плане. При нажатии кнопки размер изображения изменяется с помощью следующей функции:

func imageResize(image:UIImage, size:CGSize)-> UIImage {

    let scale  = UIScreen.mainScreen().scale

    UIGraphicsBeginImageContextWithOptions(size, false, scale)
    var context = UIGraphicsGetCurrentContext()

    CGContextSetInterpolationQuality(context, kCGInterpolationHigh)
    image.drawInRect(CGRect(origin: CGPointZero, size: size))

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return scaledImage
}

Эта функция создает UIImage того же размера, что и кнопка UIB с соответствующим масштабом, чтобы отразить разрешение экрана устройства. Чтобы убедиться, что функция правильная, я добавил UIImageView, заполненный масштабированным изображением. Масштабированное изображение - это изображение, которое выглядит неуместно рядом с центром клавиатуры. Я добавил UIImageView с этой функцией:

func addImageToBottomRight(image: UIImage) {
    var tempImgView = UIImageView(image: image)
    self.view.addSubview(tempImgView)
    tempImgView.frame.offset(dx: 100.0, dy: 50.0)
}

Я пробовал несколько разных способов добавления изображения в монтажную область, но все, кажется, игнорируют масштаб изображения и отображают его в два раза больше, чем отображение с более высоким разрешением:

let pb = UIPasteboard.generalPasteboard()!

var pngType = UIPasteboardTypeListImage[0] as! String
var jpegType = UIPasteboardTypeListImage[2] as! String

pb.image = image
pb.setData(UIImagePNGRepresentation(image), forPasteboardType: pngType)
pb.setData(UIImageJPEGRepresentation(image, 1.0), forPasteboardType: jpegType)

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

Вот несколько свойств UIImage и измените их размер, если кому-то интересно:

Starting Image Size is (750.0, 750.0)
Size to scale to is: (78.0, 78.0))
Initial Scale: 1.0

Resized Image Size is (78.0, 78.0)
Resized Image Scale: 2.0

1 ответ

Я знаю, что это старая публикация, но я поделился работой, которую нашел для этого конкретного случая копирования изображений и вставки в приложения обмена сообщениями. Дело в том, что когда вы отправляете картинку с такими приложениями, как iMessages, WhatsApp, Messenger и т. Д. они отображают изображение таким образом, чтобы оно подходило к некоторой определенной ширине по горизонтали (скажем, около 260 пунктов для этой демонстрации).

Как видно из диаграммы ниже, если вы отправите изображение 150x150 с разрешением 1x в imessage, оно будет растянуто и отображено в необходимом окне шириной 260, что сделает изображение зернистым.

Изображение 150x150 растягивается и отображается в коробке размером 260x260

Но если вы добавите пустое поле шириной 185 с левой и правой сторон изображения, вы получите изображение размером 520x150. Теперь, если вы отправите изображение такого размера в imessage, оно должно будет уместиться в поле шириной 260, в результате чего изображение 520x150 будет умещаться в поле размером 260x75, что даст вам изображение 75x75 с разрешением @2x.

Изображение отображается с полем

Вы можете добавить четкое поле цвета в UIImage с помощью кода, подобного этому

extension UIImage {
    func addMargin(withInsets inset: UIEdgeInsets) -> UIImage? {
         let finalSize = CGSize(width: size.width + inset.left + inset.right, height: size.height + inset.top + inset.bottom)
         let finalRect = CGRect(origin: CGPoint(x: 0, y: 0), size: finalSize)

            UIGraphicsBeginImageContextWithOptions(finalSize, false, scale)
            UIColor.clear.setFill()
            UIGraphicsGetCurrentContext()?.fill(finalRect)

            let pictureOrigin = CGPoint(x: inset.left, y: inset.top)
            let pictureRect = CGRect(origin: pictureOrigin, size: size)

            draw(in: pictureRect)
            let finalImage = UIGraphicsGetImageFromCurrentImageContext()
            defer { UIGraphicsEndImageContext() }

            return finalImage
 }

}

Другие вопросы по тегам