Jak używać obrazów rysunków systemówych do przetwarzania OCR w języku C#

Jak odczytywać obiekty System.Drawing w języku C

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronOCR umożliwia odczytywanie tekstu z obiektów System.Drawing, takich jak Bitmap i Image, poprzez otoczenie ich tagiem OcrImageInput, zapewniając płynną funkcjonalność OCR dla aplikacji .NET na platformach Windows, macOS i Linux.

System.Drawing.Bitmap to klasa w .NET Framework służąca do pracy z obrazami bitmapowymi. Zapewnia metody i właściwości do tworzenia, manipulowania i wyświetlania obrazów bitmapowych.

System.Drawing.Image jest klasą bazową dla wszystkich obiektów graficznych GDI+ w .NET Framework. Jest to klasa nadrzędna dla różnych typów obrazów, w tym System.Drawing.Bitmap.

IronSoftware.Drawing.AnyBitmap to klasa bitmapowa w IronDrawing, bibliotece open source pierwotnie opracowanej przez Iron Software. Pomaga inżynierom oprogramowania C# zastąpić System.Drawing.Common w projektach .NET na platformach Windows, macOS i Linux.

Szybki start: Odczyt tekstu z System.Drawing.Bitmap

Za pomocą pojedynczego polecenia utwórz IronTesseract i podaj mu System.Drawing.Bitmap otoczone tagiem OcrImageInput, aby wyodrębnić cały tekst. Ten przykład szybkiego startu pokazuje, jak IronOCR konwertuje obrazy na czytelny tekst przy minimalnej konfiguracji.

  1. Install IronOCR with NuGet Package Manager

    PM > Install-Package IronOcr
  2. Skopiuj i uruchom ten fragment kodu.

    var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(new System.Drawing.Bitmap("image.png")));
  3. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronOCR w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer


Jak odczytać dane z System.Drawing.Bitmap?

Najpierw należy utworzyć instancję klasy w celu wykonania OCR. Utwórz przy użyciu jednej z różnych metod. W przykładowym kodzie użyto ścieżki do pliku.

Następnie użyj instrukcji , aby utworzyć obiekt, przekazując do niego obraz z obiektu . Na koniec użyj metody do wykonania OCR.

:path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-bitmap.cs
using IronOcr;
using System.Drawing;

// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();

// Read image file to Bitmap
Bitmap bitmap = new Bitmap("Potter.tiff");

// Import System.Drawing.Bitmap
using var imageInput = new OcrImageInput(bitmap);
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);
Imports IronOcr
Imports System.Drawing

' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()

' Read image file to Bitmap
Private bitmap As New Bitmap("Potter.tiff")

' Import System.Drawing.Bitmap
Private imageInput = New OcrImageInput(bitmap)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
$vbLabelText   $csharpLabel

Dłączego instrukcja using ma znaczenie dla OcrImageInput?

Instrukcja using ma kluczowe znaczenie podczas pracy z OcrImageInput, ponieważ zapewnia prawidłowe zarządzanie zasobami i czyszczenie pamięci. OcrImageInput implementuje IDisposable, co oznacza, że przechowuje zasoby niezarządzane, które należy zwolnić po zakończeniu pracy z obiektem. Bez instrukcji using zasoby te mogą nie zostać zwolnione w odpowiednim czasie, co może potencjalnie prowadzić do wycieków pamięci lub blokad plików. Jest to szczególnie ważne podczas przetwarzania wielu obrazów w operacjach wsadowych. Więcej szczegółów na temat prawidłowego zarządzania zasobami w IronOCR można znaleźć w naszej Dokumentacji API.

Jakie są popularne metody ładowania plików bitmapowych?

Bitmap udostępnia kilka metod ładowania poza konstruktorem ścieżki pliku używanym w naszym przykładzie. Można tworzyć Bitmap ze strumieni (StreamReader), z istniejących Image (Image), a nawet tworzyć puste mapy bitowe o określonych wymiarach (Bitmap). Podczas pracy z aplikacjami internetowymi ładowanie ze strumieni jest szczególnie przydatne do przetwarzania przesłanych plików. W przypadku zasobów osadzonych można użyć Resources. IronOCR płynnie obsługuje wszystkie te źródła source za pośrednictwem konstruktora Bitmap. Dowiedz się więcej o różnych metodach wprowadzania danych w naszym przewodniku po formatach obrazów (jpg, png, gif, tiff, bmp).

