Hey visualstation,
This isn’t specifically relevant to the transition question, but, perhaps helpful in general.
I’ve written some code to use most of the filters in my app on a user taken photo, and have a utility module that at the very least provides a data definition that can be used to work with the filters (via a UI) in an app. In my app I let the user manipulate slider bars, so there’s a couple functions in here to convert filter values to slider bar values (percent) as well. Anyways, just something I cobbled together that might provide some ideas / a base of filter data values to work with. Don’t intend to make it truly generic, or support it, or anything else… It’s “Popeye” code: it is what it is. Hopefully there’s something helpful.
Best wishes.
[/lua]
–
– filterutils.lua
– localNet filter definitions and helper functions
module(…, package.seeall)
mojoData = require(“mojodata”) – app global data module, where user edited filter data will be stored (as they change filter values, app will remember last settings)
utils = require(“utils”) – Some misc. App utility functions
– FILTER DICTIONARY… Default values / ranges for filters (including some UI info per filter)
filterDefs = {}
filterDefs[#filterDefs+1] = {
effect = “brightness”,
title = “Brightness”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“intensity”,
},
defaults = {
{ min = 0.0, max = 0.7, default = 0.2 },
– { min = 0, max = 1, default = 0.5 },
}
}
filterDefs[#filterDefs+1] = {
effect = “contrast”,
title = “Contrast”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“contrast”,
},
defaults = {
{ min = 0.1, max = 4, default = 2 },
}
}
filterDefs[#filterDefs+1] = { – ok to use
effect = “saturate”,
title = “Saturate”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“intensity”,
},
defaults = {
{ min = 0.0, max = 8, default = 4.0 },
}
}
filterDefs[#filterDefs+1] = { – dont bother
effect = “hue”,
title = “Hue”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“angle”,
},
defaults = {
{ min = 0, max = 360, default = 180 },
}
}
filterDefs[#filterDefs+1] = { – looks good
effect = “vignette”,
title = “Vignette”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
isEditable = true,
audioFile = 1,
params = {
“radius”,
},
defaults = {
{ min = 0, max = 1, default = 0.1 },
}
}
filterDefs[#filterDefs+1] = { – looks good
effect = “grayscale”,
title = “Grayscale”, --UI name
isEditable = false,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {},
defaults = {}
}
filterDefs[#filterDefs+1] = { – looks good
effect = “sepia”,
title = “Sepia”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“intensity”,
},
defaults = {
{ min = 0, max = 1, default = 0.95 },
}
}
filterDefs[#filterDefs+1] = { – works good
effect = “emboss”,
title = “Emboss”, --UI name
isEditable = true,
thumbDistorts = true, – some effects, thumbnail looks dif than large size…
audioFile = 2,
params = {
“intensity”,
},
defaults = {
{ min = 0, max = 4, default = 1 },
}
}
filterDefs[#filterDefs+1] = { – looks ok, a lkittle funky, but not bad
effect = “posterize”,
title = “Posterize”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 3,
params = {
“colorsPerChannel”,
},
defaults = {
– { min = 2, max = -1, default = 4 },
{ min = 2, max = 15, default = 3 },
}
}
filterDefs[#filterDefs+1] = { – looks good
effect = “colorChannelOffset”,
title = “Color Offset”, --UI name
isEditable = true,
thumbDistorts = true, – some effects, thumbnail looks dif than large size…
audioFile = 3,
params = {
“yTexels”,
“xTexels”,
},
defaults = {
{ min = 0, max = 100, default = 50 }, – was -1
{ min = 0, max = 100, default = 50 }, – was -1
}
}
filterDefs[#filterDefs+1] = {
effect = “bloom”,
title = “Bloom”, --UI name
isEditable = false,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
},
defaults = {
}
}
filterDefs[#filterDefs+1] = { – looks ok, funky
effect = “invert”,
title = “Invert”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 3,
params = {},
isEditable = false,
defaults = {}
}
filterDefs[#filterDefs+1] = { – works good
effect = “levels”,
title = “Levels”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 2,
params = {
“gamma”,
“white”,
“black”,
},
defaults = {
{ min = 1, max = 20, default = 1.06 },
{ min = 0, max = 10, default = 0.9 }, – 200
{ min = 0, max = 10, default = 0.1 }, – 100
– { min = 0, max = 1, default = 1.06 },
– { min = 0, max = 255, default = 215/255 },
– { min = 0, max = 255, default = 144/255 },
}
}
filterDefs[#filterDefs+1] = { – looks 50’s ish
effect = “monotone”,
title = “Monotone”, --UI name
isEditable = false,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“r”,
“g”,
“b”,
“a”,
},
defaults = {
{ min = 0, max = 1, default = 0.4 },
{ min = 0, max = 1, default = 0.4 },
{ min = 0, max = 1, default = 0.4 },
{ min = 0, max = 1, default = 1 },
}
}
filterDefs[#filterDefs+1] = { – cool
effect = “pixelate”,
title = “Pixelate”, --UI name
isEditable = true,
thumbDistorts = true, – some effects, thumbnail looks dif than large size…
audioFile = 2,
params = {
“numPixels”,
},
defaults = {
– { min = 0, max = -1, default = 4 },
{ min = 8, max = 80, default = 16 },
}
}
filterDefs[#filterDefs+1] = { – works, but not so great
effect = “bulge”,
title = “Bulge”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 3,
params = {
“intensity”,
},
defaults = {
{ min = 0.1, max = 2.5, default = 1.7 },
}
}
filterDefs[#filterDefs+1] = { – ok, funky, but ok
effect = “sobel”,
title = “Sobel”, --UI name
isEditable = false,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 3,
params = {},
defaults = {}
}
filterDefs[#filterDefs+1] = { – looks good
effect = “swirl”,
title = “Swirl”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 3,
params = {
“intensity”,
},
defaults = {
{ min = 0, max = 2, default = 1.0 },
}
}
filterDefs[#filterDefs+1] = { – weird, probably dont use
effect = “straighten”,
title = “Rotate”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 2,
params = {
“angle”,
“width”,
“height”,
},
defaults = {
{ min = 0, max = 360, default = 45 },
{ min = 1, max = -1, default = 1 },
{ min = 1, max = -1, default = 1 },
}
}
filterDefs[#filterDefs+1] = { – works good
effect = “desaturate”,
title = “Desaturate”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“intensity”,
},
defaults = {
{ min = 0, max = 1, default = 0.35 },
}
}
filterDefs[#filterDefs+1] = { – cool, like the frostedglass
effect = “opTile”,
title = “OpTile”, --UI name
isEditable = true,
thumbDistorts = true, – some effects, thumbnail looks dif than large size…
audioFile = 2,
params = {
“numPixels”,
“scale”,
“angle”,
},
defaults = {
{ min = 30, max = 160, default = 40 },
{ min = 0, max = 50, default = 2.8 }, – was -1
{ min = 0, max = 360, default = 0 },
}
}
filterDefs[#filterDefs+1] = { – looks good, no t supported older droids tho
effect = “zoomBlur”,
title = “Zoom Blur”, --UI name
isEditable = true,
thumbDistorts = true, – some effects, thumbnail looks dif than large size…
audioFile = 3,
params = {
“intensity”,
“u”,
“v”,
},
defaults = {
{ min = 0.2, max = 4, default = 1.0 },
{ min = 0, max = 1, default = 0.5 },
{ min = 0, max = 1, default = 0.5 },
}
}
filterDefs[#filterDefs+1] = { – touchy, dont bother
effect = “exposure”,
title = “Exposure”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 2,
params = {
“exposure”,
},
defaults = {
{ min = -3, max = 3, default = 1 },
}
}
filterDefs[#filterDefs+1] = { – looks good, not older devices
effect = “scatter”,
title = “Scatter”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 3,
params = {
“intensity”,
},
defaults = {
{ min = 0, max = 1, default = 0.5 },
}
}
filterDefs[#filterDefs+1] = { – is ok, not older devices
effect = “sharpenLuminance”,
title = “Sharpen Lum”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“sharpness”,
},
defaults = {
{ min = 0, max = 1, default = 0.4 },
}
}
filterDefs[#filterDefs+1] = {
effect = “woodCut”,
title = “WoodCut”, --UI name
thumbDistorts = true, – some effects, thumbnail looks dif than large size…
isEditable = true,
audioFile = 2,
params = {
“intensity”,
},
defaults = {
{ min = 0, max = 1, default = 0.5 },
}
}
filterDefs[#filterDefs+1] = { – boring?
effect = “median”,
isEditable = false,
title = “Median”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {},
defaults = {}
}
– unused filters
–[[
filterDefs[#filterDefs+1] = { – dynamic effect
effect = “iris”,
title = “Iris”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“aperture”,
“center”,
“aspectRatio”,
“smoothness”,
},
defaults = {
{ min = 0, max = 1, default = 0 },
{ min = { 0, 0 }, max = { 1, 1 }, default = { .5, .5 } },
{ min = 0, max = -1, default = 1 },
{ min = 0, max = 1, default = 0 },
}
}
filterDefs[#filterDefs+1] = { – no good, doesnt work…
effect = “crosshatch”,
title = “Crosshatch”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“grain”,
},
defaults = {
{ min = 0, max = 1, default = 0 },
}
}
filterDefs[#filterDefs+1] = { – ok, but kinda ugly
effect = “duotone”,
title = “Duotone”, --UI name
isEditable = false,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“darkColor”,
“lightColor”,
},
defaults = {
{ min = {0,0,0,0}, max = {1,1,1,1}, default = {0,0,0.5,1} },
{ min = {0,0,0,0}, max = {1,1,1,1}, default = {1,0,0,1} },
}
}
filterDefs[#filterDefs+1] = { – ? didnt work first pass?
effect = “chromaKey”,
title = “ChromaKey”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“sensitivity”,
“smoothing”,
“color”,
},
defaults = {
{ min = 0, max = 1, default = 0.4 },
{ min = 0, max = 1, default = 0.1 },
{ min = {0,0,0,0}, max = {1,1,1,1}, default = {1,1,1,1} },
}
}
filterDefs[#filterDefs+1] = { – dynamic, dont use
effect = “crystallize”,
title = “Crystallize”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“numTiles”,
},
defaults = {
{ min = 2, max = 256, default = 16 },
}
filterDefs[#filterDefs+1] = { – not bad, not older devices though
effect = “polkaDots”,
title = “Polka Dots”, --UI name
isEditable = true,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
audioFile = 1,
params = {
“numPixels”,
“dotRadius”,
},
defaults = {
{ min = 4, max = 50, default = 6 },
{ min = 0, max = 1, default = 1 },
}
}
filterDefs[#filterDefs+1] = { – probably best lookin blur
effect = “blurGaussian”,
title = “Gaussian Blur”, --UI name
isEditable = false,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
params = {
“horizontal.blurSize”,
“horizontal.sigma”,
“vertical.blurSize”,
“vertical.sigma”,
},
defaults = {
{ min = 1, max = 20, default = 20 }, – 4
{ min = 0, max = 1, default = 1 }, – 1
{ min = 1, max = 20, default = 20 },
{ min = 0, max = 1, default = 1 },
}
}
filterDefs[#filterDefs+1] = { – dont bother
effect = “blur”,
title = “Blur”, --UI name
isEditable = false,
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
params = {},
defaults = {}
}
filterDefs[#filterDefs+1] = { – looks good – not supported older devices
effect = “frostedGlass”,
isEditable = true,
title = “Frosted Glass”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
params = {
“scale”,
},
defaults = {
{ min = 1, max = 100, default = 5 },
}
}
filterDefs[#filterDefs+1] = { – dont bother
effect = “blurHorizontal”,
title = “H Blur”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
params = {
“horizontal.blurSize”,
“horizontal.sigma”,
},
defaults = {
{ min = 0, max = 255, default = 1 },
{ min = 0, max = 1, default = 1 },
}
}
filterDefs[#filterDefs+1] = { – dont bother
effect = “blurVertical”,
title = “V Blur”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
params = {
“vertical.blurSize”,
“vertical.sigma”,
},
defaults = {
{ min = 0, max = 100, default = 1 },
{ min = 0, max = 1, default = 1 },
}
}
filterDefs[#filterDefs+1] = { – dont bother, dynamic effect
effect = “dissolve”,
title = “Dissolve”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
params = {
“threshold”,
},
defaults = {
{ min = 0, max = 1, default = 0.5 },
}
}
filterDefs[#filterDefs+1] = { – crashed app? dynamic?
effect = “linearGradient”,
title = “Linear Gradient”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
params = {
“color1”,
“position1”,
“color2”,
“position2”,
},
defaults = {
{ min = {0,0,0,0}, max = {1,1,1,1}, default = {1,0,0,1} },
{ min = {0,0}, max = {1,1}, default = {0,0} },
{ min = {0,0,0,0}, max = {1,1,1,1}, default = {0,0,1,1} },
{ min = {0,0}, max = {1,1}, default = {1,1} },
}
}
filterDefs[#filterDefs+1] = { – dynamic?
effect = “linearWipe”,
title = “Linear Wipe”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
params = {
“direction”,
“smoothness”,
“progress”,
},
defaults = {
{ min = {0,0}, max = {1,1}, default = {1,0} },
{ min = 0, max = 1, default = 0 },
{ min = 0, max = 1, default = 0 },
}
}
filterDefs[#filterDefs+1] = { – Not good for use in photo - is better for dynamic effects
effect = “radialWipe”,
title = “Radial Wipe”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
params = {
“canter”,
“progress”,
“axisOrientation”,
“smoothness”,
},
defaults = {
{ min = {0,0}, max = {1,1}, default = {.5,.5} },
{ min = 0, max = 1, default = 0.5 },
{ min = 0, max = 1, default = 0.33 },
{ min = 0, max = 1, default = 0.5 },
– { min = 0, max = 1, default = 0 },
– { min = 0, max = 1, default = 0 },
– { min = 0, max = 1, default = 0 },
}
}
filterDefs[#filterDefs+1] = { – dynamic, dont use
effect = “wobble”,
title = “Wobble”, --UI name
thumbDistorts = false, – some effects, thumbnail looks dif than large size…
params = {
“amplitude”,
},
defaults = {
{ min = 0, max = -1, default = 10 },
}
}
filterDefs[#filterDefs+1] = { – doesn’t work?
effect = “colorMatrix”,
isEditable = false,
title = “Color Matrix”, --UI name
thumbDistorts = true, – some effects, thumbnail looks dif than large size…
audioFile = 2,
params = {
“coefficients”,
“bias”
},
defaults = {
{ default = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 }},
{ default = { 0.0, 0.0, 0.0, 0.0 }, min = { -1.0, -1.0, -1.0, -1.0 }, max = { 1.0, 1.0, 1.0, 1.0 }}
}
}
filterDefs[#filterDefs+1] = { – doesn’t work?
effect = “colorPolynomial”,
isEditable = false,
title = “Color Polynomial”, --UI name
thumbDistorts = true, – some effects, thumbnail looks dif than large size…
audioFile = 2,
params = {
“coefficients”,
},
defaults = {
{default = { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 } }
}
}
–]]
function applyFilter( image, index )
print(" – applyFilter()")
print(" - index, numFilters == ", index, #filterDefs)
– Lets check / load the default data into saved global data, if it’s not there…
– NOTE: app stores last user filter settings in a global array (mojodata.filterDefs), which is saved to device after edits…
if( mojoData.filterDefs == nil ) then – Has initial filter defs been saved to permanent array yet?
print(" – adding default filters defs")
mojoData.filterDefs = filterDefs – Use the default filterDefs above…
– utils.saveTable(mojoData.filterDefs, “filterDefs.opt”) – saved later by calling code, not saved here anymore
else
print(" – using existing filters defs") – Already been loaded
end
if( index == 0 ) then – 0 means to clear out any filter on the passed object
image.fill.effect = “” – reset to none
else
local info = mojoData.filterDefs[index] – filterDefs[index] – ok, lets point at the filter definition…
local p = info.params
local d = info.defaults
image.fill.effect = “filter.” … info.effect – Apply the little bugger
print(" - setting effect - “, info.effect)
print(” – btw, audio == ", mojoData.filterDefs[index].audioFile )
for i=1, #p do
local parameter = p[i]
– utils.printTable(p,“FILTER”,3)
– local m0, m1, d = d[i].min, d[i].max, d[i].default
local m0 = d[i].min
local m1 = d[i].max
local val = d[i].default
--[[
if ( type(m0) == “number” and type(m1) == “number” ) then
--numeric
if ( m0 == 0 and m1 == 1 ) then
val = mRan()
elseif( m1 == -1 ) then
val = mRan() * 100
elseif( m0 == -10 and m1 == 10 ) then
--special case EXPOSURE
local v = 1
if ( mRan() * 100 < 20 ) then
v = -1
end
val = mRan() * ( 5 * v )
else
--special case
if ( “levels” == info.effect ) then
val = ( mRan() * m1 ) / 255
else
local h = mRan() * m1
val = math.max( m0, h )
end
end
elseif ( type(m0) == “table” and type(m1) == “table” ) then
if ( #m0 == 2 and #m1 == 2 ) then
val = { mRan(), mRan() }
else
val = color( mRan(1, 255), mRan(1, 255), mRan(1, 255) )
end
end
--]]
– val =
print(" – parm, val == “, parameter, val)
– print(” - a - “, image.fill.effect[parameter])
image.fill.effect[parameter] = val
print(” …set.")
end
end
end
function getPercent(index) – returns % setting of 1st param of effect
local val
val = mojoData.filterDefs[index].defaults[1].max - mojoData.filterDefs[index].defaults[1].min
print(" – val1 == “, val)
val = ((mojoData.filterDefs[index].defaults[1].default + math.abs(mojoData.filterDefs[index].defaults[1].min))/val) * 100
print(” ---- calc’d percent as ", val)
return val
end
function setPercent(index, per) – returns % setting of 1st param of effect
local val
val = mojoData.filterDefs[index].defaults[1].max - mojoData.filterDefs[index].defaults[1].min
val = mojoData.filterDefs[index].defaults[1].min + (val * per * .01) – Account for the %
print(" ---- calc’d saved val as", val)
mojoData.filterDefs[index].defaults[1].default = val
return val
end
[lua]