Как объединить 3 изображения (100x100 пикселей) в одно новое большое (300x100 пикселей) в Swift - PullRequest
0 голосов
/ 01 августа 2020

Я новичок в swiftUI и не нашел способа.

Я хочу создать одно изображение (300x100) динамически, объединив три отдельных изображения 100x100 по горизонтали

ImageA (100x100) + ImageB ( 100x100) + Image C (100x100) = ImageD (300x100)

Нашел способ показать их в HStack, но как получить одно новое изображение для отправки даты в новую функцию

С уважением, Алекс

Ответы [ 2 ]

0 голосов
/ 02 августа 2020

большое спасибо, я пытался использовать вашу функцию, но тут возникла ошибка «Невозможно преобразовать значение типа 'UIImage?' ожидаемому типу элемента 'UIImage'!

Код должен содержать 3x нуля. в number-0.png - только один ноль

    //
//  ContentView.swift
//  imagecombine
//
//  Created by Alex on 02.08.20.
//  Copyright © 2020 Alex. All rights reserved.
//

import SwiftUI

func combineHorizontally(_ images: [UIImage]) -> UIImage? {
    guard !images.isEmpty else { return nil }

    var size = CGSize.zero
    var scale = CGFloat.zero

    for image in images {
        scale = max(scale, image.scale)
        size = CGSize(width: size.width + image.size.width, height: max(size.height, image.size.height))
    }

    var position = CGPoint.zero
    let format = UIGraphicsImageRendererFormat()
    format.scale = scale

    return UIGraphicsImageRenderer(size: size, format: format).image { context in
        for image in images {
            image.draw(at: position)
            position.x += image.size.width
        }
    }
}
let redImage = UIImage(named: "number-0.png")
let greenImage = UIImage(named: "number-0.png")
let blueImage = UIImage(named: "number-0.png")

let image = combineHorizontally([redImage, greenImage, blueImage])

struct ContentView: View {
    var body: some View {
        
        
         Image(image)
        
        
        
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
            ContentView()
        }
    }
0 голосов
/ 01 августа 2020

Вы можете использовать UIImageGraphicsRenderer и draw изображения одно за другим:

func combineHorizontally(_ images: [UIImage]) -> UIImage? {
    guard !images.isEmpty else { return nil }

    var size = CGSize.zero
    var scale = CGFloat.zero

    for image in images {
        scale = max(scale, image.scale)
        size = CGSize(width: size.width + image.size.width, height: max(size.height, image.size.height))
    }

    var position = CGPoint.zero
    let format = UIGraphicsImageRendererFormat()
    format.scale = scale

    return UIGraphicsImageRenderer(size: size, format: format).image { _ in
        for image in images {
            image.draw(at: position)
            position.x += image.size.width
        }
    }
}

Вы сказали, что были только изображения, и они были 100 × 100, но приведенное выше должно работать независимо от число и размер (конечно, если позволяет память).

В любом случае, это

let image = combineHorizontally([redImage, greenImage, blueImage])

Результат:

введите описание изображения здесь

Чтобы использовать это в контексте, где вам не нужен необязательный параметр, вы можете использовать оператор принудительного развертывания !, оператор объединения ?? nil или какой-либо другой шаблон развертывания, например guard let, if let, et c.

В качестве альтернативы, если вы вообще не хотите иметь дело с необязательными параметрами, вы можете написать представление, которое вообще не возвращает необязательный параметр (но также не обнаруживает сценарий ошибки где был предоставлен пустой массив):

func combineHorizontally(_ images: [UIImage]) -> UIImage {
    var size = CGSize.zero
    var scale: CGFloat = 1
    
    for image in images {
        scale = max(scale, image.scale)
        size = CGSize(width: size.width + image.size.width, height: max(size.height, image.size.height))
    }
    
    var position = CGPoint.zero
    let format = UIGraphicsImageRendererFormat()
    format.scale = scale
    
    return UIGraphicsImageRenderer(size: size, format: format).image { _ in
        for image in images {
            image.draw(at: position)
            position.x += image.size.width
        }
    }
}
...