Swift
ürününe yeni kayıt yapıyorum ve kurucuda filtre formülünü ve yoğunluğunu alan bir sınıf/struct filtresi oluşturmaya çalışıyorum. Bu sınıf, verilen formülü verilen bir yoğunluğa parametresindeki bir görüntü üzerinde uygulamak ve sonra değiştirilen görüntüyü döndürmek için bir yönteme sahiptir.Hızlı Görüntü İşleme
UIImage
'u RGBAImage'a dönüştürmek için yöntemleri olan RGBAImage.swift
adlı bir sınıfımız var ve bunun tersi de geçerlidir.
Bu benim oluşturulan sınıfı:
bir hata söyleyerek son satırında varimport 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)
türünün değerini 'UImage' dönüştürülemezbeklenen argüman tipine 'ImageFilter'
İşte RGBA sınıfı:
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
}
}
nerede sınıf 'RGBAImage.swift'? Tek gördüğüm "imageFilter" adlı bir sınıf mı? – NSNoob
Sadece düzenledim, bir göz atabilirsin – TykiMikk
Doğru hat boyunca düşündüğümden emin olmak için bir şey yapabilir misin? Son satırı şu şekilde değiştirin: 'let test = imageFilter() izin verilen processImg = test.increaseContrast (image)' – NSNoob