2015-11-02 9 views
6

मैं Swift पर नया हूं और मैं एक वर्ग/संरचना फ़िल्टर बनाने की कोशिश कर रहा हूं जो कि कन्स्ट्रक्टर में फिल्टर सूत्र और तीव्रता लेता है। इस वर्ग में दिए गए फॉर्मूला को उसके पैरामीटर में छवि पर दिए गए तीव्रता के साथ लागू करने का तरीका है और फिर संशोधित छवि को वापस कर दें।स्विफ्ट छवि प्रसंस्करण

हमारे पास RGBAImage.swift नामक एक कक्षा है जिसमें UIImage को आरजीबीए इमेज में बदलने के तरीके हैं और इसके विपरीत।

यह मेरा बनाया वर्ग:

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) 

कोई त्रुटि है अंतिम पंक्ति कह पर

उम्मीद तर्क प्रकार के प्रकार के मूल्य 'UImage' कनवर्ट नहीं कर सकता 'imageFilter'

यहां आरजीबीए कक्षा है:

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

इसके अलावा जहां है वर्ग 'RGBAImage.swift'? मैं देखता हूं कि 'imageFilter' नामक एक वर्ग है? – NSNoob

+1

मैंने अभी इसे संपादित किया है आप – TykiMikk

+0

देख सकते हैं क्या आप यह सुनिश्चित कर सकते हैं कि मैं सही रेखा के साथ सोच रहा हूं? इसके साथ अंतिम पंक्ति को बदलें: 'टेस्ट = छविफिल्टर() संसाधित करने दें Img = test.increaseContrast (छवि) ' – NSNoob

उत्तर

4

मुझे पूरा यकीन है कि आपकी समस्या यह है कि आपने अपनी सदस्य विधि को कॉल करने का प्रयास करते समय अपनी कक्षा का एक उदाहरण नहीं बनाया है।

इस कोड के साथ अंतिम पंक्ति बदलें:

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

ओह वाह यह काम करता है। मैंने सोचा कि test.increaseContrast (छवि) काम करता है। आपका बहुत बहुत धन्यवाद! – TykiMikk

संबंधित मुद्दे