Kiedy należy zwolnić obiekt Bitmap?

Czas usuwania obrazów bitmapowych zależy od przebiegu pracy aplikacji. Jeśli potrzebujesz bitmap tylko do OCR, usuń go natychmiast po utworzeniu ocrResult. Jednak jeśli musisz wykonać wiele operacji lub wyświetlić obraz, utrzymuj go, dopóki wszystkie operacje nie zostaną zakończone. Zawsze używaj instrukcji using lub bloków try-finally, aby zapewnić prawidłowe usuwanie. Należy pamiętać, że OcrImageInput tworzy własną kopię wewnętrzną, więc oryginalny bitmap może zostać usunięty po utworzeniu OcrImageInput. W przypadku skomplikówanych scenariuszy obejmujących wiele operacji na obrazach, zapoznaj się z naszymi przykładami Filtry optymalizacji obrazu OCR.

Jak czytać z System.Drawing.Image?

Odczytanie z Image jest tak proste, jak utworzenie obiektu OcrInput za pomocą Image, a następnie wykonanie standardowego procesu OCR przy użyciu metody Read.

:path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-image.cs
using IronOcr;
using Image = System.Drawing.Image;

// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();

// Open image file as Image
Image image = Image.FromFile("Potter.tiff");

// Import System.Drawing.Image
using var imageInput = new OcrImageInput(image);
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);
Imports IronOcr
Imports Image = System.Drawing.Image

' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()

' Open image file as Image
Private image As Image = Image.FromFile("Potter.tiff")

' Import System.Drawing.Image
Private imageInput = New OcrImageInput(image)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
$vbLabelText   $csharpLabel

Jaka jest różnica między Image a Bitmap dla OCR?

Podczas gdy Bitmap jest konkretną implementacją dla obrazów bitmapowych, Image jest abstrakcyjną klasą bazową, która może reprezentować różne formaty obrazów, w tym JPEG, PNG, GIF i TIFF. Do celów OCR IronOCR traktuje oba identycznie poprzez OcrInput, ale Image zapewnia większą elastyczność podczas pracy z różnymi formatami. Bitmap oferuje możliwości manipulacji na poziomie pikseli, podczas gdy Image lepiej nadaje się do ogólnej obróbki obrazów. Oba dobrze współpracują z zaawansowanym silnikiem Tesseract 5 IronOCR. Wybór zależy od szerszych potrzeb aplikacji, a nie od wydajności OCR.

Dłączego używać Image.FromFile zamiast innych metod ładowania?

Image.FromFile to najprostsza i najbardziej bezpośrednia metoda ładowania obrazów z dysku. Automatycznie wykrywa format obrazu i obsługuje proces czytania pliku. Metody alternatywne, takie jak MemoryStream, są lepsze w przypadku aplikacji internetowych lub podczas pracy ze strumieniami pamięci. FileStream blokuje plik do momentu zwolnienia FileStream, co może mieć znaczenie w aplikacjach wielowątkowych. W scenariuszach produkcji wymagających wysokiej wydajności lub jednoczesnego dostępu, rozważ ładowanie obrazów do potoków pamięci najpierw. Nasz przykład Wielowątkowe Tesseract OCR pokazuje najlepsze praktyki jednoczesnego przetwarzania obrazów.

Jak czytać z IronSoftware.Drawing.AnyBitmap?

Podobnie, po utworzeniu lub uzyskaniu obiektu AnyBitmap można skonstruować klasę OcrInput. Konstruktor obsłuży wszystkie niezbędne kroki importu danych. Poniższy przykład kodu demonstruje to.

:path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-anybitmap.cs
using IronOcr;
using IronSoftware.Drawing;

// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();

// Open image file as AnyBitmap
AnyBitmap anyBitmap = AnyBitmap.FromFile("Potter.tiff");

