visionkit-rs 0.3.2

Safe Rust bindings for VisionKit.framework — image analysis, Live Text, and availability-aware area coverage on macOS
Documentation
use std::path::PathBuf;

use visionkit::prelude::*;

fn asset_path() -> PathBuf {
    PathBuf::from(env!("CARGO_MANIFEST_DIR"))
        .join("examples")
        .join("assets")
        .join("live_text.png")
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("== VisionKit.framework smoke ==");
    println!("ImageAnalyzer supported: {}", ImageAnalyzer::is_supported());
    println!(
        "document camera available on macOS: {}",
        VNDocumentCameraViewController::is_available_on_current_platform()?
    );
    println!(
        "data scanner available on macOS: {}",
        DataScannerViewController::is_available_on_current_platform()?
    );

    let languages = ImageAnalyzer::supported_text_recognition_languages()?;
    println!("supported OCR languages: {}", languages.len());
    println!(
        "sample OCR languages: {:?}",
        languages.iter().take(10).collect::<Vec<_>>()
    );

    if !ImageAnalyzer::is_supported() {
        println!("ImageAnalyzer is not supported on this Mac");
        return Ok(());
    }

    let analyzer = ImageAnalyzer::new()?;
    let configuration = ImageAnalyzerConfiguration::new(
        ImageAnalysisTypes::TEXT | ImageAnalysisTypes::MACHINE_READABLE_CODE,
    )
    .with_locales(["en-US"]);
    let asset_path = asset_path();
    let analysis =
        analyzer.analyze_image_at_path(&asset_path, ImageOrientation::Up, &configuration)?;

    println!(
        "has text results: {}",
        analysis.has_results(ImageAnalysisTypes::TEXT)?
    );
    let transcript = analysis.transcript()?;
    println!("transcript: {transcript:?}");

    let interaction = LiveTextInteraction::new()?;
    interaction.track_image_at_path(&asset_path)?;
    interaction.set_analysis(&analysis)?;
    println!(
        "overlay preferred types: {}",
        interaction.preferred_interaction_types()?.bits()
    );
    let overlay_text = interaction.text();
    println!("overlay text: {overlay_text:?}");
    Ok(())
}