不使用比例尺的粘贴板UIImage

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

示例屏幕截图

因此,键盘左上方的脸部图片只是一个UIButton,原始的照片设置为背景。 当按下button时,图像被调整为以下function:

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 } 

这个函数创build一个与UIButton具有相同尺寸的UIImage,并以适当的比例来反映设备的屏幕分辨率。 为了validation该function是否正确,我添加了一个用缩放图像填充的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) 

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

以下是UIImage的一些属性,并在任何人都好奇的情况下resize:

 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 

我知道这是一个旧的post,但我认为我分享工作,我发现这个复制图像和粘贴到消息应用程序的具体情况。事情是,当你发送这样的应用程序,如iMessages,WhatsApp的,信使等,他们显示图像的方式是这样,它的方面适合一定的水平宽度(可以说这个演示大约260分)。

从下图中可以看到,如果您在消息中发送150×150 @ 1x分辨率的图像,则会在所需的260宽度框中将其拉伸并显示,使图像变得粗糙。

150x150图像拉伸并显示在一个260x260的盒子里

但是,如果在图像的左右两侧添加宽度为185的空边距,则最终将显示尺寸为520×150的图像。 现在,如果您在imessage中发送大小的图像,它将不得不适应它在一个260宽的盒子,结束了一个260×75盒子520×150图像,以一种方式给你在@ 2x分辨率的75×75图像。

图像显示有余量

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

}

Interesting Posts