Swiftui coreimage cifilter.shadedmaterial () превращает изображение в один цветIOS

Программируем под IOS
Ответить
Anonymous
 Swiftui coreimage cifilter.shadedmaterial () превращает изображение в один цвет

Сообщение Anonymous »

Я пытаюсь применить эффект затенения для текста в изображении с использованием cifilter.shadedmaterial () в swiftui. Идея состоит в том, чтобы взять входное изображение с текстом, сгенерировать карту краев с помощью cifilter.heightfieldfromk (), а затем применить текстуру затенения из другого изображения. Тем не менее, я сталкиваюсь с двумя проблемами: < /p>
  • Иногда выход появляется как один твердый цвет вместо правильного применения. < /Li>
    В других случаях все изображение превращается в единый однородный оттенок, теряя все детали.
код: < /p>
import SwiftUI
import CoreImage
import CoreImage.CIFilterBuiltins

struct ShadedMaterialDemo: View {
let context = CIContext(options: nil) // ✅ Reuse CIContext
@State var outputImage: UIImage?

var body: some View {
VStack {
if let outputImage = outputImage {
Image(uiImage: outputImage)
.resizable()
.scaledToFit()
} else {
Text("Processing Image...")
}
}
.onAppear {
Task {
outputImage = await applyEdgeWorkFilter(intensity: 10)
}
}
}

func applyEdgeWorkFilter2(radius: Float) async -> CIImage? {
guard let inputImage = UIImage(named: "imgBGText") else { return nil }
guard let ciImage = CIImage(image: inputImage) else { return nil }

let filter = CIFilter.heightFieldFromMask()
filter.inputImage = ciImage
filter.radius = radius

return filter.outputImage
}

func applyEdgeWorkFilter(intensity: Float) async -> UIImage? {
guard let edgeImage = await applyEdgeWorkFilter2(radius: 10) else { return nil }
guard let shadeImage = UIImage(named: "imgShade"), let shadeCIImage = CIImage(image: shadeImage) else { return nil }

let filter = CIFilter.shadedMaterial()
filter.inputImage = edgeImage
filter.shadingImage = shadeCIImage
filter.scale = intensity

guard let resultImage = filter.outputImage else { return nil }

// ✅ Reduce memory usage by downscaling the output
let finalExtent = resultImage.extent.intersection(CGRect(x: 0, y: 0, width: 1024, height: 1024)) // Example size

if let cgImage = context.createCGImage(resultImage, from: finalExtent) {
return UIImage(cgImage: cgImage)
}

return nil
}
}

struct ShadedMaterialDemo_Previews: PreviewProvider {
static var previews: some View {
ShadedMaterialDemo()
}
}

< /code>
Что я ожидаю: < /strong> < /p>

[*] Изображение затенения должно применять текстуру только к краям текста, а не для всего изображения.

Apple Doc - заштрихован < /p>
Основное изображение < /strong> < /p>

заштрихованное изображение [/b]


Подробнее здесь: https://stackoverflow.com/questions/794 ... ngle-color
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»