本文整理汇总了C++中pixScale函数的典型用法代码示例。如果您正苦于以下问题:C++ pixScale函数的具体用法?C++ pixScale怎么用?C++ pixScale使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pixScale函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: AddScaledImages
static void
AddScaledImages(PIXA *pixa,
const char *fname,
l_int32 width)
{
l_int32 i, w;
l_float32 scalefactor;
PIX *pixs, *pixt1, *pixt2, *pix32;
pixs = pixRead(fname);
w = pixGetWidth(pixs);
for (i = 0; i < 5; i++) {
scalefactor = (l_float32)width / (FACTOR[i] * (l_float32)w);
pixt1 = pixScale(pixs, FACTOR[i], FACTOR[i]);
pixt2 = pixScale(pixt1, scalefactor, scalefactor);
pix32 = pixConvertTo32(pixt2);
if (i == 0)
pixSaveTiled(pix32, pixa, 1.0, 1, SPACE, 32);
else
pixSaveTiled(pix32, pixa, 1.0, 0, SPACE, 32);
pixDestroy(&pixt1);
pixDestroy(&pixt2);
pixDestroy(&pix32);
}
pixDestroy(&pixs);
return;
}
示例2: recogShowPath
/*!
* \brief recogShowPath()
*
* \param[in] recog with LUT's pre-computed
* \param[in] select 0 for Viterbi; 1 for rescored
* \return pix debug output), or NULL on error
*/
static PIX *
recogShowPath(L_RECOG *recog,
l_int32 select)
{
char textstr[16];
l_int32 i, n, index, xloc, dely;
l_float32 score;
L_BMF *bmf;
NUMA *natempl_s, *nascore_s, *naxloc_s, *nadely_s;
PIX *pixs, *pix0, *pix1, *pix2, *pix3, *pix4, *pix5;
L_RDID *did;
PROCNAME("recogShowPath");
if (!recog)
return (PIX *)ERROR_PTR("recog not defined", procName, NULL);
if ((did = recogGetDid(recog)) == NULL)
return (PIX *)ERROR_PTR("did not defined", procName, NULL);
bmf = bmfCreate(NULL, 8);
pixs = pixScale(did->pixs, 4.0, 4.0);
pix0 = pixAddBorderGeneral(pixs, 0, 0, 0, 40, 0);
pix1 = pixConvertTo32(pix0);
if (select == 0) { /* Viterbi */
natempl_s = did->natempl;
nascore_s = did->nascore;
naxloc_s = did->naxloc;
nadely_s = did->nadely;
} else { /* rescored */
natempl_s = did->natempl_r;
nascore_s = did->nascore_r;
naxloc_s = did->naxloc_r;
nadely_s = did->nadely_r;
}
n = numaGetCount(natempl_s);
for (i = 0; i < n; i++) {
numaGetIValue(natempl_s, i, &index);
pix2 = pixaGetPix(recog->pixa_u, index, L_CLONE);
pix3 = pixScale(pix2, 4.0, 4.0);
pix4 = pixErodeBrick(NULL, pix3, 5, 5);
pixXor(pix4, pix4, pix3);
numaGetFValue(nascore_s, i, &score);
snprintf(textstr, sizeof(textstr), "%5.3f", score);
pix5 = pixAddTextlines(pix4, bmf, textstr, 1, L_ADD_BELOW);
numaGetIValue(naxloc_s, i, &xloc);
numaGetIValue(nadely_s, i, &dely);
pixPaintThroughMask(pix1, pix5, 4 * xloc, 4 * dely, 0xff000000);
pixDestroy(&pix2);
pixDestroy(&pix3);
pixDestroy(&pix4);
pixDestroy(&pix5);
}
pixDestroy(&pixs);
pixDestroy(&pix0);
bmfDestroy(&bmf);
return pix1;
}
示例3: main
int main(int argc,
char **argv)
{
BOX *box;
PIX *pixt1, *pixt2, *pix1, *pix2, *pix3;
L_REGPARAMS *rp;
if (regTestSetup(argc, argv, &rp))
return 1;
pixt1 = pixRead("feyn.tif"); /* 300 ppi */
box = boxCreate(19, 774, 2247, 2025);
pix1 = pixClipRectangle(pixt1, box, NULL);
pixDestroy(&pixt1);
pixt1 = pixRead("lucasta.150.jpg");
pixt2 = pixConvertTo1(pixt1, 128); /* 150 ppi */
pix2 = pixScale(pixt2, 2.2, 2.2); /* 300 ppi */
pixDestroy(&pixt1);
pixDestroy(&pixt2);
pixt1 = pixRead("zanotti-78.jpg");
pixt2 = pixConvertTo1(pixt1, 128); /* 150 ppi */
pix3 = pixScale(pixt2, 2.0, 2.0); /* 300 ppi */
pixDestroy(&pixt1);
pixDestroy(&pixt2);
boxDestroy(&box);
/* Make word boxes using pixWordMaskByDilation() */
MakeWordBoxes1(pix1, 20, rp); /* 0 */
MakeWordBoxes1(pix2, 20, rp); /* 1 */
MakeWordBoxes1(pix3, 20, rp); /* 2 */
/* Make word boxes using the higher-level functions
* pixGetWordsInTextlines() and pixGetWordBoxesInTextlines() */
MakeWordBoxes2(pix1, 1, rp); /* 3, 4 */
MakeWordBoxes2(pix2, 1, rp); /* 5, 6 */
MakeWordBoxes2(pix3, 1, rp); /* 7, 8 */
/* Make word boxes using the higher-level functions
* pixGetWordsInTextlines() and pixGetWordBoxesInTextlines() */
MakeWordBoxes2(pix1, 2, rp); /* 9, 10 */
MakeWordBoxes2(pix2, 2, rp); /* 11, 12 */
MakeWordBoxes2(pix3, 2, rp); /* 13, 14 */
pixDestroy(&pix1);
pixDestroy(&pix2);
pixDestroy(&pix3);
return regTestCleanup(rp);
}
示例4: pixGetDepth
/* static */
void Input::PreparePixInput(const StaticShape& shape, const Pix* pix,
TRand* randomizer, NetworkIO* input) {
bool color = shape.depth() == 3;
Pix* var_pix = const_cast<Pix*>(pix);
int depth = pixGetDepth(var_pix);
Pix* normed_pix = nullptr;
// On input to BaseAPI, an image is forced to be 1, 8 or 24 bit, without
// colormap, so we just have to deal with depth conversion here.
if (color) {
// Force RGB.
if (depth == 32)
normed_pix = pixClone(var_pix);
else
normed_pix = pixConvertTo32(var_pix);
} else {
// Convert non-8-bit images to 8 bit.
if (depth == 8)
normed_pix = pixClone(var_pix);
else
normed_pix = pixConvertTo8(var_pix, false);
}
int height = pixGetHeight(normed_pix);
int target_height = shape.height();
if (target_height == 1) target_height = shape.depth();
if (target_height != 0 && target_height != height) {
// Get the scaled image.
float im_factor = static_cast<float>(target_height) / height;
Pix* scaled_pix = pixScale(normed_pix, im_factor, im_factor);
pixDestroy(&normed_pix);
normed_pix = scaled_pix;
}
input->FromPix(shape, normed_pix, randomizer);
pixDestroy(&normed_pix);
}
示例5: pixDisplayWriteFormat
/*!
* pixDisplayWriteFormat()
*
* Input: pix (1, 2, 4, 8, 16, 32 bpp)
* reduction (-1 to reset/erase; 0 to disable;
* otherwise this is a reduction factor)
* format (IFF_PNG or IFF_JFIF_JPEG)
* Return: 0 if OK; 1 on error
*
* Notes:
* (1) This writes files if reduction > 0. These can be displayed using
* pixDisplayMultiple("/tmp/junk_write_display*");
* (2) All previously written files can be erased by calling with
* reduction < 0; the value of pixs is ignored.
* (3) If reduction > 1 and depth == 1, this does a scale-to-gray
* reduction.
* (4) This function uses a static internal variable to number
* output files written by a single process. Behavior
* with a shared library may be unpredictable.
* (5) Output file format is as follows:
* format == IFF_JFIF_JPEG:
* png if d < 8 or d == 16 or if the output pix
* has a colormap. Otherwise, output is jpg.
* format == IFF_PNG:
* png (lossless) on all images.
* (6) For 16 bpp, the choice of full dynamic range with log scale
* is the best for displaying these images. Alternative outputs are
* pix8 = pixMaxDynamicRange(pixt, L_LINEAR_SCALE);
* pix8 = pixConvert16To8(pixt, 0); // low order byte
* pix8 = pixConvert16To8(pixt, 1); // high order byte
*/
l_int32
pixDisplayWriteFormat(PIX *pixs,
l_int32 reduction,
l_int32 format)
{
char buffer[L_BUF_SIZE];
l_float32 scale;
PIX *pixt, *pix8;
static l_int32 index = 0; /* caution: not .so or thread safe */
PROCNAME("pixDisplayWriteFormat");
if (reduction == 0) return 0;
if (reduction < 0) {
index = 0; /* reset; this will cause erasure at next call to write */
return 0;
}
if (format != IFF_JFIF_JPEG && format != IFF_PNG)
return ERROR_INT("invalid format", procName, 1);
if (!pixs)
return ERROR_INT("pixs not defined", procName, 1);
if (index == 0) {
snprintf(buffer, L_BUF_SIZE,
"rm -f /tmp/junk_write_display.*.png /tmp/junk_write_display.*.jpg");
system(buffer);
}
index++;
if (reduction == 1)
pixt = pixClone(pixs);
else {
scale = 1. / (l_float32)reduction;
if (pixGetDepth(pixs) == 1)
pixt = pixScaleToGray(pixs, scale);
else
pixt = pixScale(pixs, scale, scale);
}
if (pixGetDepth(pixt) == 16) {
pix8 = pixMaxDynamicRange(pixt, L_LOG_SCALE);
snprintf(buffer, L_BUF_SIZE, "/tmp/junk_write_display.%03d.png", index);
pixWrite(buffer, pix8, IFF_PNG);
pixDestroy(&pix8);
}
else if (pixGetDepth(pixt) < 8 || pixGetColormap(pixt) ||
format == IFF_PNG) {
snprintf(buffer, L_BUF_SIZE, "/tmp/junk_write_display.%03d.png", index);
pixWrite(buffer, pixt, IFF_PNG);
}
else {
snprintf(buffer, L_BUF_SIZE, "/tmp/junk_write_display.%03d.jpg", index);
pixWrite(buffer, pixt, format);
}
pixDestroy(&pixt);
return 0;
}
示例6: Java_com_googlecode_leptonica_android_Scale_nativeScale
jint Java_com_googlecode_leptonica_android_Scale_nativeScale(JNIEnv *env, jclass clazz,
jint nativePix, jfloat scaleX,
jfloat scaleY) {
PIX *pixs = (PIX *) nativePix;
PIX *pixd = pixScale(pixs, (l_float32) scaleX, (l_float32) scaleY);
return (jint) pixd;
}
示例7: image
image_object::image_object( const char* fileName, const char* lang )
: image( pixScale( pixRead( fileName ), PIXSCALE, PIXSCALE ) ){
assert( image != NULL ); // TODO: Find a better way to fail.
tesseract.Init( TESSDATAPATH, lang );
tesseract.SetImage( image );
tesseract.SetVariable( "tessedit_char_whitelist",
"+-#~/:(),<>&* _0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" );
} //image_object (constructor)
示例8: main
main(int argc,
char **argv)
{
char *filein, *fileout;
l_int32 d;
l_float32 scalex, scaley;
PIX *pixs, *pixd;
static char mainName[] = "scaletest1";
if (argc != 5)
return ERROR_INT(" Syntax: scaletest1 filein scalex scaley fileout",
mainName, 1);
filein = argv[1];
scalex = atof(argv[2]);
scaley = atof(argv[3]);
fileout = argv[4];
if ((pixs = pixRead(filein)) == NULL)
return ERROR_INT("pixs not made", mainName, 1);
/* choose type of scaling operation */
#if 1
pixd = pixScale(pixs, scalex, scaley);
#elif 0
pixd = pixScaleLI(pixs, scalex, scaley);
#elif 0
pixd = pixScaleSmooth(pixs, scalex, scaley);
#elif 0
pixd = pixScaleAreaMap(pixs, scalex, scaley);
#elif 0
pixd = pixScaleBySampling(pixs, scalex, scaley);
#else
pixd = pixScaleToGray(pixs, scalex);
#endif
d = pixGetDepth(pixd);
#if 1
if (d <= 8)
pixWrite(fileout, pixd, IFF_PNG);
else
pixWrite(fileout, pixd, IFF_JFIF_JPEG);
#else
pixWrite(fileout, pixd, IFF_PNG);
#endif
pixDestroy(&pixs);
pixDestroy(&pixd);
return 0;
}
示例9: upscale
Pix* upscale(Pix* pix) {
l_int32 pixPixelCount = pixGetWidth(pix)* pixGetHeight(pix);
const l_int32 MIN_PIXEL_COUNT = 3 * 1024*1024;
if (pixPixelCount < MIN_PIXEL_COUNT) {
l_float32 scale = ((double) MIN_PIXEL_COUNT) / pixPixelCount;
scale = sqrt(scale);
Pix* scaled = pixScale(pix, scale,scale);
l_int32 xres, yres;
pixGetResolution(pix, &xres, &yres);
pixSetResolution(scaled, 600, 600);
return scaled;
}
return pixClone(pix);
}
示例10: getImagePhash_px
unsigned long long getImagePhash_px( PIX *pix_orig, char *tmpFilename ) {
int free_8 = 0;
// Convert colour images down to grey
PIX *pix8;
if( pixGetDepth(pix_orig) > 8 ) {
pix8 = pixScaleRGBToGrayFast( pix_orig, 1, COLOR_GREEN );
if( pix8 == NULL ) {
printf("Covertion to 8bit, did not go well.");
return 0;
}
free_8 = 1;
}
else {
// already gray
free_8 = 0;
pix8 = pix_orig;
}
int width = pixGetWidth( pix8 );
int height = pixGetHeight( pix8 );
BOX* box = boxCreate(1, 1, width-2, height-2);
PIX* pixc = pixClipRectangle(pix8, box, NULL);
if(free_8 == 1) {
pixDestroy( &pix8 );
}
PIX *pix8s = pixScale(pixc, 0.2, 0.2);
pixDestroy( &pixc );
// Convert image down to binary (no gray)
/* PIX *pix1 = pixThresholdToBinary( pix8s, 200 );
if( pix1 == NULL ) {
printf( "Covertion to 1bit, did not go well.");
pixDestroy( &pix8s );
return 0;
}
pixDestroy( &pix8s );
*/
// Save the file for pHash processnig
pixWrite( tmpFilename, pix8s, IFF_JFIF_JPEG);
pixDestroy( &pix8s );
unsigned long long ret = calculateImagePhash( tmpFilename );
//unlink(tmpFilename);
return ret;
}
示例11: GenerateSetOfMargePix
PIXA *
GenerateSetOfMargePix(void)
{
l_float32 factor;
BOX *box;
PIX *pixs, *pixt1, *pixt2, *pixt3, *pixt4;
PIXA *pixa;
pixs = pixRead("marge.jpg");
box = boxCreate(130, 93, 263, 253);
factor = sqrt(2.0);
pixt1 = pixClipRectangle(pixs, box, NULL); /* 266 KB */
pixt2 = pixScale(pixt1, factor, factor); /* 532 KB */
pixt3 = pixScale(pixt2, factor, factor); /* 1064 KB */
pixt4 = pixScale(pixt3, factor, factor); /* 2128 KB */
pixa = pixaCreate(4);
pixaAddPix(pixa, pixt1, L_INSERT);
pixaAddPix(pixa, pixt2, L_INSERT);
pixaAddPix(pixa, pixt3, L_INSERT);
pixaAddPix(pixa, pixt4, L_INSERT);
boxDestroy(&box);
pixDestroy(&pixs);
return pixa;
}
示例12: GetPix
// Gets anything and everything with a non-NULL pointer, prescaled to a
// given target_height (if 0, then the original image height), and aligned.
// Also returns (if not NULL) the width and height of the scaled image.
// The return value is the scale factor that was applied to the image to
// achieve the target_height.
float ImageData::PreScale(int target_height, Pix** pix,
int* scaled_width, int* scaled_height,
GenericVector<TBOX>* boxes) const {
int input_width = 0;
int input_height = 0;
Pix* src_pix = GetPix();
ASSERT_HOST(src_pix != NULL);
input_width = pixGetWidth(src_pix);
input_height = pixGetHeight(src_pix);
if (target_height == 0)
target_height = input_height;
float im_factor = static_cast<float>(target_height) / input_height;
if (scaled_width != NULL)
*scaled_width = IntCastRounded(im_factor * input_width);
if (scaled_height != NULL)
*scaled_height = target_height;
if (pix != NULL) {
// Get the scaled image.
pixDestroy(pix);
*pix = pixScale(src_pix, im_factor, im_factor);
if (*pix == NULL) {
tprintf("Scaling pix of size %d, %d by factor %g made null pix!!\n",
input_width, input_height, im_factor);
}
if (scaled_width != NULL)
*scaled_width = pixGetWidth(*pix);
if (scaled_height != NULL)
*scaled_height = pixGetHeight(*pix);
}
pixDestroy(&src_pix);
if (boxes != NULL) {
// Get the boxes.
boxes->truncate(0);
for (int b = 0; b < boxes_.size(); ++b) {
TBOX box = boxes_[b];
box.scale(im_factor);
boxes->push_back(box);
}
if (boxes->empty()) {
// Make a single box for the whole image.
TBOX box(0, 0, im_factor * input_width, target_height);
boxes->push_back(box);
}
}
return im_factor;
}
示例13: GetPix
// Gets anything and everything with a non-NULL pointer, prescaled to a
// given target_height (if 0, then the original image height), and aligned.
// Also returns (if not NULL) the width and height of the scaled image.
void ImageData::PreScale(int target_height, Pix** pix,
int* scaled_width, int* scaled_height,
GenericVector<TBOX>* boxes) const {
int input_width = 0;
int input_height = 0;
Pix* src_pix = GetPix();
ASSERT_HOST(src_pix != NULL);
input_width = pixGetWidth(src_pix);
input_height = pixGetHeight(src_pix);
if (target_height == 0)
target_height = input_height;
float im_factor = static_cast<float>(target_height) / input_height;
if (scaled_width != NULL)
*scaled_width = IntCastRounded(im_factor * input_width);
if (scaled_height != NULL)
*scaled_height = target_height;
if (pix != NULL) {
// Get the scaled image.
pixDestroy(pix);
*pix = pixScale(src_pix, im_factor, im_factor);
if (scaled_width != NULL)
*scaled_width = pixGetWidth(*pix);
if (scaled_height != NULL)
*scaled_height = pixGetHeight(*pix);
}
pixDestroy(&src_pix);
if (boxes != NULL) {
// Get the boxes.
boxes->truncate(0);
for (int b = 0; b < boxes_.size(); ++b) {
TBOX box = boxes_[b];
box.scale(im_factor);
boxes->push_back(box);
}
}
}
示例14: pixDisplayWithTitle
/*!
* pixDisplayWithTitle()
*
* Input: pix (1, 2, 4, 8, 16, 32 bpp)
* x, y (location of display frame)
* title (<optional> on frame; can be NULL);
* dispflag (1 to write, else disabled)
* Return: 0 if OK; 1 on error
*
* Notes:
* (1) See notes for pixDisplay().
* (2) This displays the image if dispflag == 1.
*/
l_int32
pixDisplayWithTitle(PIX *pixs,
l_int32 x,
l_int32 y,
const char *title,
l_int32 dispflag)
{
char *tempname;
char buffer[L_BUF_SIZE];
static l_int32 index = 0; /* caution: not .so or thread safe */
l_int32 w, h, d, spp, maxheight, opaque, threeviews, ignore;
l_float32 ratw, rath, ratmin;
PIX *pix0, *pix1, *pix2;
PIXCMAP *cmap;
#ifndef _WIN32
l_int32 wt, ht;
#else
char *pathname;
char fullpath[_MAX_PATH];
#endif /* _WIN32 */
PROCNAME("pixDisplayWithTitle");
if (dispflag != 1) return 0;
if (!pixs)
return ERROR_INT("pixs not defined", procName, 1);
if (var_DISPLAY_PROG != L_DISPLAY_WITH_XZGV &&
var_DISPLAY_PROG != L_DISPLAY_WITH_XLI &&
var_DISPLAY_PROG != L_DISPLAY_WITH_XV &&
var_DISPLAY_PROG != L_DISPLAY_WITH_IV &&
var_DISPLAY_PROG != L_DISPLAY_WITH_OPEN) {
return ERROR_INT("no program chosen for display", procName, 1);
}
/* Display with three views if either spp = 4 or if colormapped
* and the alpha component is not fully opaque */
opaque = TRUE;
if ((cmap = pixGetColormap(pixs)) != NULL)
pixcmapIsOpaque(cmap, &opaque);
spp = pixGetSpp(pixs);
threeviews = (spp == 4 || !opaque) ? TRUE : FALSE;
/* If colormapped and not opaque, remove the colormap to RGBA */
if (!opaque)
pix0 = pixRemoveColormap(pixs, REMOVE_CMAP_WITH_ALPHA);
else
pix0 = pixClone(pixs);
/* Scale if necessary; this will also remove a colormap */
pixGetDimensions(pix0, &w, &h, &d);
maxheight = (threeviews) ? MAX_DISPLAY_HEIGHT / 3 : MAX_DISPLAY_HEIGHT;
if (w <= MAX_DISPLAY_WIDTH && h <= maxheight) {
if (d == 16) /* take MSB */
pix1 = pixConvert16To8(pix0, 1);
else
pix1 = pixClone(pix0);
} else {
ratw = (l_float32)MAX_DISPLAY_WIDTH / (l_float32)w;
rath = (l_float32)maxheight / (l_float32)h;
ratmin = L_MIN(ratw, rath);
if (ratmin < 0.125 && d == 1)
pix1 = pixScaleToGray8(pix0);
else if (ratmin < 0.25 && d == 1)
pix1 = pixScaleToGray4(pix0);
else if (ratmin < 0.33 && d == 1)
pix1 = pixScaleToGray3(pix0);
else if (ratmin < 0.5 && d == 1)
pix1 = pixScaleToGray2(pix0);
else
pix1 = pixScale(pix0, ratmin, ratmin);
}
pixDestroy(&pix0);
if (!pix1)
return ERROR_INT("pix1 not made", procName, 1);
/* Generate the three views if required */
if (threeviews)
pix2 = pixDisplayLayersRGBA(pix1, 0xffffff00, 0);
else
pix2 = pixClone(pix1);
if (index == 0) {
lept_rmdir("disp");
lept_mkdir("disp");
}
index++;
//.........这里部分代码省略.........
示例15: pixSaveTiledOutline
/*!
* pixSaveTiledOutline()
*
* Input: pixs (1, 2, 4, 8, 32 bpp)
* pixa (the pix are accumulated here)
* scalefactor (0.0 to disable; otherwise this is a scale factor)
* newrow (0 if placed on the same row as previous; 1 otherwise)
* space (horizontal and vertical spacing, in pixels)
* linewidth (width of added outline for image; 0 for no outline)
* dp (depth of pixa; 8 or 32 bpp; only used on first call)
* Return: 0 if OK, 1 on error.
*
* Notes:
* (1) Before calling this function for the first time, use
* pixaCreate() to make the @pixa that will accumulate the pix.
* This is passed in each time pixSaveTiled() is called.
* (2) @scalefactor scales the input image. After scaling and
* possible depth conversion, the image is saved in the input
* pixa, along with a box that specifies the location to
* place it when tiled later. Disable saving the pix by
* setting @scalefactor == 0.0.
* (3) @newrow and @space specify the location of the new pix
* with respect to the last one(s) that were entered.
* (4) @dp specifies the depth at which all pix are saved. It can
* be only 8 or 32 bpp. Any colormap is removed. This is only
* used at the first invocation.
* (5) This function uses two variables from call to call.
* If they were static, the function would not be .so or thread
* safe, and furthermore, there would be interference with two or
* more pixa accumulating images at a time. Consequently,
* we use the first pix in the pixa to store and obtain both
* the depth and the current position of the bottom (one pixel
* below the lowest image raster line when laid out using
* the boxa). The bottom variable is stored in the input format
* field, which is the only field available for storing an int.
*/
l_int32
pixSaveTiledOutline(PIX *pixs,
PIXA *pixa,
l_float32 scalefactor,
l_int32 newrow,
l_int32 space,
l_int32 linewidth,
l_int32 dp)
{
l_int32 n, top, left, bx, by, bw, w, h, depth, bottom;
BOX *box;
PIX *pix1, *pix2, *pix3, *pix4;
PROCNAME("pixSaveTiledOutline");
if (scalefactor == 0.0) return 0;
if (!pixs)
return ERROR_INT("pixs not defined", procName, 1);
if (!pixa)
return ERROR_INT("pixa not defined", procName, 1);
n = pixaGetCount(pixa);
if (n == 0) {
bottom = 0;
if (dp != 8 && dp != 32) {
L_WARNING("dp not 8 or 32 bpp; using 32\n", procName);
depth = 32;
} else {
depth = dp;
}
} else { /* extract the depth and bottom params from the first pix */
pix1 = pixaGetPix(pixa, 0, L_CLONE);
depth = pixGetDepth(pix1);
bottom = pixGetInputFormat(pix1); /* not typical usage! */
pixDestroy(&pix1);
}
/* Remove colormap if it exists; otherwise a copy. This
* guarantees that pix4 is not a clone of pixs. */
pix1 = pixRemoveColormapGeneral(pixs, REMOVE_CMAP_BASED_ON_SRC, L_COPY);
/* Scale and convert to output depth */
if (scalefactor == 1.0) {
pix2 = pixClone(pix1);
} else if (scalefactor > 1.0) {
pix2 = pixScale(pix1, scalefactor, scalefactor);
} else if (scalefactor < 1.0) {
if (pixGetDepth(pix1) == 1)
pix2 = pixScaleToGray(pix1, scalefactor);
else
pix2 = pixScale(pix1, scalefactor, scalefactor);
}
pixDestroy(&pix1);
if (depth == 8)
pix3 = pixConvertTo8(pix2, 0);
else
pix3 = pixConvertTo32(pix2);
pixDestroy(&pix2);
/* Add black outline */
if (linewidth > 0)
pix4 = pixAddBorder(pix3, linewidth, 0);
else
//.........这里部分代码省略.........