Генерация полосовых линий с использованием CoreImage - без острых краев - PullRequest
0 голосов
/ 28 июня 2018

Я генерирую изображение с полосовыми линиями с использованием инфраструктуры CoreImage, и на выходе, кажется, есть неправильные края, как показано на изображении ниже. Код, который я использовал, как показано ниже.

fileprivate func generateImage(_ width: CGFloat, _ height: CGFloat, withColor1: CIColor, withColor2: CIColor) -> CGImage? {

   let context = CIContext()

   if #available(iOS 10.0, *) {
   let stripes = CIFilter(name: "CIStripesGenerator", withInputParameters: [
                "inputColor0" : withColor2,
                "inputColor1" : withColor1,
                "inputWidth" : NSNumber(value: 10),
                "inputSharpness" : NSNumber(value: 0.7)

                ])!.outputImage!

    let rotate = CIFilter(name: "CIAffineTransform", withInputParameters: [ "inputImage" : stripes,"inputTransform" : NSValue(cgAffineTransform: CGAffineTransform(rotationAngle: -75.0))])!.outputImage!

    return context.createCGImage(rotate, from: CGRect(x: 0, y: 0, width: width, height: 50.0))!

        } else {
            // Fallback on earlier versions
        }

        return nil

    }

С высокой резкостью

enter image description here

с низкой резкостью (0,7)

enter image description here

Что мне нужно, ниже

enter image description here

Ответы [ 2 ]

0 голосов
/ 11 июля 2018

Приведите значение радиана, а не градуса, значение .pi / -4 для угла поворота: CGAffineTransform.

import UIKit
import CoreImage

fileprivate func
generateImage(_ width: CGFloat, _ height: CGFloat, withColor1: CIColor, withColor2: CIColor) -> CGImage? {

    let context = CIContext()

    let stripes = CIFilter(
        name: "CIStripesGenerator"
    ,   parameters: [
            "inputColor0"   : withColor2
        ,   "inputColor1"   : withColor1
        ,   "inputWidth"    : NSNumber( value: 10 )
        ,   "inputSharpness": NSNumber( value: 1 )
        ]
    )!.outputImage!

    let rotate = CIFilter(
        name: "CIAffineTransform"
    ,   parameters: [
            "inputImage"    : stripes
        ,   "inputTransform": NSValue( cgAffineTransform: CGAffineTransform( rotationAngle: .pi / -4 ) )
        ]
    )!.outputImage!

    return context.createCGImage( rotate, from: CGRect( x: 0, y: 0, width: width, height: height ) )!
}


class ViewController: UIViewController {
    @IBOutlet   weak    var oIV:    UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        oIV.image = UIImage(
            cgImage: generateImage(
                oIV.bounds.width
            ,   oIV.bounds.height
            ,   withColor1: CIColor( red:0, green:0, blue:0, alpha:1 )
            ,   withColor2: CIColor( red:1, green:1, blue:1, alpha:1 )
            )!
        )
    }
}

Результаты: enter image description here

0 голосов
/ 28 июня 2018

Вы можете попробовать что-то вроде этого, однако я не проверял это должным образом:

let generatedImage = generateImage(...)

let scaleX = yourView.frame.size.width / generatedImage.extent.size.width
let scaleY = yourView.frame.size.height / generatedImage.extent.size.height

let transformedImage = generatedImage.transformed(by: CGAffineTransform(scaleX: scaleX, y: scaleY))
...