【问题标题】:combine an array of images to a single image which is a row of images in swift将一组图像组合成单个图像,该图像是 swift 中的一行图像
【发布时间】:2016-12-23 23:16:00
【问题描述】:

试图将一组图像组合成一个看起来像一长排图像的图像。 (注意:图片大小可能相似也可能不同)

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

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有关

【问题讨论】:

    标签: arrays swift image


    【解决方案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
    }
    }
    

    结果:

    【讨论】:

    • 感谢 Vasily,当我以不相等的大小测试您的代码时,结果是一个长图像(我应该是这样),但图像是上下颠倒的。任何想法? (你的迅捷鸟也在另一面飞翔......)
    • 再来一次。你有不同的图像作为输入数组。你想调整它们的大小吗?
    • 图片在最后的单条上应该是相同的大小(.ScaleAspectFit 可以用于不同的大小),但是请看与您发布的图片相对的官方 swift logo,它们被翻转 180° 站立在他们的头上......
    • 您的任务相当艰巨。我希望这有帮助。我已经编辑了答案
    • 瓦西里,请清理你的答案,缩小图像或删除它们,我很乐意接受你的答案
    猜你喜欢
    • 2017-04-30
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    相关资源
    最近更新 更多