Jak odczytywać obiekty System.Drawing w języku C
IronOCR umożliwia odczytywanie tekstu z obiektów System.Drawing, takich jak Bitmap i Image, poprzez ich owijanie w OcrImageInput, zapewniając bezproblemową funkcję OCR dla aplikacji .NET na platformach Windows, macOS i Linux.
System.Drawing.Bitmap to klasa w .NET Framework używana do pracy z obrazami bitmapowymi. Zapewnia metody i właściwości do tworzenia, manipulowania i wyświetlania obrazów bitmapowych.
System.Drawing.Image to klasa bazowa dla wszystkich obiektów obrazów 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 bitmapy w IronDrawing, bibliotece open-source pierwotnie stworzonej 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ą jednego polecenia utwórz IronTesseract i przekaż do niego System.Drawing.Bitmap owinięte przez OcrImageInput, aby wyodrębnić cały tekst. Ten przykład szybkiego startu pokazuje, jak IronOCR konwertuje obrazy na czytelny tekst przy minimalnej konfiguracji.
-
Install IronOCR with NuGet Package Manager
PM > Install-Package IronOcr -
Skopiuj i uruchom ten fragment kodu.
var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(new System.Drawing.Bitmap("image.png"))); -
Wdrożenie do testowania w środowisku produkcyjnym
Rozpocznij używanie IronOCR w swoim projekcie już dziś z darmową wersją próbną
Jak odczytywać obiekty System.Drawing w języku C#
- Pobierz bibliotekę C# do odczytu obiektów System.Drawing
- Obtain System.Drawing objects such as `Bitmap` and `Image`
- Construct the `OcrImageInput` class using the acquired data
- Utilize `AnyBitmap` from Iron Software for Linux and macOS
- Określ obszar czytania, wskazując region przycięcia
Jak odczytać dane z System.Drawing.Bitmap?
Najpierw utwórz instancję klasy IronTesseract, aby wykonać OCR. Utwórz System.Drawing.Bitmap z jednej z różnych metod. W przykładowym kodzie użyto ścieżki do pliku.
Następnie użyj instrukcji using, aby utworzyć obiekt OcrImageInput, przekazując do niego obraz z obiektu System.Drawing.Bitmap. Na koniec użyj metody Read, aby wykonać 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)
Dlaczego instrukcja using ma znaczenie dla OcrImageInput?
Instrukcja using jest kluczowa przy pracy z OcrImageInput, ponieważ zapewnia odpowiednie zarządzanie zasobami i czyszczenie pamięci. OcrImageInput implementuje IDisposable, co oznacza, że zawiera zasoby niesterowane, które muszą zostać zwolnione po zakończeniu pracy z obiektem. Bez instrukcji using te zasoby mogą nie zostać zwolnione natychmiast, co 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?
System.Drawing.Bitmap oferuje kilka metod ładowania poza konstruktorem ścieżki pliku użytym w naszym przykładzie. Można utworzyć Bitmaps z potoków (new Bitmap(stream)), z istniejących Images (new Bitmap(image)) lub nawet tworzyć puste bitmapy o określonych wymiarach (new Bitmap(width, height)). Podczas pracy z aplikacjami internetowymi ładowanie ze strumieni jest szczególnie przydatne do przetwarzania przesłanych plików. Dla zasobów osadzonych można użyć Assembly.GetManifestResourceStream(). IronOCR obsługuje wszystkie te źródła Bitmap płynnie poprzez konstruktor OcrImageInput. 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 tylko Bitmap dla OCR, usuń go natychmiast po utworzeniu OcrImageInput. 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ć usunięcie. Pamiętaj, że OcrImageInput tworzy własną wewnętrzną kopię, więc oryginalny Bitmap można usunąć po utworzeniu OcrImageInput. W przypadku skomplikowanych scenariuszy obejmujących wiele operacji na obrazach, zapoznaj się z naszymi przykładami Filtry optymalizacji obrazu OCR.
Jak czytać z System.Drawing.Image?
Czytanie z System.Drawing.Image jest tak proste, jak utworzenie obiektu OcrImageInput przy użyciu Image, a następnie wykonanie standardowego procesu OCR za pomocą 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)
Jaka jest różnica między Image a Bitmap dla OCR?
Podczas gdy System.Drawing.Bitmap to szczegółowa implementacja dla obrazów bitmapowych, System.Drawing.Image jest klasą bazową, która może reprezentować różne formaty obrazów, w tym JPEG, PNG, GIF i TIFF. Dla celów OCR, IronOCR traktuje oba identycznie poprzez OcrImageInput, ale Image zapewnia większą elastyczność przy pracy z różnymi formatami. Bitmap oferuje możliwości manipulacji na poziomie pikseli, podczas gdy Image jest lepsze do ogólnej obsługi 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.
Dlaczego używać Image.FromFile zamiast innych metod ładowania?
Image.FromFile jest najprostszą i najbardziej bezpośrednią metodą ładowania obrazów z dysku. Automatycznie wykrywa format obrazu i obsługuje proces czytania pliku. Alternatywne metody, takie jak Image.FromStream, są lepsze dla aplikacji webowych lub przy pracy z potokami pamięci. Image.FromFile blokuje plik, dopóki Image nie zostanie usunięty, co może być istotne 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ę OcrImageInput. 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)
Dlaczego wybrać AnyBitmap zamiast klas System.Drawing?
AnyBitmap oferuje lepszą zgodność międzyplatformową w porównaniu do klas System.Drawing. Podczas gdy System.Drawing.Common ma ograniczone wsparcie na platformach innych niż Windows w .NET 6+, AnyBitmap działa bezproblemowo na 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 dla zadań przetwarzania obrazów. Szczegółowe informacje o zgodności znajdziesz w naszej dokumentacji Zgodność.
Na jakich platformach działa AnyBitmap?
AnyBitmap wspiera wszystkie główne platformy, na których działa .NET: Windows (x86, x64, ARM), Linux (w tym Alpine Linux dla Docker), i 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 implementuje efektywne zarządzanie pamięcią poprzez integrację automatycznego kolekcjonowania śmieci i wzorce jawnego usuwania. Wykorzystuje puli pamięci dla często alokowanych bufory i implementuje semantykę kopiowania przy zapisie dla lepszej wydajności. W przeciwieństwie do System.Drawing.Bitmap, który może utrzymywać blokady plików, AnyBitmap ładuje obrazy w pełni 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. Dla aplikacji przetwarzających duże ilości obrazów, efektywność pamięciowa AnyBitmap może znacznie zmniejszyć całkowity ślad 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 OcrImageInput można określić obszar do zeskanowania. 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)
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, Width, Height), 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. Dla dynamicznych układów, rozważ użycie IronOCR, aby najpierw wykonać pełne skanowanie, a następnie przeanalizować OcrResult, aby znaleźć pozycje tekstu programowo. 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
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.

