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:
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.
Bitte bearbeiten Sie Ihre Frage, um den entsprechenden Code als MCVE einzuschließen. Niemand möchte unbekannte Dateien von merkwürdigen URLs herunterladen. –
@RoboticCat fair genug. Fest. – rr1g0