---
Source: https://docs.microblink.com/blinkid/v7/image-return
Title: Extract document images
Description: How to retrieve document and camera frame images from a BlinkID scanning session
---

# Extract document images

{/* TODO the code samples below have not been tested */}



BlinkID can return images alongside extraction results.
This is useful when you need to pass the captured document images to a downstream service—such as the [BlinkID Verify API](/verify)—or store them for audit purposes.

## Types of images

BlinkID can return two distinct types of images:

- **Input images** (raw camera frames): the original, unprocessed frames captured by the camera, including the background around the document.
- **Document images** (cropped): perspective-corrected images tightly framed on the document itself.

If you are passing images to [Verify](/verify), use raw input images. 

## Enable image return

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

  Set `returnInputImages: true` in your scanning settings:

  ```typescript
  const settings: ScanningSettings = {
    returnInputImages: true,
  };
  ```

  To also receive cropped document or face images, configure `croppedImageSettings`:

  ```typescript
  const settings: ScanningSettings = {
    returnInputImages: true,
    croppedImageSettings: {
      returnDocumentImage: true,
      returnFaceImage: true,
    },
  };
  ```

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

  Set `returnInputImages = true` inside `ScanningSettings`:

  ```kotlin
  val sessionSettings = BlinkIdSessionSettings(
      scanningSettings = ScanningSettings(
          returnInputImages = true
      )
  )
  ```

  Pass `sessionSettings` when launching the scanning screen:

  ```kotlin
  BlinkIdCameraScanningScreen(
      blinkIdSdk = sdk,
      sessionSettings = sessionSettings,
      onScanningSuccess = { result -> /* handle result */ },
      onScanningCancelled = { /* handle cancellation */ }
  )
  ```

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

  Set `returnInputImages: true` inside `ScanningSettings`:

  ```swift
  let analyzer = try await BlinkIDAnalyzer(
      sdk: sdkInstance,
      blinkIdSessionSettings: BlinkIDSessionSettings(
          scanningSettings: ScanningSettings(
              returnInputImages: true
          )
      ),
      eventStream: BlinkIDEventStream()
  )
  ```

  </TabItem>
</Tabs>

## Access images on the result

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

  The result contains `inputImageFront`, `inputImageBack`, and `inputImageBarcode` fields with the raw `ImageData` frames.

  Encode to PNG before sending to an API:

  ```typescript
  const canvas = document.createElement("canvas");
  canvas.width = result.inputImageFront.width;
  canvas.height = result.inputImageFront.height;
  canvas.getContext("2d")!.putImageData(result.inputImageFront, 0, 0);
  const base64 = canvas.toDataURL("image/png").split(",")[1];
  ```

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

  Call `inputImage(scanningSide)` on the result to get the raw frame for each side:

  ```kotlin
  val frontBitmap = scanningResult.inputImage(ScanningSide.FIRST)?.bitmap
  val backBitmap = scanningResult.inputImage(ScanningSide.SECOND)?.bitmap

  fun encodeToPng(bitmap: Bitmap): String {
      val stream = ByteArrayOutputStream()
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)
      return Base64.encodeToString(stream.toByteArray(), Base64.DEFAULT)
  }
  ```

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

  Call `getInputImage(scanningSide:)` on the result to get the raw frame for each side:

  ```swift
  if let front = scanningResult.getInputImage(scanningSide: .first),
     let pngData = front.uiImage?.pngData() {
      let base64 = pngData.base64EncodedString()
      // pass base64 to your API
  }

  if let back = scanningResult.getInputImage(scanningSide: .second),
     let pngData = back.uiImage?.pngData() {
      let base64 = pngData.base64EncodedString()
  }
  ```

  </TabItem>
</Tabs>

## Use lossless compression

Do not use lossy compression (such as JPEG) on images you intend to pass to a verification backend.
Lossy compression degrades image quality in ways that can affect analysis.
Encode to **PNG** instead, as shown in the examples above.

## Do not post-process images

Pass the images as-is from the SDK result.
Do not crop, resize, rotate, or otherwise modify them after capture.
Post-processing can break assumptions that downstream services make about image integrity.


Last updated on May 18, 2026
