2015-12-07 3 views
-2

Я пытаюсь написать код для применения фильтра для изображения в swift. Я тестирую следующий код на игровой площадке. По какой-то причине он по-прежнему терпит неудачу, и я считаю, что это потому, что я перепутал где-то в переменной, ссылающейся на функции. Я понятия не имею, должен ли я использовать inout в инициализаторе, чтобы изменить значения или что-то в этом роде. Пожалуйста, укажите, где я делаю ошибку. Код не дает никаких ошибок, но это не приводит к тому, что я хочу получить изображение.Использование функций в быстрых классах

//: Playground - noun: a place where people can play 

import UIKit 

class imageProcessor{ 

var avgRed = 0 
var avgBlue = 0 
var avgGreen = 0 
var avgPixelValue = 0 
var rgbaImage:RGBAImage? = nil 

func averagePixelValue (input inputImage: RGBAImage) -> (Int , Int , Int , Int){ 

    var totalRed = 0 
    var totalBlue = 0 
    var totalGreen = 0 

    for y in 0..<inputImage.height{ 
     for x in 0..<inputImage.width{ 
      let index = y * inputImage.height + x 
      let pixel = inputImage.pixels[index] 

      totalBlue += Int(pixel.blue) 
      totalRed += Int(pixel.red) 
      totalGreen += Int(pixel.green) 

     } 
    } 

    let totalPixels = inputImage.height * inputImage.width 

    let avgRed = totalRed/totalPixels 
    let avgBlue = totalBlue/totalPixels 
    let avgGreen = totalGreen/totalPixels 
    let avgValue = (avgRed + avgGreen + avgBlue)/3 

    return (avgRed , avgGreen , avgBlue , avgValue) 

} 

init (inputImage: RGBAImage) { 

    rgbaImage = inputImage 
    (avgRed , avgGreen , avgBlue , avgPixelValue) = averagePixelValue(input: rgbaImage!) 

} 

func addColorTint (color:String , intensity: Int=1)->RGBAImage{ 
    for i in 0..<self.rgbaImage!.height{ 
     for j in 0..<self.rgbaImage!.width{ 
      var pixel = self.rgbaImage!.pixels[i*self.rgbaImage!.height + j] 
      let avgPixel = (Int(pixel.red) + Int(pixel.green) + Int(pixel.blue))/3 

      if (avgPixel > avgValue){ 
       switch color{ 
       case "red" : 
        self.rgbaImage!.pixels[i*self.rgbaImage!.height + j].red = UInt8(max(0,min(255,Int(pixel.red) * intensity))) 
       case "blue": 
        self.rgbaImage!.pixels[i*self.rgbaImage!.height + j].blue = UInt8(max(0,min(255,Int(pixel.blue) * intensity))) 
       case "green": 
        self.rgbaImage!.pixels[i*self.rgbaImage!.height + j].green = UInt8(max(0,min(255,Int(pixel.green) * intensity))) 
       default: 
        print ("0") 

       } 
      } 
     } 
    } 
    return self.rgbaImage! 
} 
} 



let image = UIImage(named: "sample") 

var rgbaImage = RGBAImage(image: image!) 





// Process the image! 

var newInstance = imageProcessor(inputImage: rgbaImage!) 

let newrgbaInstance = newInstance.addColorTint("red", intensity: 2) 

let newImage = newrgbaInstance.toUIImage() 
newImage 

код, кажется, работает нормально, но он не показывает выход в выходной площадки панели (правая сторона окна). Любые предложения относительно того, как я должен выполнять эту работу, высоко ценятся. Также он работал, когда я использовал его как простую функцию, но не как класс.

Кроме того, библиотека/класс Я использую включен ниже

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 
    } 
} 
+2

Hi Quicksillver, я не спустил вас вниз, но я хотел, чтобы вы знали, почему вы сомневаетесь, не получили хорошего ответа. В Stack Overflow есть инструкции для публикации, которые изложены в [ask], которые вы должны прочитать перед публикацией. Вы получаете голоса, потому что ваш вопрос не соответствует Stack Overflows [mcve]. Добро пожаловать! –

+0

@DanBeaulieu, Спасибо. Я не часто бываю здесь, поэтому я не знаком с этим. – Quicksillver

+0

без проблем quicksilver, вы заметите, как только ваши вопросы будут соответствовать [mcve], вы начнете поднимать голоса. –

ответ

0

Я нашел ошибку. Это было то, что я использовал неопознанную переменную avgValue, которую я переименовал в avgPixelValue.