L_LineRemoveBitmap返回空的HRGN

时间:2019-01-08 23:29:45

标签: c++ leadtools-sdk

我正在尝试使用Leadtools版本20自动清除某些图像(黑色边框去除,线条去除,去歪斜等)。 由于某些API仅适用于黑白图像,因此我在内存中创建了该图像的副本,并使用L_ColorResBitmap将其变为黑白。我的计划是使用此黑白图像进行处理,然后手动处理彩色图像。例如,我使用L_BorderRemoveBitmap找出需要擦除的区域,然后擦除彩色图像上的同一区域,或者使用L_DeskewBitmap找出需要黑白图像的角度转动,然后使用L_RotateBitmap转动彩色图像。但是,当我使用L_LineRemoveBitmap时,它将返回一个空白区域。我什至尝试使用回调函数,但是在回调函数区域内部始终为NULL。
我确保正在加载的图像中有一条垂直线,如果我保存了黑白版本,则该行被删除,但是正确的区域没有被交还。
这是我正在做的一小段:

FILEINFO fi;
L_INT PageCount;
L_INT i;
L_UINT uFlags;
BITMAPHANDLE tBmp;
BITMAPHANDLE bwBmp;
BORDERREMOVE br = {sizeof(BORDERREMOVE), BORDER_SINGLE_REGION, BORDER_ALL, 25, 4, 10, NULL, nullptr, sizeof(BITMAPHANDLE)};
RECT r;
LINEREMOVE lr = {sizeof(LINEREMOVE), LINE_SINGLE_REGION, 400, 12, 15, 10, 2, 0, LINEREMOVE_VERTICAL, NULL, nullptr, sizeof(BITMAPHANDLE)};

memset(&fi, 0, sizeof(FILEINFO));
fi.uStructSize = sizeof(FILEINFO);
plo->PageNumber = 0; // plo is a LOADFILEOPTION*
L_FileInfo(FileName, &fi, sizeof(FILEINFO), FILEINFO_TOTALPAGES, plo); // ok
PageCount = fi.TotalPages;
for(i = 0; i < PageCount; i++)
{
    memset(&fi, 0, sizeof(FILEINFO));
    fi.uStructSize = sizeof(FILEINFO);
    plo->PageNumber = i + 1;
    memset(&tBmp, 0, sizeof(BITMAPHANDLE));
    FileInfo(FileName, &fi, sizeof(FILEINFO), 0, plo); // OK
    if(tBmp.Flags.Allocated)
        L_FreeBitmap(&tBmp);
    L_LoadBitmap(FileName, &tBmp, sizeof(BITMAPHANDLE), fi.BitsPerPixel > 24 ? 24 : fi.BitsPerPixel, ORDER_RGBORGRAY, plo, &fi); // OK
    if(tBmp.Flags.Allocated)
    {
        if (TOP_LEFT != tBmp.ViewPerspective)
            L_ChangeBitmapViewPerspective(NULL, &tBmp, sizeof(BITMAPHANDLE), TOP_LEFT);
        uFlags = DSKW_PROCESS | DSKW_FILL | DSKW_DOCUMENTANDPICTURE | DSKW_BICUBIC | DSKW_NORMALSPEEDROTATE;
        if(1 != fi.BitsPerPixel)
            uFlags |= (DSKW_DONT_PERFORM_PREPROCESSING | DSKW_NORMAL_DETECTION);
        memset(&BitmapRegion, 0, sizeof(BITMAPHANDLE));
        BitmapRegion.uStructSize = sizeof(BITMAPHANDLE);
        if(bwBmp.Flags.Allocated)
            L_FreeBitmap(&bwBmp);
        memset(&bwBmp, 0, sizeof(BITMAPHANDLE));
        bwBmp.uStructSize = sizeof(BITMAPHANDLE);
        L_CopyBitmap(&bwBmp, &tBmp, bwBmp.uStructSize); // OK
        if(1 != tBmp.BitsPerPixel)
            L_ColorResBitmap(&bwBmp, &bwBmp, sizeof(BITMAPHANDLE), 1, CRF_FIXEDPALETTE, NULL, NULL, 0, NULL, NULL); // OK
        L_BorderRemoveBitmap(&bwBmp, &br, nullptr, nullptr, 0) // OK
        if(NULL != br.hRgn)
        {
            L_SetBitmapRgnHandle(&tBmp, nullptr, br.hRgn, L_RGN_SET); // OK
            L_FillBitmap(&tBmp, bkColor); // OK bkColor is White
            L_FreeBitmapRgn(&tBmp);
        }
        L_LineRemoveBitmap(&bwBmp, &lr, lrCB, NULL, 0) // returns OK
        if(NULL != lr.hRgn) // not null but empty
        {
            ::GetRgnBox(lr.hRgn, &r); // it is always {0, 0, 0, 0}
            L_SetBitmapRgnHandle(&tBmp, nullptr, lr.hRgn, L_RGN_SET);
            L_FillBitmap(&tBmp, bkColor); // OK but fills nothing
            L_FreeBitmapRgn(&tBmp);
        }
        // do other stuff and save
    }
}

L_INT EXT_CALLBACK lrCB(HRGN hRgn, L_INT iStartRow, L_INT iStartCol, L_INT iLength, L_VOID* pUserData)
{
    UNREFERENCED_PARAMETER(pUserData);
    if(NULL != hRgn) // always null
    {
        RECT rcRect;

        GetRgnBox(hRgn, &rcRect);
        DeleteObject(hRgn);
    }
    return SUCCESS_REMOVE;
}

1 个答案:

答案 0 :(得分:1)

山姆

如果您希望Callback设置Windows区域,则在定义LINEREMOVE结构时还需要设置LINE_CALLBACK_REGION uFlag:

LINEREMOVE lr = {
   sizeof(LINEREMOVE),                          // uStructSize
   LINE_CALLBACK_REGION| LINE_SINGLE_REGION,    // uFlags
   400,                                         // Minimum Length
   12,                                          // Maximum Width
   15,                                          // Wall size
   10,                                          // Max percent of line that can be a wall
   2,                                           // Maximum Gap
   0,                                           // Maximum Line Variance
   LINEREMOVE_VERTICAL,                         // horizontal or vertical
   NULL,                                        // hRgn 
   nullptr,                                     // pBitmapRegion
   sizeof(BITMAPHANDLE)                         // uBitmapStructSize
};

该标志记录在in this page中。

函数完成处理后,可以使用以下代码获取lr.hRgn属性中设置的线区域,并将其设置为原始颜色位图中:

L_SetBitmapRgnHandle(&OriginalBitmap, NULL, lr.hRgn, L_RGN_SET);

除了此处的回复外,我还向您发送了一个小代码段,以回复您发送到我们支持地址的电子邮件。