Perfectly Clear Dynamic SDK  1.0.0.23
Android SDK Usage

DynamicProcessor Image Processor Class

There are four main steps to processing photos or videos with the Dyanmic SDK:

1) Create Instance

Use singleton instance of DynamicProcessor with Hilt Dependency Injection:

@Singleton
@Provides
fun provideDynamicProcessor(@ApplicationContext context: Context):DynamicProcessor{
return DynamicProcessor(context)
}

You may use any other singleton pattern for creating this instance.

2) Initialize

Set Dynamic license (API key and Certificate)

  • param apiKey [string]
  • param cert [string]
  • param recreate [boolean]

If you update the certificate at runtime, set recreate to true.

DynamicProcessor.setLicence(apiKey = apiKey, cert = cert, recreate = recreate)

Initialize DynamicProcessor

It make take a few seconds, so we recommend to do it in background thread to prevent UI freeze.

  • param useGpu [boolean]
    • true for GPU inference (faster on most devices)
    • false for CPU inference
DynamicProcessor.init(useGpu = true)

3) Process Preview Image

Process given image in bitmap object and get result for preview. This method used for fast preview, image is scaled down to screen size.

  • param bitmap [bitmap] original bitmap image
  • param strength [float] strength of dynamic to be applied (in range from 0.0 to 1.0)
  • return DynamicOutput set this result to DynamicView
DynamicProcessor.processImagePreview(bitmap = imageBitmap, strength = 0.8)

4) Process full size image

Process given image in bitmap object and get bitmap return for preview in standard ImageView or for saving to storage. This method may last longer but returns result in full size bitmap.

  • param bitmap [bitmap] original bitmap image
  • param strength [float] strength of dynamic to be applied (in range from 0.0 to 1.0)
  • return Bitmap
DynamicProcessor.processImage(bitmap = imageBitmap, strength = 0.8)

DynamicView Widget for Previewing

We have created a simple widget to allow you to quickly add a preview of the Dynamic correction to your app.

1) Include into UI

<photos.eyeq.dynamic.eglx.image.DynamicView
android:id="@+id/dynamic_preview"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>

2) Render Preview

  • method setBitmap [bitmap] original bitmap image
  • method setParams [DynamicOutput] output received from DynamicProcessor
  • method requestRender after setting Bitmap and DynamicOuput call this method to render preview
binding.dynamicPreview.setBitmap(bitmap)
binding.dynamicPreview.setParams(dynamicOutput.global, dynamicOutput.local, dynamicOutput.fusion)
binding.dynamicPreview.requestRender()

Change dynamic strength

  • method setStrength (optional) [float 0.0 - 1.0] after setting Bitmap and DynamicOuput we can change dynamic strength WITHOUT recalling DynamicProcessor::processImage

After each change of strength, a call to requestRender is required. Simple example:

binding.dynamicPreview.setStrength(0.5f)
binding.dynamicPreview.requestRender()

Sample Usage

XML layout

<photos.eyeq.dynamic.eglx.image.DynamicView
android:id="@+id/dynamic_preview"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>

Fragment or Activity

fun previewImage(bitmap: Bitmap) = with(binding) {
val outputs = dynamicProcessor.processImagePreview(bitmap, 0.8f)
dynamicPreview.setBitmap(bitmap)
dynamicPreview.setParams(outputs.global, outputs.local, outputs.fusion)
dynamicPreview.requestRender()
}
fun saveImage(bitmap: Bitmap) {
val resultImage = dynamicProcessor.processImage(bitmap, 0.8f)
saveImageToStorage(resultImage)
}