int main(int argc, char **argv) { BOX *box; PIX *pixs, *pix1, *pix2, *pix3, *pix4, *pix5, *pix6, *pix7; PIX *pix8, *pix9; PIXCMAP *cmap; L_REGPARAMS *rp; if (regTestSetup(argc, argv, &rp)) return 1; pixs = pixRead("lucasta-frag.jpg"); /* Convert to 4 bpp with 6 levels and a colormap */ pix1 = pixThresholdTo4bpp(pixs, 6, 1); /* Color some non-white pixels, preserving antialiasing, and * adding these colors to the colormap */ box = boxCreate(120, 30, 200, 200); pixColorGray(pix1, box, L_PAINT_DARK, 220, 0, 0, 255); regTestWritePixAndCheck(rp, pix1, IFF_PNG); /* 0 */ pixDisplayWithTitle(pix1, 0, 0, NULL, rp->display); boxDestroy(&box); /* Scale up by 1.5; losing the colormap */ pix2 = pixScale(pix1, 1.5, 1.5); regTestWritePixAndCheck(rp, pix2, IFF_JFIF_JPEG); /* 1 */ pixDisplayWithTitle(pix2, 0, 0, NULL, rp->display); /* Octcube quantize using the same colormap */ startTimer(); cmap = pixGetColormap(pix1); pix3 = pixOctcubeQuantFromCmap(pix2, cmap, MIN_DEPTH, LEVEL, L_EUCLIDEAN_DISTANCE); fprintf(stderr, "Time to re-quantize to cmap = %7.3f sec\n", stopTimer()); regTestWritePixAndCheck(rp, pix3, IFF_PNG); /* 2 */ pixDisplayWithTitle(pix3, 0, 0, NULL, rp->display); /* Convert the quantized image to rgb */ pix4 = pixConvertTo32(pix3); /* Re-quantize using median cut */ pix5 = pixMedianCutQuant(pix4, 0); regTestWritePixAndCheck(rp, pix5, IFF_PNG); /* 3 */ pixDisplayWithTitle(pix5, 0, 0, NULL, rp->display); /* Re-quantize to few colors using median cut */ pix6 = pixFewColorsMedianCutQuantMixed(pix4, 30, 30, 100, 0, 0, 0); regTestWritePixAndCheck(rp, pix6, IFF_PNG); /* 4 */ pixDisplayWithTitle(pix6, 0, 0, NULL, rp->display); /* Octcube quantize mixed with gray */ startTimer(); pix7 = pixOctcubeQuantMixedWithGray(pix2, 4, 5, 5); fprintf(stderr, "Time to re-quantize mixed = %7.3f sec\n", stopTimer()); regTestWritePixAndCheck(rp, pix7, IFF_PNG); /* 5 */ pixDisplayWithTitle(pix7, 0, 0, NULL, rp->display); /* Fixed octcube quantization */ startTimer(); pix8 = pixFixedOctcubeQuant256(pix2, 0); fprintf(stderr, "Time to re-quantize 256 = %7.3f sec\n", stopTimer()); regTestWritePixAndCheck(rp, pix8, IFF_PNG); /* 6 */ pixDisplayWithTitle(pix8, 0, 0, NULL, rp->display); /* Remove unused colors */ startTimer(); pix9 = pixCopy(NULL, pix8); pixRemoveUnusedColors(pix9); fprintf(stderr, "Time to remove unused colors = %7.3f sec\n", stopTimer()); regTestWritePixAndCheck(rp, pix9, IFF_PNG); /* 7 */ pixDisplayWithTitle(pix8, 0, 0, NULL, rp->display); /* Compare before and after colors removed */ regTestComparePix(rp, pix8, pix9); /* 8 */ pixDestroy(&pixs); pixDestroy(&pix1); pixDestroy(&pix2); pixDestroy(&pix3); pixDestroy(&pix4); pixDestroy(&pix5); pixDestroy(&pix6); pixDestroy(&pix7); pixDestroy(&pix8); pixDestroy(&pix9); return regTestCleanup(rp); }
static l_int32 TestImage(const char *filename, l_int32 i, L_REGPARAMS *rp) { char buf[256]; l_int32 w, h; l_float32 factor; PIX *pix, *pixs, *pixc, *pix32, *pixt, *pixd; PIXA *pixa; PROCNAME("TestImage"); if ((pix = pixRead(filename)) == NULL) { rp->success = FALSE; return ERROR_INT("pix not made", procName, 1); } pixGetDimensions(pix, &w, &h, NULL); if (w > MAX_WIDTH) { factor = (l_float32)MAX_WIDTH / (l_float32)w; pixs = pixScale(pix, factor, factor); } else pixs = pixClone(pix); pixDestroy(&pix); pixa = pixaCreate(0); /* Median cut quantizer (no dither; 5 sigbits) */ pixSaveTiled(pixs, pixa, 1.0, 1, SPACE, 32); pixc = pixMedianCutQuantGeneral(pixs, 0, 0, 16, 5, 1, 1); PixSave32(pixa, pixc, rp); pixc = pixMedianCutQuantGeneral(pixs, 0, 0, 128, 5, 1, 1); PixSave32(pixa, pixc, rp); pixc = pixMedianCutQuantGeneral(pixs, 0, 0, 256, 5, 1, 1); PixSave32(pixa, pixc, rp); /* Median cut quantizer (with dither; 5 sigbits) */ pixSaveTiled(pixs, pixa, 1.0, 1, SPACE, 0); pixc = pixMedianCutQuantGeneral(pixs, 1, 0, 16, 5, 1, 1); PixSave32(pixa, pixc, rp); pixc = pixMedianCutQuantGeneral(pixs, 1, 0, 128, 5, 1, 1); PixSave32(pixa, pixc, rp); pixc = pixMedianCutQuantGeneral(pixs, 1, 0, 256, 5, 1, 1); PixSave32(pixa, pixc, rp); /* Median cut quantizer (no dither; 6 sigbits) */ pixSaveTiled(pixs, pixa, 1.0, 1, SPACE, 32); pixc = pixMedianCutQuantGeneral(pixs, 0, 0, 16, 6, 1, 1); PixSave32(pixa, pixc, rp); pixc = pixMedianCutQuantGeneral(pixs, 0, 0, 128, 6, 1, 1); PixSave32(pixa, pixc, rp); pixc = pixMedianCutQuantGeneral(pixs, 0, 0, 256, 6, 1, 1); PixSave32(pixa, pixc, rp); /* Median cut quantizer (with dither; 6 sigbits) */ pixSaveTiled(pixs, pixa, 1.0, 1, SPACE, 0); pixc = pixMedianCutQuantGeneral(pixs, 1, 0, 16, 6, 1, 1); PixSave32(pixa, pixc, rp); pixc = pixMedianCutQuantGeneral(pixs, 1, 0, 128, 6, 1, 1); PixSave32(pixa, pixc, rp); pixc = pixMedianCutQuantGeneral(pixs, 1, 0, 256, 6, 10, 1); PixSave32(pixa, pixc, rp); /* Median cut quantizer (mixed color/gray) */ pixSaveTiled(pixs, pixa, 1.0, 1, SPACE, 0); pixc = pixMedianCutQuantMixed(pixs, 20, 10, 0, 0, 0); PixSave32(pixa, pixc, rp); pixc = pixMedianCutQuantMixed(pixs, 60, 20, 0, 0, 0); PixSave32(pixa, pixc, rp); pixc = pixMedianCutQuantMixed(pixs, 180, 40, 0, 0, 0); PixSave32(pixa, pixc, rp); /* Simple 256 cube octcube quantizer */ pixSaveTiled(pixs, pixa, 1.0, 1, SPACE, 0); pixc = pixFixedOctcubeQuant256(pixs, 0); /* no dither */ PixSave32(pixa, pixc, rp); pixc = pixFixedOctcubeQuant256(pixs, 1); /* dither */ PixSave32(pixa, pixc, rp); /* 2-pass octree quantizer */ pixSaveTiled(pixs, pixa, 1.0, 1, SPACE, 0); pixc = pixOctreeColorQuant(pixs, 128, 0); /* no dither */ PixSave32(pixa, pixc, rp); pixc = pixOctreeColorQuant(pixs, 240, 0); /* no dither */ PixSave32(pixa, pixc, rp); pixc = pixOctreeColorQuant(pixs, 128, 1); /* dither */ PixSave32(pixa, pixc, rp); pixc = pixOctreeColorQuant(pixs, 240, 1); /* dither */ PixSave32(pixa, pixc, rp); /* Simple adaptive quantization to 4 or 8 bpp, specifying ncolors */ pixSaveTiled(pixs, pixa, 1.0, 1, SPACE, 0); pixc = pixOctreeQuantNumColors(pixs, 8, 0); /* fixed: 8 colors */ PixSave32(pixa, pixc, rp); pixc = pixOctreeQuantNumColors(pixs, 16, 0); /* fixed: 16 colors */ PixSave32(pixa, pixc, rp); pixc = pixOctreeQuantNumColors(pixs, 64, 0); /* fixed: 64 colors */ PixSave32(pixa, pixc, rp); pixc = pixOctreeQuantNumColors(pixs, 256, 0); /* fixed: 256 colors */ PixSave32(pixa, pixc, rp); /* Quantize to fully populated octree (RGB) at given level */ pixSaveTiled(pixs, pixa, 1.0, 1, SPACE, 0); pixc = pixFixedOctcubeQuantGenRGB(pixs, 2); /* level 2 */ PixSave32(pixa, pixc, rp); pixc = pixFixedOctcubeQuantGenRGB(pixs, 3); /* level 3 */ PixSave32(pixa, pixc, rp); pixc = pixFixedOctcubeQuantGenRGB(pixs, 4); /* level 4 */ PixSave32(pixa, pixc, rp); pixc = pixFixedOctcubeQuantGenRGB(pixs, 5); /* level 5 */ PixSave32(pixa, pixc, rp); /* Generate 32 bpp RGB image with num colors <= 256 */ pixt = pixOctreeQuantNumColors(pixs, 256, 0); /* cmapped version */ pix32 = pixRemoveColormap(pixt, REMOVE_CMAP_BASED_ON_SRC); /* Quantize image with few colors at fixed octree leaf level */ pixSaveTiled(pixt, pixa, 1.0, 1, SPACE, 0); pixc = pixFewColorsOctcubeQuant1(pix32, 2); /* level 2 */ PixSave32(pixa, pixc, rp); pixc = pixFewColorsOctcubeQuant1(pix32, 3); /* level 3 */ PixSave32(pixa, pixc, rp); pixc = pixFewColorsOctcubeQuant1(pix32, 4); /* level 4 */ PixSave32(pixa, pixc, rp); pixc = pixFewColorsOctcubeQuant1(pix32, 5); /* level 5 */ PixSave32(pixa, pixc, rp); /* Quantize image by population */ pixSaveTiled(pixt, pixa, 1.0, 1, SPACE, 0); pixc = pixOctreeQuantByPopulation(pixs, 3, 0); /* level 3, no dither */ PixSave32(pixa, pixc, rp); pixc = pixOctreeQuantByPopulation(pixs, 3, 1); /* level 3, dither */ PixSave32(pixa, pixc, rp); pixc = pixOctreeQuantByPopulation(pixs, 4, 0); /* level 4, no dither */ PixSave32(pixa, pixc, rp); pixc = pixOctreeQuantByPopulation(pixs, 4, 1); /* level 4, dither */ PixSave32(pixa, pixc, rp); /* Mixed color/gray octree quantizer */ pixSaveTiled(pixt, pixa, 1.0, 1, SPACE, 0); pixc = pixOctcubeQuantMixedWithGray(pix32, 8, 64, 10); /* max delta = 10 */ PixSave32(pixa, pixc, rp); pixc = pixOctcubeQuantMixedWithGray(pix32, 8, 64, 30); /* max delta = 30 */ PixSave32(pixa, pixc, rp); pixc = pixOctcubeQuantMixedWithGray(pix32, 8, 64, 50); /* max delta = 50 */ PixSave32(pixa, pixc, rp); /* Run the high-level converter */ pixSaveTiled(pixt, pixa, 1.0, 1, SPACE, 0); pixc = pixConvertRGBToColormap(pix32, 1); PixSave32(pixa, pixc, rp); pixDestroy(&pix32); pixDestroy(&pixt); pixd = pixaDisplay(pixa, 0, 0); pixDisplayWithTitle(pixd, 100, 100, NULL, rp->display); sprintf(buf, "/tmp/regout/disp.%d.jpg", i); pixWrite(buf, pixd, IFF_JFIF_JPEG); pixDestroy(&pixs); pixDestroy(&pixd); pixaDestroy(&pixa); return 0; }
int main(int argc, char **argv) { PIX *pixs, *pixc, *pixd; PIXA *pixa; static char mainName[] = "snapcolortest"; if (argc != 1) return ERROR_INT(" Syntax: snapcolortest", mainName, 1); if ((pixs = pixRead("Leptonica.jpg")) == NULL) return ERROR_INT("pixs not made", mainName, 1); pixa = pixaCreate(0); /* First, snap the color directly on the input rgb image. */ pixSaveTiledOutline(pixs, pixa, 1.0, 1, 25, 2, 32); pixd = pixSnapColor(NULL, pixs, 0xffffff00, LEPTONICA_YELLOW, 30); pixSaveTiledOutline(pixd, pixa, 1.0, 0, 25, 2, 32); pixWrite("/tmp/logo1.jpg", pixd, IFF_JFIF_JPEG); pixDestroy(&pixd); /* Then make a colormapped version and snap the color */ pixd = pixOctreeQuantNumColors(pixs, 250, 0); pixSaveTiledOutline(pixd, pixa, 1.0, 1, 25, 2, 32); pixSnapColor(pixd, pixd, 0xffffff00, LEPTONICA_YELLOW, 30); pixSaveTiledOutline(pixd, pixa, 1.0, 0, 25, 2, 32); pixWrite("/tmp/logo2.png", pixd, IFF_PNG); pixDestroy(&pixd); pixDestroy(&pixs); /* Set the background of the google searchbox to yellow. * The input image is colormapped with all 256 colors used. */ if ((pixs = pixRead("google-searchbox.png")) == NULL) return ERROR_INT("pixs not made", mainName, 1); pixSaveTiledOutline(pixs, pixa, 1.0, 1, 25, 2, 32); pixd = pixSnapColor(NULL, pixs, 0xffffff00, LEPTONICA_YELLOW, 30); pixSaveTiledOutline(pixd, pixa, 1.0, 0, 25, 2, 32); pixWrite("/tmp/logo3.png", pixd, IFF_PNG); pixDestroy(&pixd); pixDestroy(&pixs); /* A couple of more, setting pixels near white to strange colors */ pixs = pixRead("weasel4.11c.png"); pixSaveTiledOutline(pixs, pixa, 1.0, 1, 25, 2, 32); pixd = pixSnapColor(NULL, pixs, 0xfefefe00, 0x80800000, 50); pixSaveTiledOutline(pixd, pixa, 1.0, 0, 25, 2, 32); pixDestroy(&pixs); pixDestroy(&pixd); pixs = pixRead("wyom.jpg"); pixc = pixFixedOctcubeQuant256(pixs, 0); pixSaveTiledOutline(pixc, pixa, 1.0, 1, 25, 2, 32); pixd = pixSnapColor(NULL, pixc, 0xf0f0f000, 0x80008000, 100); pixSaveTiledOutline(pixd, pixa, 1.0, 0, 25, 2, 32); pixDestroy(&pixs); pixDestroy(&pixc); pixDestroy(&pixd); /* --- Display results --- */ pixd = pixaDisplay(pixa, 0, 0); pixDisplay(pixd, 100, 100); pixWrite("/tmp/snap.jpg", pixd, IFF_PNG); pixDestroy(&pixd); pixaDestroy(&pixa); return 0; }