Handle low-quality or blurry images
BlinkID assesses the quality of every camera frame before it tries to extract data.
You can control how strictly the SDK treats blur, glare, and poor lighting through the documentCaptureModule of ScanningSettings.
The built-in camera UX already guides users in real time, prompting them to move closer, hold steady, or avoid glare. Most low-quality input is handled automatically, so you only need these settings when you want finer control over which frames the SDK accepts.
Reject low-quality frames
When a quality issue is detected on a frame, you can tell the SDK to skip that frame instead of processing it. Three boolean flags control this:
imageWithBlurRejected: whentrue, frames with detected blur are skipped, so only sharp frames are processed.imageWithGlareRejected: whentrue, frames with detected glare are skipped.imageWithPoorLightingRejected: whentrue, frames with inadequate lighting are skipped.
Rejecting low-quality frames improves the reliability of the extracted data because the SDK only reads from clean input. The trade-off is capture speed: in difficult conditions, such as poor lighting or a reflective document, fewer frames qualify, so scanning can take longer before a usable frame arrives.
- Web (TS)
- Android (Kotlin)
- iOS (Swift)
const settings: ScanningSettings = {
documentCaptureModule: {
imageWithBlurRejected: true,
imageWithGlareRejected: true,
imageWithPoorLightingRejected: true,
},
};
val settings = ScanningSettings(
documentCaptureModule = DocumentCaptureModuleSettings(
imageWithBlurRejected = true,
imageWithGlareRejected = true,
imageWithPoorLightingRejected = true,
),
)
let settings = ScanningSettings(
documentCaptureModule: DocumentCaptureModuleSettings(
imageWithBlurRejected: true,
imageWithGlareRejected: true,
imageWithPoorLightingRejected: true
)
)
Tune the sensitivity levels
Blur and glare detection have an adjustable sensitivity that determines how aggressively the SDK flags a frame as affected. Two fields control this:
blurSensitivityLevel- type: string
- one of
"off","low","mid","high" - a higher level means more aggressive blur detection
glareSensitivityLevel- type: string
- one of
"off","low","mid","high" - a higher level means more aggressive glare detection
Setting a level to "off" disables detection for that quality issue.
Raising the level catches more borderline frames, which pairs well with the rejection flags above for the strictest possible capture.
Lowering it is more permissive and can speed up capture when conditions are consistently good.
- Web (TS)
- Android (Kotlin)
- iOS (Swift)
const settings: ScanningSettings = {
documentCaptureModule: {
blurSensitivityLevel: "high",
imageWithBlurRejected: true,
glareSensitivityLevel: "high",
imageWithGlareRejected: true,
imageWithPoorLightingRejected: true,
},
};
val settings = ScanningSettings(
documentCaptureModule = DocumentCaptureModuleSettings(
blurSensitivityLevel = SensitivityLevel.High,
imageWithBlurRejected = true,
glareSensitivityLevel = SensitivityLevel.High,
imageWithGlareRejected = true,
imageWithPoorLightingRejected = true,
),
)
let settings = ScanningSettings(
documentCaptureModule: DocumentCaptureModuleSettings(
blurSensitivityLevel: .high,
imageWithBlurRejected: true,
glareSensitivityLevel: .high,
imageWithGlareRejected: true,
imageWithPoorLightingRejected: true
)
)
On web the sensitivity is a plain string.
On Android it is the SensitivityLevel enum (SensitivityLevel.Off, .Low, .Mid, .High), and on iOS it is the SensitivityLevel case (.off, .low, .mid, .high).