结合 2 张图像,工作但拉伸

Combining 2 images, working but stretching

我有一个方形图像视图,如果用户决定添加另一张图像,它会进入右侧的同一图像视图。所以图像视图的左半部分是图像 1,右半部分是图像 2。我的代码唯一的问题是它将两个图像都压缩到图像视图中。

@IBAction func secondactiontakepicture(sender: AnyObject) {
    ImagePickerManager.sharedManager.presentImagePicker(self) { (image, source) -> () in
    self.revertimageview2.image = image
        var size = CGSize(width: self.singlefirstimagepostview.frame.width, height: self.singlefirstimagepostview.frame.height)
        UIGraphicsBeginImageContext(size)
        let areaSize = CGRect(x: 0, y: 0, width: size.width/2, height: size.height)
        self.revertimageview.image!.drawInRect(areaSize)
        let areaSize2 = CGRect(x: size.width/2, y: 0, width: size.width/2, height: size.height)
        self.revertimageview2.image!.drawInRect(areaSize2, blendMode: kCGBlendModeNormal, alpha: 1)
        var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.singlefirstimagepostview.image = newImage
    }

}

如何让它在左侧显示图像 1 的中心部分,在右侧显示图像 2 的中心部分?

例如,图像 1 是我正在组合的 2 个图像。图 2 是当前的样子(两个图像都被压扁了)。图 3 是我想要的样子。

您需要先拆分图像,然后再将其组合回去。下面是我从其他问题中找到的分割图像的代码:

在调查您的问题时,我偶然发现了这个旧博客 post,其中有人为此类操作写了一个类别。

http://iphonedevelopment.blogspot.nl/2010/11/drawing-part-of-uiimage.html

我基于那个 post 快速写了一个 UIImage 扩展。

extension UIImage {    
  func drawInRect(drawRect: CGRect, fromRect: CGRect, blendMode: CGBlendMode, alpha: CGFloat) {
    if let imageToDraw = CGImageCreateWithImageInRect(self.CGImage, fromRect){
        var targetRect = drawRect

        let context = UIGraphicsGetCurrentContext()
        CGContextSaveGState(context)
        CGContextSetBlendMode(context, blendMode)
        CGContextSetAlpha(context, alpha)
        CGContextTranslateCTM(context, 0, drawRect.origin.y + fromRect.size.height)
        CGContextScaleCTM(context, 1, -1)
        targetRect.origin.y = 0

        CGContextDrawImage(context, targetRect, imageToDraw)
        CGContextRestoreGState(context)
    }
  }
}

您可以像下面那样使用它,它也负责 Retina 设备的缩放。在此示例中,我只是切换了同一图像的两半,但您当然可以使用相同的扩展来创建多个图像的裁剪部分。

    let image = UIImage(named: "my_image")!
    let imageView = UIImageView(frame: CGRectMake(0, 0, image.size.width, image.size.height))
    let size = CGSizeMake(image.size.width * image.scale, image.size.height * image.scale)

    UIGraphicsBeginImageContextWithOptions(size, false, image.scale)

    // Draws second half of image in first half
    image.drawInRect(
        CGRectMake(0, 0, size.width / 2, size.height),
        fromRect: CGRectMake(size.width / 2, 0, size.width / 2, size.height),
        blendMode: kCGBlendModeNormal,
        alpha: 1)

    // Draws first half of image in second half
    image.drawInRect(
        CGRectMake(size.width / 2, 0, size.width / 2, size.height),
        fromRect: CGRectMake(0, 0, size.width / 2, size.height),
        blendMode: kCGBlendModeNormal,
        alpha: 1)

    var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()

    imageView.image = newImage

想通了。

        var size = CGSize(width: self.singlefirstimagepostview.frame.width, height: self.singlefirstimagepostview.frame.height)
        UIGraphicsBeginImageContext(size)
        let areaSize = CGRect(x: 0, y: 0, width: size.width/2, height: size.height)


        var leftimage = CGImageCreateWithImageInRect(self.revertimageview.image!.CGImage, CGRectMake(self.revertimageview.image!.size.width*0.25, 0, self.revertimageview.image!.size.width/2 , self.revertimageview.image!.size.height))

        var rightimage = CGImageCreateWithImageInRect(self.revertimageview2.image!.CGImage, CGRectMake(self.revertimageview2.image!.size.width*0.25, 0, self.revertimageview2.image!.size.width/2 , self.revertimageview2.image!.size.height))


        let leftyimage = UIImage(CGImage: leftimage)
        let rightyimage = UIImage(CGImage: rightimage)


        //self.revertimageview.image!.drawInRect(areaSize)
        leftyimage!.drawInRect(areaSize)



        let areaSize2 = CGRect(x: size.width/2, y: 0, width: size.width/2, height: size.height)

        //self.revertimageview2.image!.drawInRect(areaSize2, blendMode: kCGBlendModeNormal, alpha: 1)

        rightyimage!.drawInRect(areaSize2, blendMode: kCGBlendModeNormal, alpha: 1)

        var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        self.singlefirstimagepostview.image = newImage