ios - 快速图像处理

标签 ios swift image-processing

我是 Swift 的新手,我正在尝试创建一个在构造函数中采用过滤器公式和强度的类/结构过滤器。此类有一个方法,可以在其参数中将具有给定强度的给定公式应用于图像,然后返回修改后的图像。

我们有一个名为 RGBAImage.swift 的类,它具有将 UIImage 转换为 RGBAImage 的方法,反之亦然。

这是我创建的类:

import UIKit


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






class imageFilter{


    func increaseContrast(image: UIImage) -> UIImage{
        let rgbaImage = RGBAImage(image: image)!
        var totalRed = 0
        var totalGreen = 0
        var totalBlue = 0
        let pixelCount = rgbaImage.width * rgbaImage.height

        for y in 0..<rgbaImage.height {
            for x in 0..<rgbaImage.width {
                let index = y * rgbaImage.width + x
                let pixel = rgbaImage.pixels[index]
                totalRed += Int(pixel.red)
                totalGreen += Int(pixel.green)
                totalBlue += Int(pixel.blue)
            }
        }


        let avgRed = totalRed/pixelCount
        let avgGreen = totalGreen/pixelCount
        let avgBlue = totalBlue/pixelCount


        for y in 0..<rgbaImage.height {
            for x in 0..<rgbaImage.width {
                let index = y * rgbaImage.width + x
                var pixel = rgbaImage.pixels[index]
                let redDelta = Int(pixel.red) - avgRed
                let greenDelta = Int(pixel.green) - avgGreen
                let blueDelta = Int(pixel.blue) - avgBlue
                pixel.red = UInt8(max(min(255, avgRed + 2 * redDelta), 0))
                pixel.blue = UInt8(max(min(255, avgBlue + 2 * blueDelta), 0))
                pixel.green = UInt8(max(min(255, avgGreen + 2 * greenDelta), 0))
                rgbaImage.pixels[index] = pixel


                }
            }
        let finished = rgbaImage.toUIImage()!
        return (finished)
        }


}


let test = imageFilter.increaseContrast(image)

最后一行有错误

Cannot convert value of type 'UImage' to expected argument type 'imageFilter'

这是 RGBA 类:

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

最佳答案

我很确定你的问题是你在尝试调用它的成员方法时没有创建你的类的实例。

用这段代码替换最后一行:

let test = imageFilter()
let processedImg = test.increaseContrast(image)

关于ios - 快速图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33470779/

相关文章:

ios - 为 iOS 应用程序加载基于 SVG 的图像资源

ios - 如何在没有动画的情况下更新 SwiftUI 列表

objective-c - 更改 UIBarButtonItem 的位置

java - 在java中获取图像的字节格式

ios - 捆绑无效。关键 UIRequiredDeviceCapability 包含 'Item 0' 。最低版本 4.3

ios - 自动调整不同屏幕尺寸的 View 对象

ios - 获取 iPhone 最新型号的底部高度

ios - 有没有一种特定的方法可以在 Swift 中将元组用作集合元素?

java - 我应该如何用Java进行图像处理?

c# - 确定图像是否模糊