// Import IronSoftware.Drawing.AnyBitmap
using var imageInput = new OcrImageInput(anyBitmap);
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);
Imports IronOcr
Imports IronSoftware.Drawing

' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()

' Open image file as AnyBitmap
Private anyBitmap As AnyBitmap = AnyBitmap.FromFile("Potter.tiff")

' Import IronSoftware.Drawing.AnyBitmap
Private imageInput = New OcrImageInput(anyBitmap)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
$vbLabelText   $csharpLabel

Dłączego wybrać AnyBitmap zamiast klas System.Drawing?

AnyBitmap oferuje lepszą kompatybilność międzyplatformową w porównaniu z klasami Bitmap. Podczas gdy Bitmap ma ograniczoną obsługę na platformach innych niż Windows w .NET 6+, AnyBitmap działa płynnie w systemach Windows, Linux i macOS. Zapewnia spójne API bez zależności specyficznych dla platformy, co czyni go idealnym dla wdrożeń w chmurze i aplikacji konteneryzowanych. AnyBitmap oferuje również lepsze zarządzanie pamięcią i optymalizacje wydajności zaprojektowane specjalnie z myślą o zadaniach związanych z przetwarzaniem obrazów. Szczegółowe informacje o zgodności znajdziesz w naszej dokumentacji Zgodność.

Na jakich platformach działa AnyBitmap?

AnyBitmap obsługuje wszystkie główne platformy, na których działa .NET: Windows (x86, x64, ARM), Linux (w tym Alpine Linux dla Docker) oraz macOS (zarówno Intel, jak i Apple Silicon). To szerokie wsparcie platform czyni go zalecaną opcją dla nowoczesnych aplikacji .NET, które muszą działać w zróżnicowanych środowiskach. Jest szczególnie wartościowy dla wdrożeń w chmurze na AWS Lambda lub Azure Functions. Dowiedz się więcej o konfiguracji specyficznej dla platform w naszych przewodnikach dla Linux, macOS i Docker.

Jak AnyBitmap zarządza pamięcią?

AnyBitmap zapewnia wydajne zarządzanie pamięcią dzięki integracji automatycznego zbierania śmieci oraz wyraźnym wzorcom usuwania obiektów. Wykorzystuje puli pamięci dla często alokowanych bufory i implementuje semantykę kopiowania przy zapisie dla lepszej wydajności. W przeciwieństwie do AnyBitmap, które może blokować pliki, AnyBitmap w pełni ładuje obrazy do pamięci, zapobiegając problemom z dostępem do plików. Zapewnia również lepszą kontrolę nad zużyciem pamięci w scenariuszach o dużym przepływie danych. W przypadku aplikacji przetwarzających duże ilości obrazów wydajność pamięci AnyBitmap może znacznie zmniejszyć ogólne zużycie pamięci. Zapoznaj się z naszym przewodnikiem Alternatywy dla System.Drawing.Common i porady dotyczące migracji.

Jak można określić obszar skanowania?

Podczas tworzenia klasy OcrInput można określić obszar do skanowania. Pozwala to zdefiniować konkretny obszar dokumentu obrazu do OCR. W zależności od dokumentu obrazu, określenie obszaru skanowania może znacznie poprawić wydajność. W podanym przykładzie kodu wyciągany jest tylko numer i tytuł rozdziału.

:path=/static-assets/ocr/content-code-examples/how-to/input-images-read-specific-region.cs
using IronOcr;
using IronSoftware.Drawing;
using System;

// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();

// Specify crop region
Rectangle scanRegion = new Rectangle(800, 200, 900, 400);

// Add image
using var imageInput = new OcrImageInput("Potter.tiff", ContentArea: scanRegion);
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);

// Output the result to console
Console.WriteLine(ocrResult.Text);
Imports IronOcr
Imports IronSoftware.Drawing
Imports System

' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()

' Specify crop region
Private scanRegion As New Rectangle(800, 200, 900, 400)

' Add image
Private imageInput = New OcrImageInput("Potter.tiff", ContentArea:= scanRegion)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)

' Output the result to console
Console.WriteLine(ocrResult.Text)
$vbLabelText   $csharpLabel

