2016-08-29 3 views
4

Ich habe diese ImageProcessor in Swift (das ist nicht meins), ich versuche, es mit einigen Filtern zu verwenden, die ich gemacht habe, aber beim Ausprobieren Zeug bemerkte ich, dass es einige zufällige Geräusche gab.Bildbearbeitung mit Swift hat zufällige Effekte

Um dies zu testen, habe ich einen benutzerdefinierten Filter NoFilter gemacht, der nichts tut.

Dies sollte das gleiche Bild ausgeben, das es bekommt, und manchmal gibt es zufällige Fehler innerhalb des Bildes.

Zum Beispiel:

enter image description here

Beachten Sie, wie es der gleiche Code ist, und es erzeugt jedes Mal unterschiedliche Fehler. Am Ende der Frage ist der Link, um es selbst zu versuchen, jedes Mal, wenn es läuft, kann anders sein. Was könnte das verursachen?

Der Stromfluss des Programms ist es, dass die ImageProcessor empfängt und Bild und wandelt es in RGBAImage, dann, wenn apply mit einem Filter genannt wird, gilt, dass Filter auf jedes Pixel in den RGBAImage (die in diesem Fall ist keine Filter). Und schließlich, wenn getImage aufgerufen wird, konvertiert es die RGBAImage zurück zu UIImage. Dies deutet darauf hin, dass es ein Problem mit der Konvertierung von und/oder zu RGBAImage geben kann, aber ich kann nichts falsch finden.

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

This is the code, dass ich derzeit testen, versuchen Sie es bitte.

Irgendeine Idee?

EDIT: Uploaded meinen Code zu Git, so dass es online überprüft werden kann.

+0

Bitte bearbeiten Sie Ihre Frage, um den entsprechenden Code als MCVE einzuschließen. Niemand möchte unbekannte Dateien von merkwürdigen URLs herunterladen. –

+0

@RoboticCat fair genug. Fest. – rr1g0

Antwort

2

Sie vergessen, Ihren Bildkontext zu löschen, wenn Sie Ihr Bild darin zeichnen. Versuchen Sie, einen Anruf zu CGContextClearRect fügt hinzu:

let rect = CGRect(origin: CGPointZero, size: image.size) 
CGContextClearRect(imageContext, rect) // Avoid undefined pixels! 
CGContextDrawImage(imageContext, rect, cgImage) 

Das späht undefiniertes Pixel von unten Ihr Bild transparenten Bereichen zu vermeiden.

+0

Das hat funktioniert! Vielen Dank. – rr1g0

Verwandte Themen