粘贴板UIImage不使用比例尺

时间:2015-09-03 20:43:58

标签: ios swift uiimage uipasteboard generalpasteboard

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

Example Screenshot

因此键盘左上角的图片只是一张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)

所有这三种方法都无法正常工作,并产生与屏幕截图中所示相同的结果。有没有人对其他方法有任何建议?为了进一步明确我的目标,我希望消息文本框中的图像在大小和分辨率方面看起来与键盘中的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 个答案:

答案 0 :(得分:0)

我知道这是一篇很老的帖子,但我想我分享了我为这个复制图像和粘贴到消息应用程序的特定情况所找到的工作。事情是,当你用iMessages,whatsapp这样的应用程序发送图片时,信使等,他们显示图像的方式是这样,它的方面适合某些水平宽度(假设这个演示约260点)。

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

150x150 image stretched and displayed in a 260x260 box

但是,如果您在图像的左侧和右侧添加宽度为185的空边距,则最终会得到尺寸为520x150的图像。现在,如果您在imessage中发送该尺寸的图像,则必须将其放入260宽度的框中,最后在260x75的框中填充520x150图像,以某种方式为您提供分辨率为@xx的75x75图像。

Image displayed with a margin

您可以使用类似

的代码为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
 }

}