Я разрабатываю приложение для Android, которое должно применить эффект сепии к загруженному изображению. Заявка уже есть. Я наткнулся на функцию в быстром коде, которая применяет эффект сепии.
func applySepia() -> UIImage? {
filterValue = 1
let image = self.processPixels(filterValue: filterValue)
guard let cgimg = image?.cgImage else {
print("imageView doesn't have an image!")
return self
}
let value = -filterValue
print("sliderValue = \(filterValue)")
print("value = \(value)")
let openGLContext = EAGLContext(api: .openGLES2)
let context = CIContext(eaglContext: openGLContext!)
let coreImage = CIImage(cgImage: cgimg)
let filter = CIFilter(name: "CISepiaTone")
filter?.setValue(coreImage, forKey: kCIInputImageKey)
filter?.setValue(value, forKey: kCIInputIntensityKey)
if let output = filter?.value(forKey: kCIOutputImageKey) as? CIImage {
let cgimgresult = context.createCGImage(output, from: output.extent)
let image = UIImage(cgImage: cgimgresult!)
return image.applySharpness(filterValue:filterValue)
}
return self
}
Выше функция использует фильтр "CISepiaTone" для реализации тона сепии. Здесь «kCIInputIntensityKey» передается как -1, что я не могу понять. Согласно документации, его значение колеблется от 0 до 1, но как оно допускает отрицательное значение. Из-за этого значения интенсивности сгенерированное изображение выглядит так:
На мой взгляд, после применения сепии это должно выглядеть так:
Я могу получить второе изображение в Android (это действительно Sepia Tone), используя https://github.com/StevenRudenko/ColorMartix/blob/master/src/com/sample/colormatrix/Main.java
Однако я не смог найти ни одного встроенного метода или класса в Android, который можно было бы использовать для реализации Sepia Tone с отрицательной интенсивностью так же, как он применяется в IOS swift. Вот мои вопросы:
- Как IOS допускает отрицательное значение для kCIInputIntensityKey, несмотря на
тот факт, что он должен быть в диапазоне 0-1.
- После отрицательных значений интенсивности сгенерированные изображения не выглядят
Тон сепии.
- Как мне добиться того же эффекта в Android?