Я пытаюсь написать код для применения фильтра для изображения в swift. Я тестирую следующий код на игровой площадке. По какой-то причине он по-прежнему терпит неудачу, и я считаю, что это потому, что я перепутал где-то в переменной, ссылающейся на функции. Я понятия не имею, должен ли я использовать inout в инициализаторе, чтобы изменить значения или что-то в этом роде. Пожалуйста, укажите, где я делаю ошибку. Код не дает никаких ошибок, но это не приводит к тому, что я хочу получить изображение.Использование функций в быстрых классах
//: Playground - noun: a place where people can play
import UIKit
class imageProcessor{
var avgRed = 0
var avgBlue = 0
var avgGreen = 0
var avgPixelValue = 0
var rgbaImage:RGBAImage? = nil
func averagePixelValue (input inputImage: RGBAImage) -> (Int , Int , Int , Int){
var totalRed = 0
var totalBlue = 0
var totalGreen = 0
for y in 0..<inputImage.height{
for x in 0..<inputImage.width{
let index = y * inputImage.height + x
let pixel = inputImage.pixels[index]
totalBlue += Int(pixel.blue)
totalRed += Int(pixel.red)
totalGreen += Int(pixel.green)
}
}
let totalPixels = inputImage.height * inputImage.width
let avgRed = totalRed/totalPixels
let avgBlue = totalBlue/totalPixels
let avgGreen = totalGreen/totalPixels
let avgValue = (avgRed + avgGreen + avgBlue)/3
return (avgRed , avgGreen , avgBlue , avgValue)
}
init (inputImage: RGBAImage) {
rgbaImage = inputImage
(avgRed , avgGreen , avgBlue , avgPixelValue) = averagePixelValue(input: rgbaImage!)
}
func addColorTint (color:String , intensity: Int=1)->RGBAImage{
for i in 0..<self.rgbaImage!.height{
for j in 0..<self.rgbaImage!.width{
var pixel = self.rgbaImage!.pixels[i*self.rgbaImage!.height + j]
let avgPixel = (Int(pixel.red) + Int(pixel.green) + Int(pixel.blue))/3
if (avgPixel > avgValue){
switch color{
case "red" :
self.rgbaImage!.pixels[i*self.rgbaImage!.height + j].red = UInt8(max(0,min(255,Int(pixel.red) * intensity)))
case "blue":
self.rgbaImage!.pixels[i*self.rgbaImage!.height + j].blue = UInt8(max(0,min(255,Int(pixel.blue) * intensity)))
case "green":
self.rgbaImage!.pixels[i*self.rgbaImage!.height + j].green = UInt8(max(0,min(255,Int(pixel.green) * intensity)))
default:
print ("0")
}
}
}
}
return self.rgbaImage!
}
}
let image = UIImage(named: "sample")
var rgbaImage = RGBAImage(image: image!)
// Process the image!
var newInstance = imageProcessor(inputImage: rgbaImage!)
let newrgbaInstance = newInstance.addColorTint("red", intensity: 2)
let newImage = newrgbaInstance.toUIImage()
newImage
код, кажется, работает нормально, но он не показывает выход в выходной площадки панели (правая сторона окна). Любые предложения относительно того, как я должен выполнять эту работу, высоко ценятся. Также он работал, когда я использовал его как простую функцию, но не как класс.
Кроме того, библиотека/класс Я использую включен ниже
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
}
}
Hi Quicksillver, я не спустил вас вниз, но я хотел, чтобы вы знали, почему вы сомневаетесь, не получили хорошего ответа. В Stack Overflow есть инструкции для публикации, которые изложены в [ask], которые вы должны прочитать перед публикацией. Вы получаете голоса, потому что ваш вопрос не соответствует Stack Overflows [mcve]. Добро пожаловать! –
@DanBeaulieu, Спасибо. Я не часто бываю здесь, поэтому я не знаком с этим. – Quicksillver
без проблем quicksilver, вы заметите, как только ваши вопросы будут соответствовать [mcve], вы начнете поднимать голоса. –