---
Source: https://docs.microblink.com/blinkid/v8000/image-quality
Title: Handle low-quality or blurry images
Description: How to reject and tune handling of blurry, glare-affected, and poorly lit frames in BlinkID v8000
---

# 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`.

:::note

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`: when `true`, frames with detected blur are skipped, so only sharp frames are processed.
- `imageWithGlareRejected`: when `true`, frames with detected glare are skipped.
- `imageWithPoorLightingRejected`: when `true`, 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.

<Tabs queryString="platform">

  <TabItem value="web" label="Web (TS)" default>

  ```typescript
  const settings: ScanningSettings = {
    documentCaptureModule: {
      imageWithBlurRejected: true,
      imageWithGlareRejected: true,
      imageWithPoorLightingRejected: true,
    },
  };
  ```

  </TabItem>
  <TabItem value="android" label="Android (Kotlin)">

  ```kotlin
  val settings = ScanningSettings(
      documentCaptureModule = DocumentCaptureModuleSettings(
          imageWithBlurRejected = true,
          imageWithGlareRejected = true,
          imageWithPoorLightingRejected = true,
      ),
  )
  ```

  </TabItem>
  <TabItem value="ios" label="iOS (Swift)">

  ```swift
  let settings = ScanningSettings(
      documentCaptureModule: DocumentCaptureModuleSettings(
          imageWithBlurRejected: true,
          imageWithGlareRejected: true,
          imageWithPoorLightingRejected: true
      )
  )
  ```

  </TabItem>
  <TabItem value="flutter" label="Flutter (Dart)">

  ```dart
  final settings = ScanningSettings(
      documentCaptureModule: DocumentCaptureModuleSettings(
          imageWithBlurRejected: true,
          imageWithGlareRejected: true,
          imageWithPoorLightingRejected: true,
      ),
  );
  ```

  </TabItem>
  <TabItem value="react-native" label="React Native (TS)">

  ```typescript
  const scanningSettings = {
    documentCaptureModule: {
      imageWithBlurRejected: true,
      imageWithGlareRejected: true,
      imageWithPoorLightingRejected: true,
    },
  };
  ```

  </TabItem>
</Tabs>

## 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.

<Tabs queryString="platform">

  <TabItem value="web" label="Web (TS)" default>

  ```typescript
  const settings: ScanningSettings = {
    documentCaptureModule: {
      blurSensitivityLevel: "high",
      imageWithBlurRejected: true,
      glareSensitivityLevel: "high",
      imageWithGlareRejected: true,
      imageWithPoorLightingRejected: true,
    },
  };
  ```

  </TabItem>
  <TabItem value="android" label="Android (Kotlin)">

  ```kotlin
  val settings = ScanningSettings(
      documentCaptureModule = DocumentCaptureModuleSettings(
          blurSensitivityLevel = SensitivityLevel.High,
          imageWithBlurRejected = true,
          glareSensitivityLevel = SensitivityLevel.High,
          imageWithGlareRejected = true,
          imageWithPoorLightingRejected = true,
      ),
  )
  ```

  </TabItem>
  <TabItem value="ios" label="iOS (Swift)">

  ```swift
  let settings = ScanningSettings(
      documentCaptureModule: DocumentCaptureModuleSettings(
          blurSensitivityLevel: .high,
          imageWithBlurRejected: true,
          glareSensitivityLevel: .high,
          imageWithGlareRejected: true,
          imageWithPoorLightingRejected: true
      )
  )
  ```

  </TabItem>
  <TabItem value="flutter" label="Flutter (Dart)">

  ```dart
  final settings = ScanningSettings(
      documentCaptureModule: DocumentCaptureModuleSettings(
          blurSensitivityLevel: SensitivityLevel.high,
          imageWithBlurRejected: true,
          glareSensitivityLevel: SensitivityLevel.high,
          imageWithGlareRejected: true,
          imageWithPoorLightingRejected: true,
      ),
  );
  ```

  </TabItem>
  <TabItem value="react-native" label="React Native (TS)">

  ```typescript
  const scanningSettings = {
    documentCaptureModule: {
      blurSensitivityLevel: 'high',
      imageWithBlurRejected: true,
      glareSensitivityLevel: 'high',
      imageWithGlareRejected: true,
      imageWithPoorLightingRejected: true,
    },
  };
  ```

  </TabItem>
</Tabs>

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`).

## Related articles

- [Scanning settings](./scanning-settings.md)
- [Settings validation](./settings-validation.md)


Last updated on Jul 24, 2026
