using transition.to with blur filter

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]


–  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]

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