swift - 为 RGB 图像创建灰度滤镜时,Swift 中的执行被中断

标签 swift image-processing swift-playground rgba

我是 Swift 的新手。我正在尝试使用均值方法创建灰度滤镜。

这是我正在使用的 RGBAImage.swift 文件:

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

这是我的代码:

import UIKit

let image = UIImage(named: "sample")!
let myRGBA = RGBAImage(image: image)!

struct grayscale_mean_method {
    var result: UIImage {
        for y in 0..<myRGBA.height {
            for x in 0..<myRGBA.width {
                let index = y * myRGBA.width + x
                var pixel = myRGBA.pixels[index]
                let intensity = (pixel.blue + pixel.green + pixel.red) / 3
                let gray = UInt8(max(0,min(255, intensity)))
                pixel.red = gray
                pixel.green = gray
                pixel.blue = gray
                myRGBA.pixels[index] = pixel
            }
        }
        return myRGBA.toUIImage()!
    }
}

var newImage = grayscale_mean_method.init().result

但是我在赋值的时候遇到了错误

let intensity = (pixel.blue + pixel.green + pixel.red) / 3

Execution was interrupted, reason = EXC_BAD_INSTRUCTION (code =EXC_l386_INVOP, subcode=0x0) 

我搜索过但没有找到解决方案。知道我做错了什么吗?

最佳答案

let intensity = (pixel.blue + pixel.green + pixel.red) / 3

加法的所有操作数的类型都是UInt8,并且加法 溢出(运行时异常)如果结果不合适 进入 UInt8 的范围。要解决问题,请转换所有值 在计算平均值之前转换为 Int:

let intensity = (Int(pixel.blue) + Int(pixel.green) + Int(pixel.red)) / 3

关于swift - 为 RGB 图像创建灰度滤镜时,Swift 中的执行被中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34976230/

相关文章:

swift - 如何在 Swift Playground 播放完歌曲后调用函数

swift - 检测到上下文泄漏,msgtracer 返回 -1 (Swift 3)

ios - Int' 不能转换为 'Range<Int>

swift - 我想更改框架的版本。[swift 4/xcode 9]

ios - Xcode Swift Playgrounds - 如何为 ViewController 设置默认大小

java - 有没有内置的图像识别功能

python - 如何使用 OpenCV Python 显示图像的轮廓?

将 Swift 字符串数组转换为 c 字符**

ios - swift in UI test(测试UITableView中cell的个数)

用于 LBP 训练的 OpenCV traincascade