apple_vision_aesthetics 1.0.1 copy "apple_vision_aesthetics: ^1.0.1" to clipboard
apple_vision_aesthetics: ^1.0.1 copied to clipboard

PlatformiOS

Flutter plugin wrapping Apple Vision CalculateImageAestheticsScoresRequest for image quality scoring, blur detection, and utility image identification. iOS 18+ only.

apple_vision_aesthetics #

pub package pub points license: MIT platform: ios

A Flutter plugin wrapping Apple's Vision framework CalculateImageAestheticsScoresRequest to score image quality, detect blur, and identify utility images (screenshots, receipts, documents).

iOS 18.0+ only. Uses the modern Swift concurrency Vision API introduced at WWDC24.

Features #

  • Image quality scoring — get an overall aesthetic score from -1.0 (poor) to 1.0 (excellent)
  • Blur detection — blurry/out-of-focus images receive lower scores
  • Utility image detection — identifies screenshots, receipts, documents, QR codes
  • Batch analysis — efficiently score multiple images in one call
  • Bytes or file path — analyze from Uint8List or a file on disk

The scoring model considers blur, exposure, color balance, composition, and subject matter — powered entirely on-device by Apple's Neural Engine.

Requirements #

Requirement Minimum
iOS 18.0
Flutter 3.29.0
Dart 3.8.0
Xcode 16.0

Note: CalculateImageAestheticsScoresRequest does not work on the iOS Simulator. You must test on a physical device.

Installation #

Add it from pub.dev:

dependencies:
  apple_vision_aesthetics: ^1.0.0

Quick Start #

import 'package:apple_vision_aesthetics/apple_vision_aesthetics.dart';

final plugin = AppleVisionAestheticsPlatform.instance;

// Check device support
final supported = await plugin.isSupported();

// Analyze an image file
final result = await plugin.analyzeFile('/path/to/photo.jpg');

print(result.overallScore); // -1.0 to 1.0
print(result.isUtility);    // true for screenshots, receipts, etc.
print(result.isLowQuality()); // convenience: true if score < -0.25

API Reference #

ImageAestheticsResult #

Property Type Description
overallScore double Quality score from -1.0 (worst) to 1.0 (best)
isUtility bool true for screenshots, receipts, documents
isLowQuality({threshold}) bool Convenience method, default threshold: -0.25

AppleVisionAestheticsPlatform #

Method Description
analyzeFile(String path) Analyze image at file path
analyzeBytes(Uint8List bytes) Analyze raw image bytes
analyzeBatch(List<String> paths) Batch analyze multiple files
isSupported() Check if device supports the API

Score Interpretation #

Range Quality
< -0.5 Very poor (very blurry, badly exposed)
-0.5 .. 0.0 Below average
0.0 .. 0.5 Decent quality
> 0.5 High quality, memorable photo

Use with photo_manager #

A common pattern is to combine this plugin with photo_manager to scan the user's photo library:

import 'package:photo_manager/photo_manager.dart';
import 'package:apple_vision_aesthetics/apple_vision_aesthetics.dart';

Future<List<AssetEntity>> findBlurryPhotos() async {
  final plugin = AppleVisionAestheticsPlatform.instance;
  final albums = await PhotoManager.getAssetPathList(type: RequestType.image);
  final recent = await albums.first.getAssetListRange(start: 0, end: 100);

  final blurry = <AssetEntity>[];
  for (final asset in recent) {
    final file = await asset.file;
    if (file == null) continue;

    final result = await plugin.analyzeFile(file.path);
    if (result.isLowQuality()) {
      blurry.add(asset);
    }
  }
  return blurry;
}

Testing #

Unit tests (Dart side) #

flutter test

Integration tests (requires physical iOS 18+ device) #

The plugin ships with integration tests using images from the Kwentar/blur_dataset — 3 triplets of sharp, defocused-blur, and motion-blur photos taken with real cameras.

cd example
flutter test integration_test/plugin_integration_test.dart

The integration tests verify that:

  • Sharp images score higher than blurred ones
  • analyzeBytes and analyzeBatch return consistent results
  • Error handling works for invalid file paths

Test fixtures #

The test/fixtures/ directory contains 9 images (3 triplets) from the blur_dataset for local testing:

File pattern Type
*_S.* Sharp
*_F.* Defocused blur
*_M.* Motion blur

Mocking in your own tests #

class MockAesthetics extends AppleVisionAestheticsPlatform {
  @override
  Future<ImageAestheticsResult> analyzeFile(String path) async =>
    const ImageAestheticsResult(overallScore: 0.5, isUtility: false);

  // ... implement other methods
}

// In setUp:
AppleVisionAestheticsPlatform.instance = MockAesthetics();

Limitations #

  • iOS only — Apple Vision framework is not available on Android
  • Physical device required — the aesthetics model doesn't run on the Simulator
  • iOS 18.0+ — uses the new Swift Vision API from WWDC24
  • No macOS support yet — contributions welcome!

License #

MIT — see LICENSE for details.

0
likes
160
points
39
downloads

Publisher

verified publisheralejandrogarcia.io

Weekly Downloads

Flutter plugin wrapping Apple Vision CalculateImageAestheticsScoresRequest for image quality scoring, blur detection, and utility image identification. iOS 18+ only.

Repository (GitHub)
View/report issues

Topics

#image-quality #blur-detection #apple-vision #photo-analysis #computer-vision

Documentation

API reference

License

MIT (license)

Dependencies

flutter

More

Packages that depend on apple_vision_aesthetics

Packages that implement apple_vision_aesthetics