Thanks a lot! It’s really a great help to me.
Kyle
Thanks a lot! It’s really a great help to me.
Kyle
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]
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
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 = {}
}
–[[
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]
mpappas,
Thank you for taking the time to post the code above. I am still learning about the various filters, so it was interesting to read through your comments about each filter to see which ones work better in different situations (ie. some seem to be dynamic).
Perry