L_OcrPage_SetOverlayBitmap (original) (raw)
Summary
Sets the overlay bitmap of this L_OcrPage.
Syntax
#include "ltocr.h"
L_LTOCR_API L_INT EXT_FUNCTION L_OcrPage_SetOverlayBitmap(page, bitmapHandle)
Parameters
L_OcrPage page
Handle to the OCR page.
BITMAPHANDLE* bitmapHandle
BITMAPHANDLE to use to update the page overlay bitmap.
Returns
Value | Meaning |
---|---|
SUCCESS | The function was successful. |
< 1 | An error occurred. Refer to Return Codes. |
Comments
The overlay image of an L_OcrPage will be used when the image is saved by an L_OcrDocument in the following situations:
- If the page contains a graphics zone L_OcrZoneType_Graphics. The document will get the image to store in the document from the overlay image.
- If the output format supports the "Image over text" feature. Such as PDF with Image/Text option. The document will get the image to store in the document from the overlay image.
By default, the overlay image is the original image used to create the page. It is the same value obtained by calling L_OcrPage_GetBitmap with L_OcrPageBitmapType_Original option.
In some situation, the user might want to use a different bitmap as the overlay. For example, a smaller version is passed to the OCR engine to conserve memory while the original version will only be used on save purposes in a PDF with image/text option. You can call L_OcrPage_SetOverlayBitmap before saving the document (memory-based) or adding the page to the document (file-based) and the engine will use this new bitmap as the overlay value. If auto-preprocessing was performed on the page through L_OcrPage_AutoPreprocess, then the same values might need to be applied to the overlay as well. Use L_OcrPage_GetAutoPreprocessValues to get the accumulative values of any inversion, rotation or deskewing applied by the pre-processor.
To clear the temporarily overlay image, call L_OcrPage_SetOverlayBitmap with a NULL value.
To get the overlay image at any time, call L_OcrPage_GetOverlayBitmap. Note that this property will return the same image reference passed to the last L_OcrPage_SetOverlayBitmap call. It will not return the original image.
The overlay bitmap is not freed by this L_OcrPage.
Required DLLs and Libraries
- LTOCR
- For a listing of the exact DLLs and Libraries needed, based on the toolkit version, refer to Files To Be Included With Your Application.
See Also
Functions
- L_OcrPage_Destroy
- L_OcrPage_FromBitmap
- L_OcrPage_GetBitmap
- L_OcrPage_SetBitmap
- L_OcrPage_GetOverlayBitmap
- L_OcrPage_SetBitmapChangedCallback
- L_OcrPage_IsInverted
- L_OcrPage_GetRotateAngle
- L_OcrPage_GetDeskewAngle
- L_OcrPage_AutoPreprocess
- L_OcrPage_AutoZone
- L_OcrPage_GetZoneCount
- L_OcrPage_InsertZone
- L_OcrPage_AddZone
- L_OcrPage_IndexOfZone
- L_OcrPage_GetZoneAt
- L_OcrPage_SetZoneAt
- L_OcrPage_RemoveZone
- L_OcrPage_RemoveZoneAt
- L_OcrPage_ClearZones
- L_OcrPage_GetZoneCells
- L_OcrPage_SetZoneCells
- L_OcrPage_HitTestZone
- L_OcrPage_IsRecognized
- L_OcrPage_Recognize
- L_OcrPage_Unrecognize
- L_OcrPage_GetRecognizeStatistics
- L_OcrPage_GetRecognizedCharacters
- L_OcrPage_SetRecognizedCharacters
- L_OcrPage_FreePageCharacters
- L_OcrPage_GetZoneWords
- L_OcrPage_FreeWords
- L_OcrPage_GetText
- L_OcrPage_ExtractZoneMICRData
- L_OcrPage_DetectLanguages
- L_OcrPage_LoadZonesFile
- L_OcrPage_SaveZonesFile
- L_OcrPage_SaveXml
- L_OcrPage_GetAutoPreprocessValues
Topics
- Programming with LEADTOOLS OCR Module - LEAD Engine
- Starting and Shutting Down the OCR Engine
- Recognizing OCR Pages
- Working With OCR Pages
Example
L_INT L_OcrPage_SetOverlayBitmapExample()
{
BITMAPHANDLE bitmap = { 0 };
L_OcrEngine ocrEngine = NULL;
L_OcrPage ocrPage = NULL;
L_OcrDocumentManager ocrDocumentManager = NULL;
L_OcrDocument ocrDocument = NULL;
// Create an instance of the engine
L_INT retCode = L_OcrEngineManager_CreateEngine(L_OcrEngineType_LEAD, &ocrEngine);
if(retCode == SUCCESS)
{
// Start the engine using default parameters
retCode = L_OcrEngine_Startup(ocrEngine, NULL, OCR_LEAD_RUNTIME_DIR);
if(retCode != SUCCESS)
return retCode;
// Load a page to be recognized
retCode = L_LoadBitmap(MAKE_IMAGE_PATH(L_TEXT("Ocr1.tif")), &bitmap, sizeof(BITMAPHANDLE), 0, ORDER_RGB, NULL, NULL);
if(retCode != SUCCESS)
goto CLEANUP;
// Add an image to OCR page. don't transfer ownership of the bitmap to the page we will control this original image
retCode = L_OcrPage_FromBitmap(ocrEngine, &ocrPage, &bitmap, L_OcrBitmapSharingMode_None, NULL, NULL);
if(retCode != SUCCESS)
goto CLEANUP;
// Get OCR page default overlay bitmap and save it to disk
BITMAPHANDLE origOverlayBitmap = {0};
retCode = L_OcrPage_GetOverlayBitmap(ocrPage, &origOverlayBitmap, sizeof(BITMAPHANDLE));
if(retCode != SUCCESS)
goto CLEANUP;
// if the OCR page has overlay bitmap they save it before we change it
if(origOverlayBitmap.Flags.Allocated)
L_SaveBitmap(TEXT("OcrPageOrigOverlayBitmap.tif"), &origOverlayBitmap, FILE_CCITT_GROUP4, origOverlayBitmap.BitsPerPixel, 2, NULL);
// Apply some auto preprocessing on the image
L_OcrPage_AutoPreprocess(ocrPage, L_OcrAutoPreprocessPageCommands_All, NULL, NULL);
// resize down our original bitmap into half and set it as the OCR page overlay bitmap to conserve memory.
retCode = L_SizeBitmap(&bitmap, bitmap.Width / 2, bitmap.Height / 2, SIZE_RESAMPLE);
if(retCode != SUCCESS)
goto CLEANUP;
// Now you might want to apply the same auto preprocessing commands applied to the OCR page into the overlay bitmap
// before you set it, to do so, you need to call L_OcrPage_GetAutoPreprocessValues function first to determine what
// kind of preprocessing values were applied to the OCR page
L_OcrPageAutoPreprocessValues autoPreprocessValues = {0};
retCode = L_OcrPage_GetAutoPreprocessValues(ocrPage, &autoPreprocessValues);
if(retCode == SUCCESS)
{
if(autoPreprocessValues.IsInverted)
L_InvertBitmap(&bitmap, 0);
if(autoPreprocessValues.DeskewAngle > 0)
L_DeskewBitmap(&bitmap, NULL,RGB(0, 0, 0), DSKW_PROCESS | DSKW_RESAMPLE);
if(autoPreprocessValues.RotationAngle > 0)
L_RotateBitmap(&bitmap, autoPreprocessValues.RotationAngle, ROTATE_RESAMPLE, RGB(0, 0, 0));
}
// Now save our updated overlay bitmap to disk
L_SaveBitmap(TEXT("OcrPageUpdatedOverlayBitmap.tif"), &bitmap, FILE_CCITT_GROUP4, bitmap.BitsPerPixel, 2, NULL);
retCode = L_OcrPage_SetOverlayBitmap(ocrPage, &bitmap);
if(retCode != SUCCESS)
goto CLEANUP;
// Recognize the page
// Note: Recognize can be called without calling AutoZone or manually adding zones.
// The engine will check and automatically auto-zones the page.
retCode = L_OcrPage_Recognize(ocrPage, NULL, NULL);
if(retCode != SUCCESS)
goto CLEANUP;
//Get the document manager
retCode = L_OcrEngine_GetDocumentManager(ocrEngine, &ocrDocumentManager);
if(retCode != SUCCESS)
goto CLEANUP;
// Create file-based OCR document
retCode = L_OcrDocumentManager_CreateDocument(ocrDocumentManager, &ocrDocument, L_OcrCreateDocumentOptions_AutoDeleteFile, NULL);
if(retCode != SUCCESS)
goto CLEANUP;
// Add page to the document.
retCode = L_OcrDocument_AddPage(ocrDocument, ocrPage);
if(retCode != SUCCESS)
goto CLEANUP;
// Adding the page to a file based document will take a snap shot of the recognition data and store it in the document. At this
// point, the page is no longer needed. So destroy it to free up memory not used anymore
L_OcrPage_Destroy(ocrPage);
// Set the handle to NULL so we do not free it in our clean-up code
ocrPage = NULL;
// Save the document we have as PDF Image/Text
// Get the format options for PDF
DOCWRTPDFOPTIONS pdfOptions;
pdfOptions.Options.uStructSize = sizeof(DOCWRTPDFOPTIONS);
L_OcrDocumentManager_GetFormatOptions(ocrDocumentManager, DOCUMENTFORMAT_PDF, &pdfOptions.Options);
// Set the PDF ImageOverText option to TRUE
pdfOptions.bImageOverText = L_TRUE;
// Give the engine our updated PDF options
L_OcrDocumentManager_SetFormatOptions(ocrDocumentManager, DOCUMENTFORMAT_PDF, &pdfOptions.Options);
retCode = L_OcrDocument_Save(ocrDocument, MAKE_IMAGE_PATH(L_TEXT("Output.pdf")), DOCUMENTFORMAT_PDF, NULL, NULL);
// Now if you opened the saved PDF file you will see our resized image shown as the PDF image over text
// instead of the original OCR page bitmap.
}
CLEANUP:
if(bitmap.Flags.Allocated)
L_FreeBitmap(&bitmap);
if(ocrPage != NULL)
L_OcrPage_Destroy(ocrPage);
if(ocrDocument != NULL)
L_OcrDocument_Destroy(ocrDocument);
if(ocrEngine != NULL)
L_OcrEngine_Destroy(ocrEngine);
return retCode;
}