Overview

PaperSketchEffectLib transforms an image to look like a pencil sketch on paper, wrapping the FireMonkey TPaperSketchEffect component. The effect extracts edges and renders them as hand-drawn strokes against a light background, creating an artistic sketch appearance with adjustable brush size.

PropertyDetails
LibraryPaperSketchEffectLib
Prefixpapersketch_
WrapsTPaperSketchEffect
Functions12
TypeVisual effect (artistic)
CategoryCountDescription
Creation / Destruction2Create and free effect
Brush Size2Get/set stroke thickness
Effect Control4Enabled and trigger get/set
Error Handling4Error codes and messages
✏ Artistic Filter: This effect is perfect for creating sketch-style art from photographs, building "before and after" comparisons, or adding an artistic touch to image galleries in your applets.

PaperSketch vs PencilStroke

Plan9Basic offers two similar sketch effects. Both use a BrushSize property, but produce different visual results:

FeaturePaperSketchPencilStroke
Visual stylePencil on paper — lighter, softerBold pencil strokes — darker, more defined
BackgroundLight paper-like appearanceDarker, more contrast
Edge detectionSofter edgesSharper, more pronounced edges
Best forSoft sketches, watercolor feelBold drawings, comic-style art
ParametersBrushSize onlyBrushSize only

Cross-Platform Support

PlatformSupport
Windows✅ Full support
Linux✅ Full support
Android✅ Full support

Creation & Destruction

papersketch#(parent#)

Creates a new paper sketch effect attached to the specified visual control.

ParameterTypeDescription
parent#PointerTarget visual control (e.g., image)
ReturnsPointerEffect handle, or 0 on failure

papersketch_free(effect#)

Destroys the effect and releases associated resources.

╯ create-sketch.bas
let sketch# = papersketch#(img#)
papersketch_brushsize#(sketch#, 1.5)

' Clean up when done
papersketch_free(sketch#)

Error Handling

FunctionSignatureDescription
papersketch_error()papersketch_error@Returns last error code (0 = none)
papersketch_errormsg$()papersketch_errormsg$@Returns last error message
papersketch_strerror$(code)papersketch_strerror$@nConverts error code to text
papersketch_clearerror()papersketch_clearerror@Clears the error state

Brush Size

Controls the thickness of the sketch strokes. Smaller values produce finer, more detailed sketches; larger values create bolder, more pronounced strokes.

FunctionSignatureDescription
papersketch_brushsize#(effect#, value)papersketch_brushsize#@#nSets brush/stroke size
papersketch_brushsize(effect#)papersketch_brushsize@#Gets brush size
ValueDescriptionUse Case
0.1–0.5Very fine strokesDetailed, delicate sketches
0.5–1.0Fine to medium strokesGeneral purpose sketching
1.0–2.0Medium strokes (default range)Balanced sketch appearance
2.0–5.0Bold strokesPronounced, artistic look

Effect Control

FunctionSignatureDescription
papersketch_enabled#(effect#, value)papersketch_enabled#@#nEnable (1) or disable (0)
papersketch_enabled(effect#)papersketch_enabled@#Gets enabled state
papersketch_trigger#(effect#, trigger$)papersketch_trigger#@#$Sets trigger string
papersketch_trigger$(effect#)papersketch_trigger$@#Gets trigger string

Complete Examples

Example 1: Basic Paper Sketch

╯ basic-sketch.bas
let frm# = Pointer#(0)
let img# = Pointer#(0)
let sketch# = Pointer#(0)

frm# = form#("Paper Sketch Demo", 400, 350)

img# = image#(frm#)
image_bounds#(img#, 100, 30, 200, 150)
image_load#(img#, "https://picsum.photos/200/150")

' Apply paper sketch effect
sketch# = papersketch#(img#)
papersketch_brushsize#(sketch#, 1)

form_show(frm#)

Example 2: Adjustable Brush Size

╯ adjustable-sketch.bas
let frm# = Pointer#(0)
let img# = Pointer#(0)
let sketch# = Pointer#(0)
let trkBrush# = Pointer#(0)
let lblBrush# = Pointer#(0)

frm# = form#("Sketch Brush Control", 450, 400)

img# = image#(frm#)
image_bounds#(img#, 125, 30, 200, 150)
image_load#(img#, "https://picsum.photos/200/150")

sketch# = papersketch#(img#)
papersketch_brushsize#(sketch#, 1)

' Brush size slider
lblBrush# = label#(frm#, "Brush Size: 1.0", 160, 200)
trkBrush# = trackbar#(frm#)
trackbar_bounds#(trkBrush#, 50, 230, 350, 30)
trackbar_max#(trkBrush#, 50)
trackbar_value#(trkBrush#, 10)
trackbar_onchange#(trkBrush#, "OnBrushChange")

form_show(frm#)

function OnBrushChange(sender#) local b
  let b = trackbar_value(trkBrush#) / 10
  if b < 0.1 then
    b = 0.1
  endif
  papersketch_brushsize#(sketch#, b)
  label_text#(lblBrush#, "Brush Size: " + stri$(b, 1))
endfunction

Example 3: Compare Original and Sketch

╯ sketch-comparison.bas
let frm# = Pointer#(0)
let img1# = Pointer#(0)
let img2# = Pointer#(0)
let sketch# = Pointer#(0)

frm# = form#("Sketch Comparison", 500, 350)

' Original image
img1# = image#(frm#)
image_bounds#(img1#, 50, 30, 180, 135)
image_load#(img1#, "https://picsum.photos/180/135")
let lbl1# = label#(frm#, "Original", 110, 175)

' Paper sketch version
img2# = image#(frm#)
image_bounds#(img2#, 270, 30, 180, 135)
image_load#(img2#, "https://picsum.photos/180/135")
sketch# = papersketch#(img2#)
papersketch_brushsize#(sketch#, 1.5)
let lbl2# = label#(frm#, "Paper Sketch", 310, 175)

form_show(frm#)

Best Practices

PracticeWhy
Use images with clear edges and contrastEdge detection works best with well-defined features
Start with BrushSize 1.0Good default — adjust up for bolder strokes, down for finer detail
Clamp minimum to 0.1Very small values may produce minimal visible effect
Combine with Monochrome for pre-processingConvert to grayscale first for consistent sketch results
Use side-by-side comparisonsShow original and sketch together for maximum visual impact

Quick Reference

FunctionSignatureDescription
CREATION & DESTRUCTION
papersketch#(parent#)papersketch#@#Create effect
papersketch_free(effect#)papersketch_free@#Destroy effect
BRUSH SIZE
papersketch_brushsize#(effect#, value)papersketch_brushsize#@#nSet brush size
papersketch_brushsize(effect#)papersketch_brushsize@#Get brush size
EFFECT CONTROL
papersketch_enabled#(effect#, value)papersketch_enabled#@#nEnable/disable
papersketch_enabled(effect#)papersketch_enabled@#Get enabled state
papersketch_trigger#(effect#, trigger$)papersketch_trigger#@#$Set trigger
papersketch_trigger$(effect#)papersketch_trigger$@#Get trigger
ERROR HANDLING
papersketch_error()papersketch_error@Last error code
papersketch_errormsg$()papersketch_errormsg$@Last error message
papersketch_strerror$(code)papersketch_strerror$@nCode to text
papersketch_clearerror()papersketch_clearerror@Clear error state

See Also

LibraryDescription
PencilStrokeEffectLibBold pencil stroke effect
EmbossEffectLib3D embossed look
MonochromeEffectLibGrayscale conversion
ToonEffectLibCartoon/cel-shaded effect