main(int argc, char **argv) { char *filein, *fileout; l_int32 thresh; PIX *pixs, *pixg, *pixb; PIX *pixmask4, *pixseed4, *pixsf4, *pixd4, *pixd; static char mainName[] = "pagesegtest2"; if (argc != 4) exit(ERROR_INT(" Syntax: pagesegtest2 filein thresh fileout", mainName, 1)); filein = argv[1]; thresh = atoi(argv[2]); fileout = argv[3]; /* Get a 1 bpp version of the page */ if ((pixs = pixRead(filein)) == NULL) exit(ERROR_INT("pixs not made", mainName, 1)); if (pixGetDepth(pixs) == 32) pixg = pixConvertRGBToGrayFast(pixs); else pixg = pixClone(pixs); if (pixGetDepth(pixg) == 8) pixb = pixThresholdToBinary(pixg, thresh); else pixb = pixClone(pixg); /* Make seed and mask, and fill seed into mask */ pixseed4 = pixMorphSequence(pixb, seed_sequence, 0); pixmask4 = pixMorphSequence(pixb, mask_sequence, 0); pixsf4 = pixSeedfillBinary(NULL, pixseed4, pixmask4, 8); pixd4 = pixMorphSequence(pixsf4, dilation_sequence, 0); /* Mask at full resolution */ pixd = pixExpandBinaryPower2(pixd4, 4); pixWrite(fileout, pixd, IFF_TIFF_G4); /* Extract non-image parts (e.g., text) at full resolution */ pixSubtract(pixb, pixb, pixd); pixDisplayWithTitle(pixseed4, 400, 100, "halftone seed", DFLAG); pixDisplayWithTitle(pixmask4, 100, 100, "halftone seed mask", DFLAG); pixDisplayWithTitle(pixd4, 700, 100, "halftone mask", DFLAG); pixDisplayWithTitle(pixb, 1000, 100, "non-halftone", DFLAG); #if 1 pixWrite("junkseed", pixseed4, IFF_TIFF_G4); pixWrite("junkmask", pixmask4, IFF_TIFF_G4); pixWrite("junkfill", pixd4, IFF_TIFF_G4); pixWrite("junktext", pixb, IFF_TIFF_G4); #endif pixDestroy(&pixs); pixDestroy(&pixg); pixDestroy(&pixb); pixDestroy(&pixseed4); pixDestroy(&pixmask4); pixDestroy(&pixsf4); pixDestroy(&pixd4); pixDestroy(&pixd); exit(0); }
bool CJBig2File::MemoryToJBig2(unsigned char* pBufferBGRA ,int BufferSize, int nWidth, int nHeight, std::wstring sDstFileName) { // check for valid input parameters /////////////////////////////////////////////////////////// if ( NULL == pBufferBGRA ) return false; int lBufferSize = BufferSize; unsigned char *pSourceBuffer = pBufferBGRA; PIX *pSource = pixCreate( nWidth, nHeight, 32 ); if ( !pSource ) return false; for ( int nY = 0; nY < nHeight; nY++ ) { for ( int nX = 0; nX < nWidth; nX++, pSourceBuffer += 3 )//todooo сделать 3 ? 4 { pixSetRGBPixel( pSource, nX, nY, pSourceBuffer[ 2 ], pSourceBuffer[ 1 ], pSourceBuffer[ 0 ] ); } } jbig2ctx *pContext = jbig2_init( m_dTreshold, 0.5, 0, 0, ! m_bPDFMode, m_bRefine ? 10 : -1 ); // Пока сделаем запись одной картинки в JBig2 // TO DO: надо будет сделать запись нескольких картинок в 1 JBig2 файл // Убираем ColorMap PIX *pPixL = NULL; if ( NULL == ( pPixL = pixRemoveColormap( pSource, REMOVE_CMAP_BASED_ON_SRC ) ) ) { pixDestroy( &pSource ); jbig2_destroy( pContext ); return false; } pixDestroy( &pSource ); PIX *pPixT = NULL; if ( pPixL->d > 1 ) { PIX *pGray = NULL; if ( pPixL->d > 8 ) { pGray = pixConvertRGBToGrayFast( pPixL ); if ( !pGray ) { pixDestroy( &pSource ); jbig2_destroy( pContext ); return false; } } else { pGray = pixClone( pPixL ); } if ( m_bUpscale2x ) { pPixT = pixScaleGray2xLIThresh( pGray, m_nBwTreshold ); } else if ( m_bUpscale4x ) { pPixT = pixScaleGray4xLIThresh( pGray, m_nBwTreshold ); } else { pPixT = pixThresholdToBinary( pGray, m_nBwTreshold ); } pixDestroy( &pGray ); } else { pPixT = pixClone( pPixL ); } if ( m_sOutputTreshold.length() > 0 ) { pixWrite( m_sOutputTreshold.c_str(), pPixT, IFF_BMP ); } if ( m_bSegment && pPixL->d > 1 ) { PIX *pGraphics = segment_image( pPixT, pPixL ); if ( pGraphics ) { char *sFilename; asprintf( &sFilename, "%s.%04d.%s", m_sBaseName.c_str(), 0, ".bmp" ); pixWrite( sFilename, pGraphics, IFF_BMP ); free( sFilename ); } if ( !pPixT ) { // Ничего не делаем return true; } } pixDestroy( &pPixL ); if ( !m_bSymbolMode ) { int nLength = 0; uint8_t *pBuffer = jbig2_encode_generic( pPixT, !m_bPDFMode, 0, 0, m_bDuplicateLineRemoval, &nLength ); bool bRes = true; NSFile::CFileBinary file; if (file.CreateFileW(sDstFileName ) == true ) { file.WriteFile(pBuffer, nLength); file.CloseFile(); bRes = true; } else bRes = false; pixDestroy( &pPixT ); if ( pBuffer ) free( pBuffer ); jbig2_destroy( pContext ); return bRes; } int nNumPages = 1; jbig2_add_page( pContext, pPixT ); pixDestroy( &pPixT ); int nLength = 0; uint8_t *pBuffer = jbig2_pages_complete( pContext, &nLength ); if ( !pBuffer ) { jbig2_destroy( pContext ); return false; } if ( m_bPDFMode ) { std::wstring sFileName = sDstFileName;//m_sBaseName + _T(".sym"); NSFile::CFileBinary file; if ( file.CreateFileW(sFileName) == false) { free( pBuffer ); jbig2_destroy( pContext ); return false; } file.WriteFile( pBuffer, nLength ); file.CloseFile(); } free( pBuffer ); for ( int nIndex = 0; nIndex < nNumPages; ++nIndex ) { pBuffer = jbig2_produce_page( pContext, nIndex, -1, -1, &nLength ); if ( m_bPDFMode ) { std::wstring sFileName = m_sBaseName + L".0000"; NSFile::CFileBinary file; if ( file.CreateFileW(sFileName) ==false) { free( pBuffer ); jbig2_destroy( pContext ); return false; } file.WriteFile( pBuffer, nLength ); file.CloseFile(); } free( pBuffer ); } jbig2_destroy( pContext ); return true; }
main(int argc, char **argv) { l_int32 w, h; BOXA *boxa; PIX *pixs, *pixt1, *pixt2, *pixg, *pixb, *pixd, *pixc; PIX *pixm, *pixm2, *pixd2, *pixs2; PIXA *pixa, *pixac; PIXCMAP *cmap, *cmapg; static char mainName[] = "misctest1"; pixac = pixaCreate(0); /* Combine two grayscale images using a mask */ pixd = pixRead("feyn.tif"); pixs = pixRead("rabi.png"); pixm = pixRead("pageseg2-seed.png"); pixd2 = pixScaleToGray2(pixd); pixs2 = pixScaleToGray2(pixs); pixSaveTiled(pixd2, pixac, 2, 1, 40, 32); pixSaveTiled(pixs2, pixac, 2, 0, 40, 0); pixSaveTiled(pixm, pixac, 2, 0, 40, 0); pixCombineMaskedGeneral(pixd2, pixs2, pixm, 100, 100); pixSaveTiled(pixd2, pixac, 2, 1, 40, 0); pixDisplayWithTitle(pixd2, 100, 100, NULL, SHOW); pixDestroy(&pixd2); pixDestroy(&pixs2); /* Combine two binary images using a mask */ pixm2 = pixExpandBinaryReplicate(pixm, 2); pixt1 = pixCopy(NULL, pixd); pixCombineMaskedGeneral(pixd, pixs, pixm2, 200, 200); pixSaveTiled(pixd, pixac, 4, 0, 40, 0); pixDisplayWithTitle(pixd, 700, 100, NULL, SHOW); pixCombineMasked(pixt1, pixs, pixm2); pixSaveTiled(pixt1, pixac, 4, 0, 40, 0); pixDestroy(&pixd); pixDestroy(&pixt1); pixDestroy(&pixs); pixDestroy(&pixm); pixDestroy(&pixm2); /* Do a restricted seedfill */ pixs = pixRead("pageseg2-seed.png"); pixm = pixRead("pageseg2-mask.png"); pixd = pixSeedfillBinaryRestricted(NULL, pixs, pixm, 8, 50, 175); pixSaveTiled(pixs, pixac, 2, 1, 40, 0); pixSaveTiled(pixm, pixac, 2, 0, 40, 0); pixSaveTiled(pixd, pixac, 2, 0, 40, 0); pixDestroy(&pixs); pixDestroy(&pixm); pixDestroy(&pixd); /* Colorize a grayscale image */ pixs = pixRead("lucasta.150.jpg"); pixGetDimensions(pixs, &w, &h, NULL); pixb = pixThresholdToBinary(pixs, 128); boxa = pixConnComp(pixb, &pixa, 8); pixSaveTiled(pixs, pixac, 1, 1, 40, 0); cmap = pixcmapGrayToColor(0x6f90c0); pixSetColormap(pixs, cmap); pixSaveTiled(pixs, pixac, 1, 0, 40, 0); pixc = pixaDisplayRandomCmap(pixa, w, h); pixcmapResetColor(pixGetColormap(pixc), 0, 255, 255, 255); pixSaveTiled(pixc, pixac, 1, 0, 40, 0); pixDestroy(&pixs); pixDestroy(&pixb); pixDestroy(&pixc); boxaDestroy(&boxa); pixaDestroy(&pixa); /* Convert color to gray */ pixs = pixRead("weasel4.16c.png"); pixSaveTiled(pixs, pixac, 1, 1, 20, 0); pixc = pixConvertTo32(pixs); pixt1 = pixConvertRGBToGray(pixc, 3., 7., 5.); pixSaveTiled(pixt1, pixac, 1, 0, 20, 0); pixt2 = pixConvertRGBToGrayFast(pixc); pixSaveTiled(pixt2, pixac, 1, 0, 20, 0); pixg = pixCopy(NULL, pixs); cmap = pixGetColormap(pixs); cmapg = pixcmapColorToGray(cmap, 4., 6., 3.); pixSetColormap(pixg, cmapg); pixSaveTiled(pixg, pixac, 1, 0, 20, 0); pixDestroy(&pixs); pixDestroy(&pixc); pixDestroy(&pixt1); pixDestroy(&pixt2); pixDestroy(&pixg); pixd = pixaDisplay(pixac, 0, 0); pixDisplayWithTitle(pixd, 100, 100, NULL, 1); pixWrite("junkmisc1.png", pixd, IFF_PNG); pixDestroy(&pixd); pixaDestroy(&pixac); return 0; }