You are looking at historical revision 44818 of this page. It may differ significantly from its current revision.
leptonic
Description
This egg provides a Scheme interface to the leptonica image processing library authored by Dan Bloomberg. The egg offers a subset of the extensive leptonica C-API, focusing on a set of high-level leptonica functions that are likely to be useful to Scheme programmers.
Author
Jules Altfas
Repository
https://codeberg.org/jrapdx/leptonic
Requirements
The egg has these dependencies:
- the leptonica library – https://github.com/DanBloomberg/leptonica, which is dependent on:
- libjpeg – https://sourceforge.net/projects/libjpeg-turbo/
- libtiff – https://gitlab.com/libtiff/libtiff
- libpng – https://libpng.sourceforge.io/index.html
- libz – https://zlib.net/
- libwebp – https://github.com/webmproject/libwebp
- libgif – https://giflib.sourceforge.net
- libopenjp2 – https://github.com/uclouvain/openjpeg
The image libraries are available on many platforms through their respective package systems. Installing from source is an option if one or more are not otherwise available.
Installing
On unix platforms, the egg should install normally with chicken-install -s leptonic, or alternatively, clone/download the repo and run chicken-install -s in the local directory.
On Windows, the leptonica library needs to be installed before installing the egg. Make sure libleptonica-6.dll is in a directory on the exec path. Then chicken-install should compile/install the egg without errors.
Programs using/importing leptonic need to be linked with the leptonica library.
- Install image libraries through the system package manager or from source if not otherwise available.
- Install the leptonica library. (See the leptonica site at http://www.leptonica.org/source/README.html for detailed instructions for compiling from source.)
Using the leptonic egg
The leptonica library abstracts image data into one of several C-structs which are used by functions to read/write image files, perform scaling, morphing, modifying and coverting images. An advantage of this approach is the simplicity and uniformity it provides for library users. libleptonica includes a wealth of high- and low-level functions for these purposes. A selection of the library’s high-level functions are represented in this egg.
The primary C-struct is “Pix” with fields including width, height, depth (1,2,4,8,32 bits/pixel), samples/pixel, xres, yres, colormap, and img-data (array of unsigned-int32). Users should regard Pix and other structures as opaque as the “internals” are handled by the procedures. Most of the Scheme procedures take/return ‘ppix’ (ptr to struct Pix) along with other arguments.
A major benefit of leptonica is that image processing is decoupled from input/output format, greatly simplifying programs that handle image files. A typical usage pattern starts with reading an image file with ‘pix-read’ (or ‘pix-read-FORMAT’), returning a ppix (ptr to Pix). Manipulations are applied and finally, ‘pix-write’ or ‘pix-write-FORMAT’ writes ppix data to an output file.
Leptonic egg api
Format-type procedures
[procedure] n->ftype N- in - N - int, with value 0 to 19.<br />
- returns: symbol, e.g., ’IFF_JFIF_JPEG
- in - TYPE - symbol<br />
- returns: int. (See TABLE.)
TABLE. leptonica image formats
integer | symbol |
---|---|
0 | IFF_UNKNOWN |
1 | IFF_BMP |
2 | IFF_JFIF_JPEG |
3 | IFF_PNG |
4 | IFF_TIFF |
5 | IFF_TIFF_PACKBITS |
6 | IFF_TIFF_RLE |
7 | IFF_TIFF_G3 |
8 | IFF_TIFF_G4 |
9 | IFF_TIFF_LZW |
10 | IFF_TIFF_ZIP |
11 | IFF_PNM |
12 | IFF_PS |
13 | IFF_GIF |
14 | IFF_JP2 |
15 | IFF_WEBP |
16 | IFF_LPDF |
17 | IFF_TIFF_JPEG |
18 | IFF_DEFAULT |
19 | IFF_SPIX |
Foreign types
(define-foreign-type pix (struct Pix)) (define-foreign-type ppix (c-ptr (struct Pix))) (define-foreign-type pixa (struct Pixa)) (define-foreign-type ppixa (c-ptr (struct Pixa))) (define-foreign-type fpix (struct FPix)) ;; float pix (define-foreign-type pfpix (c-ptr (struct FPix))) (define-foreign-type fpixa (struct FPixa)) ;; array of FPix (define-foreign-type pfpixa (c-ptr (struct FPixa)))
Use (include "leptonic-types.scm") to make these available.
Reading image files
[procedure] pix-read FILENAME- in - FILENAME
- returns: ppix or #f on error.
- in - FILENAME - string
- in - PFMT PW PH PBPS PSPP PISCMAP - ptr to unsigned-int32
- Other args are optional, pass #f to skip.
- Optionals, in order: image-format, width, height, bits/sample, samples/pixel, img has colormap?(0=no/1=yes).
(import leptonic) (define-external fmt unsigned-int32) (define-external w unsigned-int32) (define-external h unsigned-int32) (define-external bps unsigned-int32) (define-external spp unsigned-int32) (define-external cmap unsigned-int32) (pix-read-header "img1.jpg" (location fmt) (location w) (location h) (location bps) (location spp) (location cmap)) ;; fmt -> 2, w -> 898, h -> 606, bps -> 8, spp -> 3, cmap -> 0 ;; image is 24bpp (bps * spp)[procedure] pix-get-width PPIX
- in - PPIX
- returns: width as int.
- in - PPIX
- returns: height as int.
- in - FILENAME - string
- returns: format as int.
- in - FILENAME - string
- out - PFMT - ptr to int
- returns: 0 on success, 1 if error/unrecognized format.
(define-external fmt int) (define r (find-file-fmt "file0.png" (location fmt))) ;; r -> 0 (no error), fmt -> 3
Writing image files
[procedure] pix-write FILENAME PPIX FORMAT- in - FILENAME string
- in - PPIX
- in - FORMAT int
- returns: 0 on success, 1 if error.
- in - FILENAME - string
- in - PPIX
- in - QUALITY - int32 - 1 to 100, 75 is default
- in - PROGRESSIVE - int32 - 1=yes, 0=no
- returns: 0 on success, 1 if error.
- in - FILENAME - string
- in - PPIX
- in - GAMMA - float - 0.0 if not defined
- returns: 0 on success, 1 if error.
- in - FILENAME - string
- in - PPIX
- in - QUALITY - int32 - 1 to 100
- in - LOSSLESS - int32 - 1=yes, 0=no
- returns: 0 on success, 1 if error.
- in - PPIXD - #f or PPIX (in-place: pix-copy ppix ppix)
- in - PPIX
- returns: copy of ppix
Deallocating image data
[procedure] pix-destroy PTR-TO-PPIX- in - PTR-TO-PPIX - ptr ppix
- returns: no return value
(define-external ppx ppix (pix-read "img0.jpg")) ... (pix-destroy (location ppx))[procedure] pix-free-data PPIX
- in - PPIX
- (Deallocates data member but not Pix structure itself, use pix-destroy PPIX when PPIX no longer needed.)
- returns: no return value
Scaling
[procedure] pix-scale PPIX SCALEX SCALEY- in - PPIX - input
- in - SCALEX, SCALEY - float values.
- ''(Uses: sharpening for scale factors 0.2-0.7,
- ‘linear interpolation’ for factors 0.7-1.4, and
- no sharpening when scale factors > 1.4.)''
- returns: scaled ppix on success, #f on error.
- in - PPIX
- in - SCALEX/Y, SHARPFRAC - flaot.
- in - SHARPWIDTH - int, 1 or 2.
- returns: modified ppix.
- ''(When max scalex/y is < 0.2, no sharpening applied.
- Between .2 and 1.4, sharpen according to input values.
- With scalex/y > 1.4, no sharpening is applied.
- For precise control, call pix-scale-general with sharpfrac 0.0 followed by call to pix-unsharp-mask.)''
(define-external ppix0 ppix (pix-read "img0.webp")) (define scaledpix (pix-scale-general ppix0 1.2 1.2 0.25 1)) ... (define res (pix-write scaledpix "img0-1.2x.webp" scaledpix 15)) ;; res -> 0[procedure] pix-scale-smooth PPIX SCALEX SCALEY
- in - PPIX
- in - SCALEX/Y - float.
- (Scale factors MUST BE <0.7.)
- returns: modified ppix, or #f on error.
- in - PPIX
- in - WIDTH/HEIGHT - int32 - pixels.
- (To preserve aspect ratio, set width 0, use height as target. Or set height to 0 to use width as target.)
- returns: modified ppix or #f on error.
Unsharp mask
[procedure] pix-unsharp-mask PPIX SMOOTHING AMOUNT- in - PPIX
- in - SMOOTHING - filter is odd int such as 3, 5, 7. Input is halfwidth = (size - 1)/2, i.e., 1, 2, 3.
- in - AMOUNT is float, typically in range 0.2 to 0.7.
- returns: modified ppix.
- in - PPIX
- in - HALFWIDTH - int, 1 or 2
- in - AMOUNT = float, 0.2 to 0.7
- in - DIRECTION - int, horz: 1, vert: 2, both: 3
- returns: modified ppix.
Pixel data input/output
[procedure] pix-create WIDTH HEIGHT DEPTH- in - WIDTH/HEIGHT - int32, in pixels.
- in - DEPTH - must be 1, 2, 4, 8, or 32
- (Pix->data is ptr to unsigned-int32, array length = wh, elements initialized to 0.)*
- returns: ppix on success, #f on error.
- in - PPIX
- (Returned data-array remains “owned” by ppix, array modified in place.)
- returns: ptr to unsigned-int32 if successful, #f on error.
- in - PPIX
- (Unlike pix-get-data, returned value is ptr to newly alloc copy of ppix->data. ppix->data is set to NULL if ppix->refcount == 1.)
- returns: ptr to unsigned-int32 on success, #f on error.
- in - PPIX
- in - DATAPTR - ptr to unsigned-int32
- returns: 0 if successful, 1 on error.
- (Use pix-free-data prior to setting ppix data.)
- in - PPIX
- in - X, Y - int32 - raster position
- out - PTR-PIXVAL - ptr to unsigned-int32
- returns: 0 on success, 1 on error
- in - PPIX
- in - X, Y - int32 - raster position
- in - PIXEL-VALUE - unsigned-int32
- returns: 0 on success, 1 on error
- in - PPIX
- in - COLOR - int32, one of COLOR_RED, COLOR_GREEN, COLOR_BLUE
- returns: ppix with data set to COLOR component, #f on error.
- in - a PIXEL - unsigned-int32
- in - PRED, PGREEN, PBLUE - optional, ptr to int32 or #f
- returns: no return value.
- in - PPIX
- in - ROW - int32
- in - PR, PG, PB - ptr to unsigned-byte, array length = image width
- returns: 0 if success, 1 on error.
(import chicken.number-vector leptonic) (define red (make-u8vector img-width)) (define green (make-u8vector img-width)) (define blue (make-u8vector img-width)) (define r (pix-get-rgb-line ppix row (location red) (locaton green) (location blue))) (if (zero? r) ;; use red, green, blue vectors ... ;; handle error)[procedure] pix-get-raster-data PPIX PUBYTE PNBYTES
- in - PPIX
- out - PUBYTE - ptr to unsigned-byte, array-length = w * h * 3
- out - PNBYTES - ptr to size_t
- returns: 0 on success, 1 if error.
Image manipulation
[procedure] pix-modify-sat PPIXD PPIX SAT- in - PPIXD - destination ppix, may be set to #f
- in - PPIX
- in - SAT - float - from -1.0 to 1.0
- returns: modified ppix, or #f on error
- in - PPIXD - may be #f
- in - PPIX
- returns: - inverted ppix or #f on error
- in - PPIXD - may be #f
- in - PPIX0, PPIX1 - image data to be “anded”
- returns: - PPIX0 AND PPIX1, or #f on error
- in - PPIXD - #f
- in - PPIX0, PPIX1 - image data to be “ored”
- returns: - PPIX0 OR PPIX1, or #f on error
- in - PPIXD - #f
- in - PPIX0, PPIX1 - image data to be “xored”
- returns: - PPIX0 XOR PPIX1, or #f on error
- in - PPIX
- in - RFRAC, GFRAC, BFRAC - float - fractional amount of change per channel
- returns: modified ppix or #f on error.
- in- PPIXD - dest - #f or PPIX (use ‘pix-contrast PPIX PPIX …’)
- in - PPIX
- in - FACTOR - amount, 0.0 to 1.0
- returns: modified ppix or #f if error.
- in - PPIXD - #f or PPIX
- in - PPIX
- in - FACTOR - amount -1.0 to 1.0
- returns: modified ppix or #f if error.
- in - PPIXD - #f or PPIX
- in - PPIX
- in - FACTOR - amount -1.0 to 1.0 (1.0/-1.0 == 360 degrees, no hue change)
- returns: modified ppix or #f if error.
- in - PPIXD - #f or PPIX
- in - PPIX
- in - FRAC - 0.0 to 1.0 “equalization movement of pixels”, 1.0 == complete.
- in - SUBSAMPLE - factor > 1 => reduced computation
- returns: modified ppix or #f if error.
- in - PPIXD - #f or PPIX (in-place modification, (pix-gamma PPIX PPIX ..) )
- in - PPIX
- in - GAMMA - 1.0, no change, <1.0 darker, >1.0 lighter
- in - M* in - MIN usually >=0, but may be < 0–black will be gray.
- in - MAX - MAX usually <= 255, but may be > 255, then whites are gray…
- returns: modified ppix or #f if error.
- in - PPIX
- returns: ppix with alpha removed, or #f on error.
- in - PPIXD - #f or same as PPIX
- in - PPIX
- in - SRCVAL - color specified as 0xrrggbb00
- in - DSTVAL - color specified as 0xrrggbb00
- returns: modified ppix or #f if error.
- in - PPIX - 8bit (grayscale)
- in - PIXEL - 32bit color spec, e.g., 0xrrggbb00
- in - CMAP? - add colormap, 0 or 1
- returns: modified ppix or #f if error.
- in - PPIX
- in - SPATIAL - stddev of gaussian kernel, pixels, >0.5
- in - RANGE - stddev of gaussian range kernel, >5.0, typically 50.0
- in - NCOMPS - intermediate sums, 4..30
- in - REDUCTION - 1, 2, 4
- returns: modified ppix or #f if error.
- in - PPIX
- in - ZBEND - int - horz sep (in px) red/cyan left/right sides
- in - ZSHIFTT - int
- Push top of image plane away (>0) or towards (<0) viewer
- in - ZSHIFTB - int - push bottom of image away or towards viewer
- in - YBENDT - int -
- Param for displacement right/left edge, y= ybendt*(2x/w-1)^2
- in - RLEFT - int - 1 to put red filter on left, 0 otherwise
- returns: modified ppix or #f on error.
- in - PPIXD - may be #f or same as PPIX
- in - PPIX1 - “blendee”
- in - PPIX2 - “blender”, usually smaller area than PPIX1
- in - X, Y - origin of PPIX2 relative to origin of PPIX1 (pixels)
- in - FRACT - blending fraction
- in - TRANSPARENT - 1: use transparency, 0: don’t use transparency.
- in - TRANSPIX - color in PPIX2 to be made transparent, typically 0 or 0xffffff00
- returns: blended ppix or #f on error.
Image analysis
[procedure] pix-sizes-equal PPIX1 PPIX2- in - PPIX1 PPIX2 - ppix to compare * returns: 1 if {h,w,d} the same, 0 if not.
- in - PPIX
- in - PPIXM - (optional) 1bit mask of area to measure, may be #f
- in - X Y - UL coords of mask relative to PPIX - ignored if PPIXM is #f
- in - FACTOR - subsampling factor 1, 2, 4
- out - PVAL - ptr to unsigned-int - avg pixel val
- returns: 0 if “OK”, 1 on error.
- in - PPIX1, PPIX2 - image data to compare
- in - CMPTYPE - subtract: 2, abs-diff: 3
- in - PLOT - plot type, use 0 for no plot.
- out - PSAME PDIFF PRMSDIFF PPIXPTR - these are optional, use #f to skip.
- PSAME - ptr to int32 - (PSAME = 1 if pixel values identical)
- PDIFF/PRMSDIFF - ptr to float - (PDIFF: avg diff, PRMS: rms of diff)
- PPIXDIFF - ptr to ppix - 8bpp (grayscale) - pixel values set to pixel diff
- returns: 0 if “OK”, 1 if error.
- in - PPIX
- in - RREF GREF BREF - int32 - reference values for red,green,blue component.
- RREF/GREF/BREF must all be 0 or all not 0. When not 0, ref values describe an unbalanced white point, or mean color of background of scanned images. Set to 0 to turn off color transforms.
- in - MINGRAY - int32
- Pixels less than mingray are set to 0,0,0. set mingray to 0 to turn off filtering dark pixels.
- out - RCONT GCONT BCONT - ptr to ppix - (optional, set to #f if unused)
- If used, filled with R/G/B 8bpp ppix corresponding to component color content.
- returns: 0 if “OK”, 1 on error.
(import scheme.base leptonic) (include "leptonic-types.scm") (define-external imgpix ppix (pix-read "myimage.jpg")) (define-external rcont ppix) (define-external gcont ppix) (define-external bcont ppix) (define r (pix-color-content imgpix 0 0 0 20 (location rcont) (location gcont) (location bcont))) (if (zero? r) (begin ;; -- use the ppixs: rcont, gcont, bcont -- (pix-destroy (location imgpix)) (pix-destroy (location rcont)) (pix-destroy (location gcont)) (pix-destroy (location bcont))) ;; -- handle error --)[procedure] pix-color-fraction PPIX DARKTHR LIGHTTHR DIFFTHR FACTOR PIXFRAC COLORFRAC
- in - PPIX - 32bpp
- in - DARKTHR - int32
- Threshold near black. Pixels below aren’t included in stats. Typical: 20
- in - LIGHTTHR - int32
- Threshold near white. Pixels above aren’t included in stats. Typical: 244
- in - DIFFTHR - int32
- Threshold for max diff between R/G/B values. When diff is less, pixel is considered insufficiently colorful. Typical: 60
- in - FACTOR - int32 - Subsampling factor, 1, 2, 4. 1 is no subsampling.
- out - PIXFRAC - ptr to float - optional, use #f to skip.
- Fraction of pixels considered for color content.
- out - COLORFRAC - ptr to float - optional, use #f to skip.
- Fraction of pixels meeting criterion for sufficient color. 0.0 on error.
- returns: 0 if “OK”, 1 on error.
- in - PPIX - 32bpp or 8bpp w/cmap
- in - RREF GREF BREF - int32 - Reference values for red, green, blue components, representing unbalanced white or avg background color of a scanned image. Image colors are adjusted according to the ref values. Set all to 0 to skip this adjustment.
- in - TYPE - one of intermediate-diff: 1, avg-max-diff: 2, max_diff: 3
- returns: 8bpp ppix (amt of color in each src pixel) or #f on error.
Effects
[procedure] pix-clean-image PPIX CONTRAST ROTATE SCALE OPEN-SIZE- in - PPIX
- in - CONTRAST - int32 - 1 (lightest) to 10 (darkest)
- in - ROTATE - int32 - 0,1,2,3 (0,90,180,270 degrees cw)
- in - SCALE - int32 - 1 or 2 (for 2X upscaling)
- in - OPEN-SIZE - int32 - size for noise removal (0/1-none, 2,3 to use)
- returns: cleaned ppix or #f if error.
- in - WIDTH - int32 - image width
- in - HEIGHT - int32 - image height
- in - X - int32 - x start of maze
- in - Y - int32 - y start of maze
- in - SIDEWALL - float - probability of wall to side of direction
- in - AHEAD - float - probability of wall drawn ahead of direction
- (Generates binary (monochrome) maze)
- returns: ppix or #f on error.
(import scheme.base chicken.foreign leptonic) (include "leptonic-types.scm") ;; generate maze, 100x75px, starts at x=5,y=70px (define-external maze ppix (gen-bin-maze 100 75 5 70 .52 .48)) (pix-write "maze.jpg" maze 2) (pix-destroy (location maze))[procedure] pix-sobel-edge-filter PPIX ORIENTATION
- in - PPIX - 8bpp * in - ORIENTATION - int32
- edges: horizontal: 0, vertical: 1, all: 2.
- returns: 8bpp ppix or #f if error.
Dithering
[procedure] pix-dither-2bpp PPIX CMAP?- in - PPIX - 8bpp/graymap
- in - CMAP? - generate colormap? 0=no, 1=yes
- Dithers to equally spaced gray values at 0, 85, 170, 255.
- returns: dithered ppix or #f if error.
- in - PPIX - 8bpp/graymap
- in - LOWCLIP - lower clipping point, should be 0 or a small number.
- in - UPCLIP - upper clipping point, should be 255 or slightly less.
- in - CMAP? - generate colormap, 0 or 1.
- returns: dithered ppix or #f if error.
- in - PPIX - 8bpp/grayscale image.
- returns: dithered ppix or #f if error.
- in - PPIX - 8bpp * in - LOWCLIP - lower clipping point, should be 0 or a small number.
- in - UPCLIP - upper clipping point, should be 255 or slightly less.
- returns: dithered ppix or #f if error.
Threshold
[procedure] pix-threshold-to-binary PPIX THRESH- in - PPIX - 4 or 8bpp
- in - THRESH - if src pixel is < THRESH, dest is 1, else dest is 0. (Max pixel value for 8bpp == 255, 4bpp == 15.)
- returns: dithered 1bpp ppix or #f on error.
- in - PPIX - 8bpp
- in - NLEVELS - 2..4 equally spaced levels in output ppix
- in - CMAP? - 0/1
- returns: dithered 2bpp ppix or #f on error.
- in - PPIX - 8bpp
- in - NLEVELS - 2..16 equally spaced levels in output
- in - CMAP? - 0/1
- returns: dithered 4bpp ppix or #f on error.
- in - PPIX - 8bpp
- in - NLEVELS - 2..256 equally spaced levels in output
- in - CMAP? - 0/1
- returns: dithered 8bpp ppix or #f on error.
Conversion
[procedure] pix-RGB-to-gray PPIX RWT GWT BWT- in - PPIX - 32bpp RGB image
- in - RWT GWT BWT - float values, weights should add up to 1.
- returns: 8bpp ppix or #f if error.
- in - PPIX - 32bpp RGB image
- returns: 8bpp ppix or #f if error.
<procedure>pix->32bit PPIX </procedure>
- in - PPIX - 1, 2, 4, 8, 16, 24 or 32 bpp
- returns: ppix or #f on error.
- in - PPIX - 1, 8 bpp
- returns: ppix or #f on error.
- in - PPIX - 1, 2, 4, 8, 16, 24 or 32 bpp
- returns: ppix or #f on error.
- in - PPIX - 1, 2, 4, 8, 24 or 32 bpp
- returns: ppix or #f on error.
- in - PPIX - 1, 2, 4, 8, 24 or 32 bpp
- returns: ppix or #f on error.
- in - PPIX - 1, 2, 4, 8, 16, 24 or 32 bpp
- returns: ppix or #f on error.
- in - PPIXD - #f
- in - PPIX
- returns: converted ppix or #f on error.
- in - PPIXD - #f
- in - PPIX
- returns: converted ppix or #f on error.
- in - PPIX
- returns: converted ppix or #f on error.
- in - PPIXD - #f
- in - PPIX
- returns: converted ppix or #f on error.
- in - PPIXD - #f
- in - PPIX
- returns: converted ppix or #f on error.
- in - PPIX
- returns: converted ppix or #f on error.
- in - PPIX
- returns: converted ppix or #f on error.
- in - PPIX
- returns: converted ppix or #f on error.
- in - ppix
- returns: converted PFPIXA or #f on error.
- in - PFPIXA (Lab)
- returns: converted PPIX or #f on error.
- in - PFPIXA (Lab)
- returns: converted PFPIXA or #f on error.
- in - PFPIXA (XYZ)
- returns: converted PFPIXA or #f on error.
- in - PFPIXA (XYZ)
- returns: converted PPIX or #f on error.
Error messages
[procedure] set-msg-level LEVEL- in - LEVEL int32 - 1:all 2:debug+ 3:info+ 4:warn+ 5:error+ 6:none
- returns: - old level int32
Serializing data 32bit to 8bit, 8bit to 32bit
These routines are not from leptonica, but provided to facilitate conversion of 32 bpp data to 8 bpp arrays (in RGB order) and vice versa.
[procedure] u32->u8''3 PTR32 LEN PTR8*- in - PTR32 - ptr to unsigned-int32
- in - LEN - int - length of data - (image width * height)
- out - PTR8 - ptr to unsigned-byte
- returns: number of 32bit pixels (should be equal to LEN)
- in - PTR8 - ptr to unsigned-byte
- in - LEN - int - length of data (image width * height)
- out - PTR32 - ptr to unsigned-int32
- returns: number of 32bit pixels (should be equal to LEN)
(import scheme.base chicken.foreign chicken.number-vector leptonic) (include "leptonic-types.scm") (define-external ppx0 ppix (pix-read "input.png")) (define data0 (pix-get-data ppx0)) (define w (pix-get-width ppx0)) (define h (pix-get-height ppx0)) (define len (* w h)) (define v8 (make-u8vector (* len 3) 0)) (u32->u8*3 data0 len (location v8)) ;; ... modify v8 ... (define-external ppx1 ppix (pix-create w h 32)) (define data1 (pix-get-data ppx1)) (u8*3->u32 (location v8) len data1) (define fmt (get-implied-fmt "output.png")) (pix-write "output.png" ppx1 fmt) (pix-destroy (location ppx0)) (pix-destroy (location ppx1))
Note: if u8vector ‘v8’ is not modified, then output to data1 (in u8*3->u32), will be identical to the input data in data0. IOW “output.png” will be a copy of “input.png”. Comparing the two image files serves as a test of the procedures: if everything is working properly, the image files should be completely indistinguishable.
Versions
- 0.1.0 (initial release)