2015-11-02 19 views
6

Sono nuovo di Swift e sto provando a creare un filtro di classe/struct che richiede la formula e l'intensità del filtro nel costruttore. Questa classe ha un metodo per applicare la formula data con intensità data su un'immagine nel suo parametro e quindi restituire l'immagine modificata.Elaborazione rapida di immagini

Abbiamo una classe chiamata RGBAImage.swift che ha metodi per convertire uno UIImage in un'immagine RGBA e viceversa.

Questa è la mia classe creata:

import UIKit 


let image = UIImage(named: "sample")! 






class imageFilter{ 


    func increaseContrast(image: UIImage) -> UIImage{ 
     let rgbaImage = RGBAImage(image: image)! 
     var totalRed = 0 
     var totalGreen = 0 
     var totalBlue = 0 
     let pixelCount = rgbaImage.width * rgbaImage.height 

     for y in 0..<rgbaImage.height { 
      for x in 0..<rgbaImage.width { 
       let index = y * rgbaImage.width + x 
       let pixel = rgbaImage.pixels[index] 
       totalRed += Int(pixel.red) 
       totalGreen += Int(pixel.green) 
       totalBlue += Int(pixel.blue) 
      } 
     } 


     let avgRed = totalRed/pixelCount 
     let avgGreen = totalGreen/pixelCount 
     let avgBlue = totalBlue/pixelCount 


     for y in 0..<rgbaImage.height { 
      for x in 0..<rgbaImage.width { 
       let index = y * rgbaImage.width + x 
       var pixel = rgbaImage.pixels[index] 
       let redDelta = Int(pixel.red) - avgRed 
       let greenDelta = Int(pixel.green) - avgGreen 
       let blueDelta = Int(pixel.blue) - avgBlue 
       pixel.red = UInt8(max(min(255, avgRed + 2 * redDelta), 0)) 
       pixel.blue = UInt8(max(min(255, avgBlue + 2 * blueDelta), 0)) 
       pixel.green = UInt8(max(min(255, avgGreen + 2 * greenDelta), 0)) 
       rgbaImage.pixels[index] = pixel 


       } 
      } 
     let finished = rgbaImage.toUIImage()! 
     return (finished) 
     } 


} 


let test = imageFilter.increaseContrast(image) 

C'è un errore sull'ultima riga dicendo

Impossibile convertire il valore di tipo 'uImage' per tipo di argomento previsto 'ImageFilter'

Ecco la classe RGBA:

import UIKit 

public struct Pixel { 
    public var value: UInt32 

public var red: UInt8 { 
    get { 
     return UInt8(value & 0xFF) 
    } 
    set { 
     value = UInt32(newValue) | (value & 0xFFFFFF00) 
    } 
} 

public var green: UInt8 { 
    get { 
     return UInt8((value >> 8) & 0xFF) 
    } 
    set { 
     value = (UInt32(newValue) << 8) | (value & 0xFFFF00FF) 
    } 
} 

public var blue: UInt8 { 
    get { 
     return UInt8((value >> 16) & 0xFF) 
    } 
    set { 
     value = (UInt32(newValue) << 16) | (value & 0xFF00FFFF) 
    } 
} 

public var alpha: UInt8 { 
    get { 
     return UInt8((value >> 24) & 0xFF) 
    } 
    set { 
     value = (UInt32(newValue) << 24) | (value & 0x00FFFFFF) 
    } 
    } 
} 




public struct RGBAImage { 
public var pixels: UnsafeMutableBufferPointer<Pixel> 

public var width: Int 
public var height: Int 

public init?(image: UIImage) { 
    guard let cgImage = image.CGImage else { return nil } 

    // Redraw image for correct pixel format 
    let colorSpace = CGColorSpaceCreateDeviceRGB() 

    var bitmapInfo: UInt32 = CGBitmapInfo.ByteOrder32Big.rawValue 
    bitmapInfo |= CGImageAlphaInfo.PremultipliedLast.rawValue & CGBitmapInfo.AlphaInfoMask.rawValue 

    width = Int(image.size.width) 
    height = Int(image.size.height) 
    let bytesPerRow = width * 4 

    let imageData = UnsafeMutablePointer<Pixel>.alloc(width * height) 

    guard let imageContext = CGBitmapContextCreate(imageData, width, height, 8, bytesPerRow, colorSpace, bitmapInfo) else { return nil } 
    CGContextDrawImage(imageContext, CGRect(origin: CGPointZero, size: image.size), cgImage) 

    pixels = UnsafeMutableBufferPointer<Pixel>(start: imageData, count: width * height) 
} 

public func toUIImage() -> UIImage? { 
    let colorSpace = CGColorSpaceCreateDeviceRGB() 
    var bitmapInfo: UInt32 = CGBitmapInfo.ByteOrder32Big.rawValue 
    bitmapInfo |= CGImageAlphaInfo.PremultipliedLast.rawValue & CGBitmapInfo.AlphaInfoMask.rawValue 

    let bytesPerRow = width * 4 

    let imageContext = CGBitmapContextCreateWithData(pixels.baseAddress, width, height, 8, bytesPerRow, colorSpace, bitmapInfo, nil, nil) 

    guard let cgImage = CGBitmapContextCreateImage(imageContext) else {return nil} 
    let image = UIImage(CGImage: cgImage) 

    return image 
} 
} 
+0

anche dove è la classe 'RGBAImage.swift'? Tutto quello che vedo è una classe chiamata 'imageFilter'? – NSNoob

+1

L'ho appena editato puoi dare un'occhiata – TykiMikk

+0

Puoi fare una cosa, essere sicuro che sto pensando lungo la linea giusta? Sostituisci l'ultima riga con questo: 'let test = imageFilter() let processedImg = test.increaseContrast (image)' – NSNoob

risposta

4

Sono sicuro che il tuo problema è che non hai creato un'istanza della classe mentre provi a chiamare il suo metodo membro.

Sostituire l'ultima riga con questo codice:

let test = imageFilter() 
let processedImg = test.increaseContrast(image) 
+1

Oh wow ha funzionato. Pensavo che test.increaseContrast (immagine) funzionasse. Molte grazie! – TykiMikk

Problemi correlati