gpt4 book ai didi

ios - 使用 Swift 进行图像处理具有随机效果

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:32 24 4
gpt4 key购买 nike

我有这个ImageProcessor在 Swift 中(这不是我的),我试图将它与我制作的一些过滤器一起使用,但在尝试一些东西时我注意到有一些随机噪音。

为了对此进行测试,我制作了一个自定义过滤器 NoFilter,它什么都不做。

public class NoFilter : ImageFilterProtocol{
public func apply(pixel: Pixel) -> Pixel {
return pixel
}
}

这应该输出与它获得的相同的图像,有时它会在图像中产生随机错误。

例如:

enter image description here

请注意,相同的代码每次都会产生不同的错误。问题的最后是自己尝试的链接,每次运行都可能不同。可能是什么原因造成的?

程序的当前流程是 ImageProcessor 接收图像并将其转换为 RGBAImage,然后当 apply 被调用时滤镜,它将滤镜应用于 RGBAImage 中的每个像素(在本例中是无滤镜)。最后,当 getImage 被调用时,它将 RGBAImage 转换回 UIImage。这表明从和/或到 RGBAImage 的转换可能存在问题,但我找不到任何问题。

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我目前正在测试,请尝试一下。

有什么想法吗?

编辑:将我的代码上传到 git,以便在线检查。

最佳答案

当您将图像绘制到其中时,您忘记清除图像上下文。尝试添加对 CGContextClearRect 的调用:

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

这将避免未定义的像素从图像的透明区域下方窥视。

关于ios - 使用 Swift 进行图像处理具有随机效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39216166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com