Kiedy używać skanowania obszaru dla lepszej wydajności?

Skanowanie obszaru dramatycznie poprawia wydajność, gdy potrzebujesz tylko tekstu z określonych obszarów spójnych układów dokumentów. Częste przypadki użycia obejmują wyodrębnianie nagłówków, pól formularzy, sum faktur lub informacji o karcie identyfikacyjnej. Zyski z wydajności są największe przy dużych obrazach, gdzie tekst zajmuje tylko niewielką część. Dla faktury o wymiarach 3000x4000 pikseli, skanowanie tylko obszaru sumy może być 10-20 razy szybsze niż OCR całej strony. Skanowanie obszaru również poprawia dokładność, eliminując potencjalne zakłócenia z innych obszarów. Więcej przykładów opartych na obszarze znajdziesz w naszym przewodniku Obszary treści i obcinanie regionów w PDF.

Jak określić prawidłowe współrzędne dla mojego regionu?

Określenie współrzędnych wymaga zrozumienia, że Rectangle używa formatu (X, Y, Szerokość, Wysokość), gdzie (0,0) to lewy górny róg. Zacznij od otwarcia obrazu w edytorze graficznym, który wyświetla współrzędne kursora. Alternatywnie, użyj funkcji debugowania IronOCR, aby zwizualizować wykryte obszary tekstowe. W przypadku układów dynamicznych warto rozważyć użycie IronOCR do wykonania najpierw pełnego skanowania, a następnie przeanalizować OcrResult, aby programowo znaleźć pozycje tekstu. Nasz przykład Podświetlenie tekstów dla debugowania pokazuje, jak zwizualizować obszary OCR dla dokładnego określenia współrzędnych.

Co się stanie, jeśli region przekroczy granice obrazu?

Gdy wskazany region przekroczy granice obrazu, IronOCR automatycznie go przycina do prawidłowego obszaru obrazu. Na przykład, jeśli Twój obraz ma wymiary 1000x1000 pikseli, a Ty określisz prostokąt w (900, 900, 200, 200), IronOCR przetworzy tylko obszar od (900, 900) do (1000, 1000). To automatyczne przycinanie zapobiega błędom, ale może skutkować niekompletnym wyodrębnianiem tekstu, jeśli współrzędne są nieprawidłowe. Zawsze weryfikuj swoje regiony względem rzeczywistych wymiarów obrazu. Dla dynamicznych rozmiarów obrazów, oblicz regiony jako procenty zamiast stałych pikseli. Przewodnik Region OCR obrazu zawiera więcej przykładów bezpiecznego obchodzenia się z regionami.

Wynik OCR

Demo ekstrakcji OCR pokazujące tekst rozdziału Harry'ego Pottera w Podglądzie zdjęć i wyodrębnioną zawartość na konsoli debugowania

using OcrImageInput OcrImageInput IDisposable using System.Drawing.Bitmap Bitmaps new Bitmap(stream) Images new Bitmap(image) new Bitmap(width, height) Assembly.GetManifestResourceStream() Bitmap OcrImageInput Bitmap OcrImageInput using OcrImageInput Bitmap OcrImageInput System.Drawing.Image OcrImageInput Image Read System.Drawing.Bitmap System.Drawing.Image OcrImageInput Image Bitmap Image Image.FromFile Image.FromStream Image.FromFile Image AnyBitmap OcrImageInput AnyBitmap System.Drawing System.Drawing.Common AnyBitmap AnyBitmap AnyBitmap AnyBitmap System.Drawing.Bitmap AnyBitmap AnyBitmap OcrImageInput Rectangle OcrResult

Często Zadawane Pytania

Jak wyodrębnić tekst z System.Drawing.Bitmap używając OCR w C#?

IronOCR ułatwia wyodrębnianie tekstu z obiektów System.Drawing.Bitmap. Najpierw utwórz obiekt klasy IronTesseract, następnie opakuj swój obiekt Bitmap w OcrImageInput używając instrukcji using, a na końcu wywołaj metodę Read. Minimalny kod to: var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(bitmap));

Dlaczego instrukcja using jest ważna przy pracy z OcrImageInput?

