将一组图像组合成单个图像,该图像是swift中的一行图像

时间:2016-08-17 10:34:57

标签: arrays swift image

尝试将图像数组合成一个看起来像图像长行的单个图像。 (注意:图片可能有也可能没有相似的尺寸)

enter image description here

这是代码,目前仅适用于单一尺寸图像

func combine(images: NSMutableArray) -> UIImage {
    var contextSize = CGSizeZero
    var xMaxSize : CGFloat = 0
    for image in images {
       //

        xMaxSize = xMaxSize + image.size.width
        //contextSize.width = max(contextSize.width , image.size.width )
        contextSize.height = max(contextSize.height, image.size.height)
    }
    contextSize.width = xMaxSize

    UIGraphicsBeginImageContextWithOptions(contextSize, false, UIScreen.mainScreen().scale)


    var imageXPlace :CGFloat = 0

    for image in images {


        let originX = imageXPlace
        let originY = (contextSize.height - image.size.height) / 2


        image.drawInRect(CGRectMake(originX, originY, image.size.width, image.size.height))

        imageXPlace = imageXPlace + image.size.width
    }

    let combinedImage = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()

    return combinedImage
}

此问题也与此one

有关

1 个答案:

答案 0 :(得分:1)

  • 图片尺寸不同
  • 组合图像的高度 - UIImage中的最小高度
  

ViewController.swift

import UIKit

struct ImageToCombine {
var image = UIImage()

var size: CGSize {
    get {
        return CGSize(width: image.size.width, height: image.size.height)
    }
}

var widthAndHeightRatio: CGFloat {
    get {
        return image.size.width/image.size.height
    }
}

init (image: UIImage) {
    self.image = image
}
}

class ViewController: UIViewController {

var imageView = UIImageView()
var images = [ImageToCombine]()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    imageView = UIImageView(frame: UIScreen.mainScreen().bounds)
    imageView.contentMode = .ScaleAspectFit
    view.addSubview(imageView)

    images.append(ImageToCombine(image: UIImage(named: "image1")!))
    images.append(ImageToCombine(image: UIImage(named: "image2")!))
    images.append(ImageToCombine(image: UIImage(named: "image3")!))

    imageView.image = combine(images, spaceBetweenImages: 10)
}

func combine(images: [ImageToCombine], spaceBetweenImages:CGFloat) -> UIImage {

    var fullWidth:CGFloat = 0
    var minHeight:CGFloat = images[0].size.height

    for index in 0..<images.count {
        fullWidth += images[index].size.width
        if (index+1 < images.count) {
            fullWidth += spaceBetweenImages
        }
        if (minHeight > images[index].size.height) {
            minHeight = images[index].size.height
        }
    }

    let quality = CGFloat(4)
    let boundForBetter = CGRectMake(0, 0, fullWidth*quality, minHeight*quality)

    UIGraphicsBeginImageContext(boundForBetter.size)
    let context = UIGraphicsGetCurrentContext()

    for index in 0..<images.count {

        var imageX:CGFloat = 0
        for index2 in 0..<index {
            imageX += images[index2].size.width

            if (index2+1 < images.count) {
                imageX += spaceBetweenImages
            }
        }
        let imageY:CGFloat = (minHeight - images[index].size.height)*quality/2
        let rect = CGRect(x: imageX*quality, y: imageY, width: images[index].size.width*quality, height: images[index].size.height*quality)
        CGContextDrawImage(context, rect, images[index].image.CGImage)
    }

    let combinedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    let resultImageimage = UIImage(CGImage: imageResize(combinedImage, sizeChange:CGSize(width: fullWidth/quality, height: minHeight/quality)).CGImage!, scale: 1.0, orientation: .DownMirrored)

    return resultImageimage
}

func imageResize(imageObj:UIImage, sizeChange:CGSize)-> UIImage {

    let hasAlpha = true
    let scale: CGFloat = 0.0 // Automatically use scale factor of main screen

    UIGraphicsBeginImageContextWithOptions(sizeChange, !hasAlpha, scale)
    imageObj.drawInRect(CGRect(origin: CGPointZero, size: sizeChange))

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext() // !!!
    return scaledImage
}
}

<强>结果:

enter image description here