2

我正在构建一个自定义键盘,并且无法将图像添加到粘贴板并在粘贴的图像中保持适当的比例和分辨率。让我从键盘的截图开始,以说明我的麻烦:

示例截图

所以键盘左上角的人脸图片只是一个UIButton,将原始照片设置为背景。按下按钮时,使用以下功能调整图像大小:

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
}

此函数创建一个与 UIButton 大小相同的 UIImage,并具有适当的比例以反映设备的屏幕分辨率。为了验证函数是否正确,我添加了一个填充了缩放图像的 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)

所有这三种方法都不能正常工作,并产生与屏幕截图所示相同的结果。有人对其他方法有任何建议吗?为了进一步阐明我的目标,我希望消息文本框中的图像在大小和分辨率方面看起来与键盘中的两个 UIImage 相同。

以下是 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
4

1 回答 1

0

我知道这是一篇旧帖子,但我想我分享一下我为复制图像和粘贴到消息传递应用程序的这个特定案例找到的工作。问题是,当你使用 iMessages、whatsapp、messenger 等应用程序发送图片时,他们显示图像的方式是使其纵横比适合某个特定的水平宽度(假设这个演示大约为 260 pts)。

从下图可以看出,如果你在 imessage 中发送 150x150 的图像@1x 分辨率,它会被拉伸并显示在所需的 260 宽度的框中,使图像变得有颗粒感。

150x150 图像拉伸并显示在 260x260 框中

但是如果你在图像的左右两边都添加一个宽度为 185 的空白边距,你最终会得到一个大小为 520x150 的图像。现在,如果您在 imessage 中发送该尺寸的图像,它必须将其放入 260 宽的盒子中,最终将 520x150 的图像塞进 260x75 的盒子中,以某种方式为您提供 @2x 分辨率的 75x75 图像。

带边距显示的图像

您可以使用这样的代码向 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
 }

}

于 2017-05-02T22:33:51.260 回答