私は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)
が期待される引数の型 に型「UImage」の値を変換できませんと言って、最後の行にエラーがあります「の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
}
}
をまたどこのクラスは 'RGBAImage.swift'のですか?私が見るすべては 'imageFilter'という名前のクラスですか? – NSNoob
私はちょうどあなたが見 – TykiMikk
を取ることができ、それをedittedあなたは私が右のラインに沿って考えていますことを確認するために、一つのことを行うことができますか?最後の行を次のように置き換えます。 'let test = imageFilter() let processedImg = test.increaseContrast(image)' – NSNoob