Plugin.Xamarin.OCR
1.0.0-preview1
See the version list below for details.
dotnet add package Plugin.Xamarin.OCR --version 1.0.0-preview1
NuGet\Install-Package Plugin.Xamarin.OCR -Version 1.0.0-preview1
<PackageReference Include="Plugin.Xamarin.OCR" Version="1.0.0-preview1" />
paket add Plugin.Xamarin.OCR --version 1.0.0-preview1
#r "nuget: Plugin.Xamarin.OCR, 1.0.0-preview1"
// Install Plugin.Xamarin.OCR as a Cake Addin #addin nuget:?package=Plugin.Xamarin.OCR&version=1.0.0-preview1&prerelease // Install Plugin.Xamarin.OCR as a Cake Tool #tool nuget:?package=Plugin.Xamarin.OCR&version=1.0.0-preview1&prerelease
Plugin.Xamarin.OCR | Plugin.Maui.OCR
Plugin.Xamarin.OCR
and Plugin.Maui.OCR
provides the ability to do simple text from image OCR using nothing but platform APIs.
Should you use this yet?
NO. This is a work in progress and is not ready for production use. It is not feature complete and is not yet stable.
What Works Matrix
Platform | iOS | Android | Windows | macOS |
---|---|---|---|---|
Xamarin | Yes | Yes | WIP | WIP |
MAUI | Yes | Yes | Yes | Yes |
Why
Why am I making this? I'm making this because I want to make it easier for developers to do OCR in their apps. I want to make it so that you can just use this plugin and not have to worry about the platform specifics.
To many times I've tried to do OCR and had to wrestle with external dependencies like Tesseract (with it's dependencies Leptonica, etc) and these types of native dependencies can be a real pain to work with.
Xamarin??
Well, I still have to maintain a Xamarin app that has used Tesseract and I'm tired of all the problems that come with it. I want to make it easier for myself and others to do OCR in their apps.
Install Plugin
Available on NuGet for MAUI and Xamarin.
Install with the dotnet CLI: dotnet add package Plugin.Maui.OCR
or dotnet add package Plugin.Xamarin.OCR
, or through the NuGet Package Manager in Visual Studio.
Supported Platforms
Platform | Minimum Version Supported |
---|---|
iOS | 11+ |
macOS | 10.15+ |
Android | 5.0 (API 21) |
Windows | 11 and 10 version 1809+ |
MAUI Setup and Usage
For MAUI, to initialize make sure you use the MauiAppBuilder extension AddOcr()
like so:
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
}).
AddOcr(); // <-- add this line
return builder.Build();
}
}
And then you can just inject IOcrService
into your classes and use it like so:
/// <summary>
/// Takes a photo and processes it using the OCR service.
/// </summary>
/// <param name="photo">The photo to process.</param>
/// <returns>The OCR result.</returns>
private async Task<OcrResult> ProcessPhoto(FileResult photo)
{
// Open a stream to the photo
using var sourceStream = await photo.OpenReadAsync();
// Create a byte array to hold the image data
var imageData = new byte[sourceStream.Length];
// Read the stream into the byte array
await sourceStream.ReadAsync(imageData);
// Process the image data using the OCR service
return await _ocr.RecognizeTextAsync(imageData);
}
Xamarin Setup and Usage
WIP
Details
The IOcrService
interface exposes the following methods:
public interface IOcrService
{
Task InitAsync(CancellationToken ct = default);
Task<OcrResult> RecognizeTextAsync(byte[] imageData, CancellationToken ct = default);
}
public class OcrResult
{
public bool Success { get; set; }
public string AllText { get; set; }
public IList<OcrElement> Elements { get; set; } = new List<OcrElement>();
public IList<string> Lines { get; set; } = new List<string>();
public class OcrElement
{
public string Text { get; set; }
public float Confidence { get; set; }
}
}
Permissions
Before you can start using Feature, you will need to request the proper permissions on each platform.
iOS
If you're handling camera, you'll need the usual permissions for that.
Android
If you're handling camera, you'll need the usual permissions for that. The only extra part you'll want in the AndroidManifest.xml is the following:
<application ..>
<meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="ocr" />
</application>
This will cause the model necessary to be installed when the application is installed.
Dependency Injection
You will first need to register the OCR
with the MauiAppBuilder
following the same pattern that the .NET MAUI Essentials libraries follow.
builder.Services.AddSingleton(OCR.Default);
You can then enable your classes to depend on IOcrService
as per the following example.
public class OcrViewModel
{
readonly IOcrService _ocr;
public OcrViewModel(IOcrService ocr)
{
_ocr = ocr;
}
public void DoSomeOcr()
{
byte[] imageData = GetImageData();
var result = await _ocr.RecognizeTextAsync(imageData);
}
}
Straight usage
Alternatively if you want to skip using the dependency injection approach you can use the Feature.Default
property.
public class OcrViewModel
{
public void DoSomeOcr()
{
byte[] imageData = GetImageData();
var result = await OcrPlugin.Default.RecognizeTextAsync(imageData);
}
}
Feature
Once you have the OCR
instance, you can interact with it in the following ways:
Events
Properties
Methods
InitAsync()
Initialize the feature. Might get removed, most platforms (if not all) don't currently require any addition initialization.
RecognizeTextAsync(byte[] imageData)
Recognize text from an image.
Acknowledgements
This project could not have came to be without these projects and people, thank you! ❤️
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
MonoAndroid | monoandroid was computed. monoandroid12.0 is compatible. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 is compatible. tizen60 was computed. |
Universal Windows Platform | uap10.0.19041 is compatible. |
Xamarin.iOS | xamarinios was computed. xamarinios10 is compatible. |
Xamarin.Mac | xamarinmac was computed. xamarinmac20 is compatible. |
Xamarin.TVOS | xamarintvos was computed. xamarintvos10 is compatible. |
Xamarin.WatchOS | xamarinwatchos was computed. xamarinwatchos10 is compatible. |
-
.NETFramework 4.8
- No dependencies.
-
.NETStandard 2.0
- No dependencies.
-
MonoAndroid 12.0
- Xamarin.AndroidX.Camera.Camera2 (>= 1.3.0)
- Xamarin.AndroidX.Camera.Lifecycle (>= 1.3.0)
- Xamarin.AndroidX.Camera.View (>= 1.3.0)
- Xamarin.Google.MLKit.BarcodeScanning (>= 117.2.0.3)
- Xamarin.Google.MLKit.TextRecognition (>= 116.0.0.4)
-
Tizen 4.0
- Tizen.NET (>= 8.0.0.15631)
-
UAP 10.0.19041
- No dependencies.
-
Xamarin.iOS 1.0
- No dependencies.
-
Xamarin.Mac 2.0
- No dependencies.
-
Xamarin.TVOS 1.0
- No dependencies.
-
Xamarin.WatchOS 1.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.0.12 | 113 | 7/17/2024 |
1.0.11 | 102 | 6/3/2024 |
1.0.10 | 99 | 5/30/2024 |
1.0.9 | 92 | 5/30/2024 |
1.0.8 | 92 | 5/27/2024 |
1.0.7 | 91 | 5/27/2024 |
1.0.0-preview4 | 134 | 4/4/2024 |
1.0.0-preview1 | 102 | 4/4/2024 |
0.0.0-alpha.0.64 | 51 | 5/26/2024 |