【问题标题】:Combining 2 images, working but stretching结合 2 张图像,工作但拉伸
【发布时间】:2015-09-02 01:13:31
【问题描述】:

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

@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 是我想要的样子。

【问题讨论】:

    标签: ios xcode swift uiimageview


    【解决方案1】:

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

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

    我很快就根据那篇文章写了一个 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
    

    【讨论】:

    • 在“//在前半部分绘制图像的后半部分”下的代码中,我得到无法调用具有争论列表类型的“drawinRect”.....,它来自“fromRect: CGRectMake(size.width / 2, 0, size.width / 2, size.height)”。当我把它拿出来时没有错误,但没有它它仍然会挤压图像
    • 您是在课程中的某处或添加到目标的单独课程中包含扩展名吗?因为如果我将扩展名排除在外,我会得到同样的错误,否则它应该识别 UIImage 上接受这些参数的方法。
    【解决方案2】:

    您需要先拆分图像并将其组合回来。下面是我从其他问题中找到的分割图像的代码:https://stackoverflow.com/a/28516817/3178993

    【讨论】:

      【解决方案3】:

      想通了。

              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
      

      【讨论】:

        猜你喜欢
        • 2015-09-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-29
        • 1970-01-01
        • 1970-01-01
        • 2010-11-09
        • 2019-05-12
        相关资源
        最近更新 更多