Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class ColorReplaceFilter : CIFilter
- {
- const string filterName = "colorReplace";
- const int numArgs = 4;
- const string coreIageShaderProgram =
- @"
- kernel vec4 main(__sample s, __color o, __color r, float threshold) {
- vec4 diff = s.rgba - o;
- float distance = length( diff );
- float alpha = compare( distance - threshold, 0.0, 1.0 );
- if (alpha == 0.0)
- return r;
- return s;
- }
- ";
- NSObject[] arguments;
- CIColorKernel colorKernel;
- public ColorReplaceFilter() { Initializer(); }
- public ColorReplaceFilter(NSCoder coder) : base(coder) { Initializer(); }
- public ColorReplaceFilter(NSObjectFlag t) : base(t) { Initializer(); }
- public ColorReplaceFilter(IntPtr handle) : base(handle) { Initializer(); }
- public CIImage InputImage { get; set; }
- public CIColor MatchColor { get; set; }
- public CIColor ReplaceWithColor { get; set; }
- NSNumber _threshold;
- public nfloat Threshold
- {
- get { return _threshold.NFloatValue; }
- set { _threshold = NSNumber.FromNFloat(value); }
- }
- void Initializer()
- {
- arguments = new NSObject[numArgs];
- colorKernel = CIColorKernel.FromProgramSingle(coreIageShaderProgram);
- MatchColor = CIColor.BlackColor;
- ReplaceWithColor = CIColor.WhiteColor;
- _threshold = new NSNumber(0.0f);
- }
- public override string Name
- {
- get => filterName;
- }
- public override CIImage OutputImage
- {
- get => CreateOutputImage();
- }
- CIImage CreateOutputImage()
- {
- if (InputImage != null) // Avoid object creation to allow fast filter chaining
- {
- arguments[0] = InputImage as NSObject;
- arguments[1] = MatchColor as NSObject;
- arguments[2] = ReplaceWithColor as NSObject;
- arguments[3] = _threshold as NSObject;
- var ciImage = colorKernel.ApplyWithExtent(InputImage.Extent, arguments);
- return ciImage;
- }
- return null;
- }
- protected override void Dispose(bool disposing)
- {
- base.Dispose(disposing);
- arguments = null;
- InputImage = null;
- MatchColor = null;
- ReplaceWithColor = null;
- colorKernel.Dispose();
- }
- }
Add Comment
Please, Sign In to add comment