Instrukcja using jest kluczowa, ponieważ OcrImageInput implementuje IDisposable i posiada niezarządzane zasoby, które wymagają właściwego czyszczenia. Bez tego, ryzykujesz wyciekiem pamięci lub blokadą plików, szczególnie podczas przetwarzania wielu obrazów. OcrImageInput w IronOCR wymaga właściwej likwidacji, aby zapewnić efektywne zarządzanie zasobami w aplikacjach .NET.

Czy mogę wykonać OCR na obiektach System.Drawing.Image?

Tak, IronOCR obsługuje OCR na obiektach System.Drawing.Image, ponieważ Image to klasa bazowa dla Bitmap. Po prostu opakuj swój obiekt Image w OcrImageInput tak samo, jak zrobiłbyś to z Bitmap, a IronOCR wyodrębni tekst płynnie na platformach Windows, macOS i Linux.

Czym jest IronSoftware.Drawing.AnyBitmap i jak odnosi się do OCR?

IronSoftware.Drawing.AnyBitmap to klasa bitmapy z IronDrawing, otwartej biblioteki, która pomaga zastąpić System.Drawing.Common w projektach .NET. Zapewnia zgodność międzyplatformową dla Windows, macOS i Linux, co czyni ją idealną do użycia z IronOCR, kiedy potrzebujesz jednolitego przetwarzania obrazów na różnych systemach operacyjnych.

Czy mogę określić konkretny obszar obrazu do wyodrębniania tekstu?

Tak, IronOCR pozwala określić konkretne obszary odczytu poprzez określenie regionów kadrowania. Ta funkcja umożliwia skupienie procesowania OCR na określonych sekcjach twoich obiektów System.Drawing, poprawiając wydajność i dokładność, gdy potrzebujesz tekstu tylko z niektórych części obrazu.

Czy IronOCR obsługuje wiele języków?

IronOCR obsługuje wiele języków, co czyni go wszechstronnym narzędziem dla globalnych aplikacji wymagających rozpoznawania tekstu w różnych językach.

Czy IronOCR można zintegrować z istniejącymi aplikacjami?

IronOCR jest zaprojektowany do łatwej integracji z istniejącymi aplikacjami używając C#, co pozwala programistom dodać funkcjonalność OCR do swojego oprogramowania z minimalnym wysiłkiem.

Jakie są korzyści z używania IronOCR do zarządzania dokumentami?

Używanie IronOCR do zarządzania dokumentami upraszcza przepływ pracy przez konwertowanie zeskanowanych dokumentów na przeszukiwalny i edytowalny tekst, redukując konieczność ręcznego wprowadzania danych i poprawiając dostępność dokumentów.

Jak IronOCR może poprawić dokładność danych?

IronOCR poprawia dokładność danych dzięki swoim zaawansowanym algorytmom rozpoznawania i funkcjom korekcji obrazów, zapewniając, że proces ekstrakcji tekstu jest zarówno niezawodny, jak i precyzyjny.

Czy dostępna jest bezpłatna wersja próbna IronOCR?

Tak, Iron Software oferuje bezpłatną wersję próbną IronOCR, umożliwiając użytkownikom przetestowanie jego funkcji i możliwości przed podjęciem decyzji o zakupie.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Sprawdzone przez
Jeff Fritz
Jeffrey T. Fritz
Główny Menedżer Programu - Zespół .NET Community
Jeff jest również Głównym Menedżerem Programu dla zespołów .NET i Visual Studio. Jest producentem wykonawczym wirtualnej serii konferencji .NET Conf i prowadzi 'Fritz and Friends', transmisję na żywo dla deweloperów emitowaną dwa razy w tygodniu, gdzie rozmawia o technologii i pisze kod razem z widzami. Jeff pisze warsztaty, prezentacje i planuje treści dla największych wydarzeń Microsoft dla deweloperów, w tym Microsoft Build, Microsoft Ignite, .NET Conf i Microsoft MVP Summit.
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 5,896,332 | Wersja: 2026.5 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronOcr
uruchom próbkę obserwuj, jak twój obraz staje się tekstem z możliwością wyszukiwania.