ReMake

Members
  • Content Count

    634
  • Joined

  • Last visited

  • Days Won

    21

Everything posted by ReMake

  1. This tutorial is available as a PDF. Click here to view or download it This tutorial has been recreated on the basis of a Storm / Vortex Tutorial by @Mayor_McSteeze. Part 1 Let's create an image similar to the one shown below: Step 1. Create a New () canvas with the dimensions you need (I chose 600x600). Set Primary Сolor to White and Secondary to Black. Step 2. Draw a radial gradient ( & ) as shown below (the size can be larger or smaller): Step 3. Apply Curves () adjustment with Luminosity like show below: Step 4. Apply the Sharpen () effect (Effects -> Photo -> Sharpen) with the maximum Amount. Step 5. Run Clouds () effect (Effects -> Render -> Clouds) with a small scale and roughness about 0.55 - 0.7. Set the Blend Mode to Color Burn. We'll get an image like this: Step 6. Duplicate () the current layer. Apply a Zoom Blur () effect (Effects -> Blurs -> Zoom Blur) to the top layer in the center of the vortex with a Zoom Amount of about 80-100. Set the Blend Mode () to Negation for the top layer and merge () down this layer. Step 7. Duplicate () the current layer. On the top layer run Twist () effect (Effects -> Distort -> Twist) with the settings seen below: Set the Blend Mode () to Lighten for the top layer. Step 8. Apply the Twist () effect to the bottom layer by changing the Direction and, if necessary, the Amount. Merge () both layers. Now let's add colors to the image. Step 9. Apply Curves () with the settings as shown below: And we got what we wanted! Play around with the R,G, and B curves to get the color you like. Note: all settings given in this tutorial are very approximate and depend on your preferences. Part 2 Other ways to color the image. Besides using Curves () you can apply other ways of coloring, for example: Color Balance by @BoltBait, or Color Tint by @Ed Harvey, or Gradient Mapping by @pyrochild with, for example, MiguelPereira's Rainbow preset (see Presets for Gradient Mapping), or with your own settings. Similar coloring can be obtained by applying Trippy rainbow effect by @pavlik1307. Another way to color the image is applying Color Dimmer effect by @Xhin. You may be interested in applying another effect by @Xhin - Radial Prism effect. Note: this effect is additional for the already colored image. Once more example of applying gradients is using Multi Color Gradient by @romein. Add a New Layer () to the Black&White image and apply Multi Color Gradient to the top layer. Set the Blend Mode () to Color Burn for the top layer. A similar result can be made with the Gradient Mapping. Add a New Layer () to the Black&White image. Draw a Black&White Linear () Gradient () from the lower left to the upper right. Apply Gradient Mapping with the settings as shown below: You can download this settings from the zip file Gradient for Vortex tut.zip Set the Blend Mode () to Overlay for the top layer. Of course this is not all ways of coloring. Perhaps you will find your original way of coloring and share it with us. Part 3 Applying effects. Now that we've created the image and colored it, let's try to make it more diverse. For example, apply to an image built-in Posterize () effect (Adjustments -> Posterize), or Ink Sketch () effect (Effects -> Artistic -> Ink Sketch), or Bulge () effect (Effects -> Distort -> Bulge). You can also use other paint.net the effects like my Reticulation effect (Effects -> Artistic -> Reticulation), or Droste effect by @toe_head2001 (Effects -> Distort -> Droste), and many other effects. Huge opportunities you can get from G'MIC effect by @null54 - it all depends on your world perception and your fantasy. And finally, a little trick. You might want to change the size of the dark spot in the center of the image or the size of the bright white ring around that spot. In Step 3 of Part 1, apply the Curves () adjustment as shown below. Point 1 allows you to change the size of the dark spot (left - increase, right - decrease). Point 2 allows you to change the size of the bright ring around the dark spot. I hope you enjoyed this tutorial.
  2. ReMake

    Storm / Vortex Tutorial (recreated)

    I think it's possible.
  3. ReMake

    Storm / Vortex Tutorial (recreated)

    Excellent work @Seerose! I have been trying to find saved copies of this tutorial for a long time, but only the first image was found. There was a lot of information missing. The restoration of the tutorial was made by trial and error. This work fascinated me so much that I decided to expand this tutorial. Your feedback shows the usefulness of this work.
  4. ReMake

    Storm / Vortex Tutorial (recreated)

    Added Part 3 and completed. I am sure that your new works will help to supplement this Tutorial.
  5. ReMake

    Storm / Vortex Tutorial (recreated)

    Fine work @HyReZ! Thank you.
  6. ReMake

    Storm / Vortex Tutorial (recreated)

    Added Part 2. To be continued...
  7. How to create a plugin of the Sponge effect in CodeLab I wrote in tutorial CodeLab - First Steps (Sponge). In the end of this tutorial I recommended to apply the Oil Painting effect before you call the Sponge effect. When I read BoltBait's topic How to Write an Effect Plugin (Part 7 - Extra Surface), I understood how to create a plugin which combines two effects - Clouds and Oil Painting. EDIT: The first variant of this tutorial was based on BoltBait's How to Write an Effect Plugin (Part 7 - Extra Surface) tutorial. In this variant the Clouds effect was processed in OnSetRenderInfo function. toe_head2001 suggested to combine both effects in the Render loop. It has allowed to increase speed of effect. I have updated this tutorial. Start CodeLab (Effects-> Advanced-> CodeLab). Choose New in the menu File. In a dialogue box Script Editor click a No button. The dialogue box New Source (Template) will be presented to you. In the drop-down list choose Clouds and in the drop-down list Blend choose Multiply. Click the Generate Code button. We will get the following script of effect: // Name: // Submenu: // Author: // Title: // Desc: // Keywords: // URL: // Help: #region UICode IntSliderControl Amount1 = 250; // [2,1000] Scale DoubleSliderControl Amount2 = 0.5; // [0,1] Roughness BinaryPixelOp Amount3 = LayerBlendModeUtil.CreateCompositionOp(LayerBlendMode.Normal); // Blend Mode ReseedButtonControl Amount4 = 0; // [255] Reseed #endregion // Setup for calling the Render Clouds effect private CloudsEffect cloudsEffect = new CloudsEffect(); private PropertyCollection cloudsProps; // Setup for using Multiply blend op private BinaryPixelOp multiplyOp = LayerBlendModeUtil.CreateCompositionOp(LayerBlendMode.Multiply); // Here is the main render loop function void Render(Surface dst, Surface src, Rectangle rect) { // Call the Render Clouds function cloudsProps = cloudsEffect.CreatePropertyCollection(); PropertyBasedEffectConfigToken CloudsParameters = new PropertyBasedEffectConfigToken(cloudsProps); CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Scale, Amount1); CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Power, Amount2); CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.BlendMode, Amount3); CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Seed, (int)Amount4); cloudsEffect.SetRenderInfo(CloudsParameters, new RenderArgs(dst), new RenderArgs(src)); // Call the Clouds function using Black and White cloudsEffect.Render(new Rectangle[1] {rect},0,1); // Now in the main render loop, the dst canvas has a render of clouds for (int y = rect.Top; y < rect.Bottom; y++) { if (IsCancelRequested) return; for (int x = rect.Left; x < rect.Right; x++) { ColorBgra CurrentPixel = dst[x,y]; // TODO: Add additional pixel processing code here CurrentPixel = multiplyOp.Apply(src[x,y], CurrentPixel); dst[x,y] = CurrentPixel; } } } Open the designer interface (File -> User Interface Designer), select in it the Scale control and rename it to Brush Size. Set the maximum value to 100, set the default value to 25. Click the Update button. Select the second control. Select Integer Slider in the Control type box. Set the minimum value to 0, the maximum value to 10 and the default value to 0. Click the Update button. Remove the third and fourth controls - we don't need them. Select Integer Slider in the Control type box. Type Intensity in the Control name box. Set the maximum value to 255 and click the Add button. Select Integer Slider in the Control type box. Type Smoothness in the Control name box. Set the minimum value to 1, set the default value to 2 and the maximum value to 8. Click the Add button. Last two controls will be necessary for us later. Click button OK. Comment out or delete the following line: CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.BlendOp, Amount3); it isn't need to us any more. In the line CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Seed, (int)Amount4); write 255 instead of (int) Amount4. Since we changed the type of the variable Amount2, we will have to make a change in the next line: CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Power, Amount2); replacing Amount2 to (10 - Amount2) / 10.0 Let's convert our clouds to the black-and-white contrast image. For this purpose color components of pixel (R, G, В) will be necessary for us. If the components value is less than 128, we will set it to 0, otherwise - 255. Insert into the script the following block of codes instead of the comment //TODO: int A = CurrentPixel.A; // Convert to black-and-white contrast image int R = CurrentPixel.R < 128 ? 0 : 255; int G = CurrentPixel.G < 128 ? 0 : 255; int B = CurrentPixel.B < 128 ? 0 : 255; Now let's eliminate light areas in this image and restore our pixel from the updated values of the color components. Insert into the script the following block of codes before blend operation: // Eliminate light areas A = 255 - Math.Min(Math.Min(R, G), В); // Restore pixel CurrentPixel.R = Int32Util.ClampToByte(R); CurrentPixel.G = Int32Util.ClampToByte(G); CurrentPixel.B = Int32Util.ClampToByte(В); CurrentPixel.A = Int32Util.ClampToByte(A + Amount3 - 255); Fill the commented lines at the top of the script, for example, like these: // Name: Sponge // Submenu: Artistic // Author: ReMake // Title: Sponge v1.2 ReMake 2015 // Desc: The Paint.NET effect which simulates Sponge painting // Keywords: paint.net|effect|sponge // URL: http://www.getpaint.net/redirect/plugins.html If your effect has to have the help, add one more comment: // Help: The Paint.NET effect which simulates Sponge painting. Save this script with the Sponge_1 name and create a DLL file with the same name. Try how your effect works. Try to apply different settings for controls. Notice, visually appreciable change of intensity comes through each three-four units of variable Amount3. Let's remember it. Below are the most effective parameters ranges of our effect: - Brush Size - 20...32 - Intensity - 200...240 Let's modify our script with the received results. The code block of the user interface will look like this: #region UICode IntSliderControl Amount1 = 3; // [1,10] Brush Size IntSliderControl Amount2 = 7; // [0,10] Roughness IntSliderControl Amount3 = 5; // [0,15] Intensity IntSliderControl Amount4 = 2; // [1,8] Smoothness #endregion Change the following line in the script: CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Scale, Amount1 + 20); CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Power, (10 - Amount2) / 10.0); CurrentPixel.A = Int32Util.ClampToByte(A + Amount3*3 - 240); For the further work we will need an auxiliary surface for our effect. Add in the script the next lines after UI code block: // Declare auxiliary surface private Surface aux; Our final script should look like this: // Name: Sponge // Submenu: Artistic // Author: ReMake // Title: Sponge v1.2 ReMake 2015 // Desc: The Paint.NET effect which simulates Sponge painting // Keywords: paint.net|effect|sponge // URL: http://www.getpaint.net/redirect/plugins.html // Help: The Paint.NET effect which simulates Sponge painting. #region UICode IntSliderControl Amount1 = 3; // [1,10] Brush Size IntSliderControl Amount2 = 7; // [0,10] Roughness IntSliderControl Amount3 = 5; // [0,15] Intensity IntSliderControl Amount4 = 3; // [1,8] Smoothness #endregion // Declare auxiliary surface private Surface aux; // Setup for calling the Render Clouds effect private CloudsEffect cloudsEffect = new CloudsEffect(); private PropertyCollection cloudsProps; // Setup for using Multiply blend op private BinaryPixelOp multiplyOp = LayerBlendModeUtil.CreateCompositionOp(LayerBlendMode.Multiply); // Here is the main render loop function void Render(Surface dst, Surface src, Rectangle rect) { // Call the Render Clouds function cloudsProps = cloudsEffect.CreatePropertyCollection(); PropertyBasedEffectConfigToken CloudsParameters = new PropertyBasedEffectConfigToken(cloudsProps); CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Scale, Amount1 + 20); CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Power, (10 - Amount2) / 10.0); CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Seed, 255); cloudsEffect.SetRenderInfo(CloudsParameters, new RenderArgs(dst), new RenderArgs(src)); // Call the Clouds function using Black and White cloudsEffect.Render(new Rectangle[1] {rect},0,1); // Now in the main render loop, the dst canvas has a render of clouds for (int y = rect.Top; y < rect.Bottom; y++) { if (IsCancelRequested) return; for (int x = rect.Left; x < rect.Right; x++) { ColorBgra CurrentPixel = dst[x,y]; int A = CurrentPixel.A; // Convert to black-and-white contrast image int R = CurrentPixel.R < 128 ? 0 : 255; int G = CurrentPixel.G < 128 ? 0 : 255; int B = CurrentPixel.B < 128 ? 0 : 255; // Eliminate light areas A = 255 - Math.Min(Math.Min(R, G), В); // Restore pixel CurrentPixel.R = Int32Util.ClampToByte(R); CurrentPixel.G = Int32Util.ClampToByte(G); CurrentPixel.B = Int32Util.ClampToByte(В); CurrentPixel.A = Int32Util.ClampToByte(A + Amount3 * 3 - 240); CurrentPixel = multiplyOp.Apply(src[x,y], CurrentPixel); dst[x,y] = CurrentPixel; } } } Save this script with the Sponge name - maybe it will be necessary to you in the future. Now let's prepare our script to moving into Visual Studio. Open the dialogue box Building (File -> Save As DLL...). Click the Select icon link and select the icon (for example, like this: ). Click the View source check box and click the Build button. You will see a dialogue box containing all the source code that CodeLab prepared for you. Our script is ready to moving into Visual Studio. Copy this code (click on button ) and move it to a Visual Studio project how it's written in BoltBait's tutorial: CodeLab Tutorial Part 5 - Beyond CodeLab. Let's continue. Find the function named OnSetRenderInfo. Currently it looks like this: protected override void OnSetRenderInfo(PropertyBasedEffectConfigToken newToken, RenderArgs dstArgs, RenderArgs srcArgs) { Amount1 = newToken.GetProperty<Int32Property>(PropertyNames.Amount1).Value; Amount2 = newToken.GetProperty<Int32Property>(PropertyNames.Amount2).Value; Amount3 = newToken.GetProperty<Int32Property>(PropertyNames.Amount3).Value; Amount4 = newToken.GetProperty<Int32Property>(PropertyNames.Amount4).Value; base.OnSetRenderInfo(newToken, dstArgs, srcArgs); } We will use the following line to create the auxiliary surface: aux = new Surface(srcArgs.Size); Place this line before the base.OnSetRenderInfo call. Return to CodeLab and open in it the dialogue box New Source (Template). In the drop-down list choose Oil Painting and click the Generate Code button. Copy from the script this code block: // Setup for calling the Oil Painting effect OilPaintingEffect oilpaintEffect = new OilPaintingEffect(); PropertyCollection oilpaintProps = oilpaintEffect.CreatePropertyCollection(); PropertyBasedEffectConfigToken oilpaintParameters = new PropertyBasedEffectConfigToken(oilpaintProps); oilpaintParameters.SetPropertyValue(OilPaintingEffect.PropertyNames.BrushSize, Amount1); oilpaintParameters.SetPropertyValue(OilPaintingEffect.PropertyNames.Coarseness, Amount2); oilpaintEffect.SetRenderInfo(oilpaintParameters, new RenderArgs(dst), new RenderArgs(src)); // Call the Oil Painting function oilpaintEffect.Render(new Rectangle[1] {rect},0,1); // Now in the main render loop, the dst canvas has an oil painted version of the src canvas and paste it into Visual Studio before the comment // Call the Render Clouds function In the line oilpaintParameters.SetPropertyValue(OilPaintingEffect.PropertyNames.BrushSize, Amount1); change Amount1 to Amount4 and in the line oilpaintParameters.SetPropertyValue(OilPaintingEffect.PropertyNames.Coarseness, Amount2); change Amount2 to 3: oilpaintParameters.SetPropertyValue(OilPaintingEffect.PropertyNames.BrushSize, Amount4); oilpaintParameters.SetPropertyValue(OilPaintingEffect.PropertyNames.Coarseness, 3); In the line cloudsEffect.SetRenderInfo(CloudsParameters, new RenderArgs(dst), new RenderArgs(src)); change dst to aux, and src to dst. cloudsEffect.SetRenderInfo(CloudsParameters, new RenderArgs(aux), new RenderArgs(dst)); Now we should move Clouds from an auxiliary surface to the destination canvas. For this in the line ColorBgra CurrentPixel = dst[x, y]; change dst to aux: ColorBgra CurrentPixel = aux[x, y]; It's necessary to mix current pixel with appropriate pixel on the destination canvas. For this purpose replace a line CurrentPixel = multiplyOp.Apply(src[x,y], CurrentPixel); with the line CurrentPixel = multiplyOp.Apply(CurrentPixel, dst[x, y]); Our final render function should look like this: void Render(Surface dst, Surface src, Rectangle rect) { // Setup for calling the Oil Painting effect OilPaintingEffect oilpaintEffect = new OilPaintingEffect(); PropertyCollection oilpaintProps = oilpaintEffect.CreatePropertyCollection(); PropertyBasedEffectConfigToken oilpaintParameters = new PropertyBasedEffectConfigToken(oilpaintProps); oilpaintParameters.SetPropertyValue(OilPaintingEffect.PropertyNames.BrushSize, Amount4); oilpaintParameters.SetPropertyValue(OilPaintingEffect.PropertyNames.Coarseness, 3); oilpaintEffect.SetRenderInfo(oilpaintParameters, new RenderArgs(dst), new RenderArgs(src)); // Call the Oil Painting function oilpaintEffect.Render(new Rectangle[1] { rect }, 0, 1); // Now in the main render loop, the dst canvas has an oil painted version of the src canvas // Call the Render Clouds function cloudsProps = cloudsEffect.CreatePropertyCollection(); PropertyBasedEffectConfigToken CloudsParameters = new PropertyBasedEffectConfigToken(cloudsProps); CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Scale, Amount1 + 20); CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Power, (10 - Amount2) / 10.0); CloudsParameters.SetPropertyValue(CloudsEffect.PropertyNames.Seed, 255); cloudsEffect.SetRenderInfo(CloudsParameters, new RenderArgs(aux), new RenderArgs(dst)); // Call the Clouds function using Black and White cloudsEffect.Render(new Rectangle[1] {rect},0,1); // Now in the main render loop, the dst canvas has a render of clouds for (int y = rect.Top; y < rect.Bottom; y++) { if (IsCancelRequested) return; for (int x = rect.Left; x < rect.Right; x++) { ColorBgra CurrentPixel = aux[x, y]; int A = CurrentPixel.A; // Convert to black-and-white contrast image int R = CurrentPixel.R < 128 ? 0 : 255; int G = CurrentPixel.G < 128 ? 0 : 255; int B = CurrentPixel.B < 128 ? 0 : 255; // Eliminate light areas A = 255 - Math.Min(Math.Min(R, G), В); // Restore pixel CurrentPixel.R = Int32Util.ClampToByte(R); CurrentPixel.G = Int32Util.ClampToByte(G); CurrentPixel.B = Int32Util.ClampToByte(В); CurrentPixel.A = Int32Util.ClampToByte(A + Amount3 * 3 - 240); CurrentPixel = multiplyOp.Apply(CurrentPixel, dst[x, y]); dst[x, y] = CurrentPixel; } } } Save this solution and build your DLL from within Visual Studio. Try this effect in Paint.NET. The user interface of our new effect looks like this. The source image And this is result of effect's work. Thanks BoltBait for his excellent tutorials.
  8. ReMake

    CodeLab development by Sakana Oji

    @Sakana Oji, I appreciate your youthful enthusiasm and maximalism, but you are violating item 2) of The Rules (I hope the admins and mods will be lenient to you again - we all make mistakes sometimes). No offense, but I suggest you create your own topic in the proper thread as it did @xod with its Unfinished plugins.
  9. ReMake

    Storm / Vortex Tutorial (recreated)

    I thought so. This is also one of the techniques. Thanks.
  10. ReMake

    Storm / Vortex Tutorial (recreated)

    @Seerose, your images got 4 rep, of course they are good. When I talked about your images, I meant a multi-color image. Share the secret of creating a multi-color?
  11. ReMake

    Storm / Vortex Tutorial (recreated)

    @lynxster4, @Pixey, @Roger the Dodger, @Seerose, @Woodsy thanks for the reply and sharing your works. @Ego Eram Reputo, @toe_head2001, @Eli, @Maximilian thanks for the rep points. I am happy that we managed to get another tutorial out of the Graveyard. Looking at the Seerose's images, I intend to extend this tutorial with some techniques and little 'tricks'. To do this, I need some time to experiment with images. As soon as I'm ready, I'll publish the second part of this tutorial.
  12. This tutorial is available as a PDF. Click here to view or download it BoltBait proposed the idea for creating a picture in Scratch Art style. Let's try. Open any image. Apply the Pencil Sketch effect (Effects -> Artistic -> Pencil Sketch). Invert the image (keys Ctrl+Shift+I) and apply the Eliminate Dark/Light effect (Effects-> Color-> Eliminate Dark/Light). Add new layer (Layer 2) and move it down. Fill this layer by yellow color. Set the blending mode to Darken for the Background layer. Merge both layers. And we are done! Try to apply the Radial Prism effect for this image (Effects-> Color-> Radial Prism) and enjoy the result! Also see: Scratch Art effect.
  13. ReMake

    Scratch Art Style in Paint.NET

    Because the Background layer is above Layer 2. (see Layer Blend Modes).
  14. ReMake

    Starry image with glassy text

    You're welcome.
  15. ReMake

    Starry image with glassy text

    Unfortunately, I don't have one. But having this image, it is possible to restore the tutorial by trial and error.
  16. Maybe this will help: How it's made (Sponge effect)
  17. I don't have any problems with this plugin. Check for the SelectionTools.dll file in the folder Program Files > paint.net > Effects.
  18. You are using Classic or Store version of paint.net?
  19. I'm sorry, but in this case, I can't help you.
  20. Install the latest version of CodeLab (v 4.1).
  21. Please publish your code (while in the CodeLab text editor, do Ctrl+A then Ctrl+C and paste your code into the message here).
  22. This simple effect is based on the Method 2 of my tutorial Create the Dragan effect in Paint.NET. Open and start CodeLab (Effects-> Advanced-> CodeLab). Choose New in the menu File. In a dialogue box Script Editor click a No button. The dialogue box New Source (Template) will be presented to you. In the drop-down list choose Sharpen. From the drop-down list Blend choose Overlay. Click the Generate Code button. We will get the following script of effect: // Name: // Submenu: // Author: // Title: // Version: // Desc: // Keywords: // URL: // Help: #region UICode IntSliderControl Amount1=2; // [1,20] Amount #endregion // Setup for using Overlay blend op private BinaryPixelOp overlayOp = LayerBlendModeUtil.CreateCompositionOp(LayerBlendMode.Overlay); // Here is the main render loop function void Render(Surface dst, Surface src, Rectangle rect) { // Setup for calling the Sharpen effect SharpenEffect sharpenEffect = new SharpenEffect(); PropertyCollection sharpenProps = sharpenEffect.CreatePropertyCollection(); PropertyBasedEffectConfigToken SharpenParameters = new PropertyBasedEffectConfigToken(sharpenProps); SharpenParameters.SetPropertyValue(SharpenEffect.PropertyNames.Amount, Amount1); sharpenEffect.SetRenderInfo(SharpenParameters, new RenderArgs(dst), new RenderArgs(src)); // Call the Sharpen function sharpenEffect.Render(new Rectangle[1] { rect }, 0, 1); // Now in the main render loop, the dst canvas has a sharpened version of the src canvas for (int y = rect.Top; y < rect.Bottom; y++) { if (IsCancelRequested) return; for (int x = rect.Left; x < rect.Right; x++) { ColorBgra CurrentPixel = dst[x,y]; // TODO: Add additional pixel processing code here CurrentPixel = overlayOp.Apply(src[x,y], CurrentPixel); dst[x,y] = CurrentPixel; } } } In the line SharpenParameters.SetPropertyValue(SharpenEffect.PropertyNames.Amount, Amount1); replace Amount1 to 20. In BoltBait's CodeLab Tutorial Part 3 - Complex find and copy a code of the Gaussian Blur effect. Paste this code before the line: for (int y = rect.Top; y < rect.Bottom; y++) // Setup for calling Gaussian Blur GaussianBlurEffect blurEffect = new GaussianBlurEffect(); PropertyCollection bProps = blurEffect.CreatePropertyCollection(); PropertyBasedEffectConfigToken bParameters = new PropertyBasedEffectConfigToken(bProps); bParameters.SetPropertyValue(GaussianBlurEffect.PropertyNames.Radius, Amount1); // fix blurEffect.SetRenderInfo(bParameters, new RenderArgs(dst), new RenderArgs(src)); // Call Gaussian Blur blurEffect.Render(new Rectangle[1] {rect},0,1); In BoltBait's CodeLab Tutorial Part 3 - Complex find and copy the code of unary pixel operation and paste it below the line #endregion. Add a comment to this block of code: // Setup for using pixel op private UnaryPixelOps.Desaturate desaturateOp = new UnaryPixelOps.Desaturate(); private UnaryPixelOps.HueSaturationLightness saturationOp; private UnaryPixelOps.Invert invertOp = new UnaryPixelOps.Invert(); Below this comment // Setup for using Overlay blend op add the Normal blending mode and correct a comment: // Setup for using blending modes private BinaryPixelOp overlayOp = LayerBlendModeUtil.CreateCompositionOp(LayerBlendMode.Overlay); private BinaryPixelOp normalOp = LayerBlendModeUtil.CreateCompositionOp(LayerBlendMode.Normal); Open the designer interface (File -> User Interface Designer). Rename the control name of Amount1 to Sharpen. Set value by default to 5, the minimum value to 1, maximum - to100 and click button Update. In the drop-down list Control Type select the Integer Slider. In the Control name box write Hue. Set value by default to 0, the minimum value to -20, maximum - to 20. Click the Add button, then click button Ok. Now we need a code of High Pass effect. I restored it from the High Pass Single Slider effect by Cookies: for (int y = rect.Top; y < rect.Bottom; y++) { if (IsCancelRequested) return; for (int x = rect.Left; x < rect.Right; x++) { ColorBgra SrcPixel = src[x,y]; SrcPixel = invertOp.Apply(SrcPixel); ColorBgra DstPixel = dst[x,y]; DstPixel.A = Int32Util.ClampToByte((int)(DstPixel.A / 2)); SrcPixel = normalOp.Apply(SrcPixel, DstPixel); SrcPixel = invertOp.Apply(SrcPixel); DstPixel = SrcPixel; ColorBgra MaxOpacPixel = SrcPixel; ColorBgra MinOpacPixel = SrcPixel; MaxOpacPixel.A = 255; MinOpacPixel.A = 75; SrcPixel = overlayOp.Apply(DstPixel, MaxOpacPixel); SrcPixel = overlayOp.Apply(SrcPixel, MinOpacPixel); SrcPixel.A = src[x,y].A; dst[x,y] = SrcPixel; } } Insert this code instead of the available cycles for y, for x. Add a line SrcPixel = overlayOp.Apply(SrcPixel, src[x,y]); after this line SrcPixel.A = src[x,y].A; We need function for adjustment of a hue. In BoltBait's CodeLab Tutorial Part 3 - Complex find and copy this code // create a saturation operation based on a UI slider saturationOp = new UnaryPixelOps.HueSaturationLightness(0, Amount1, 0); // fix CurrentPixel = saturationOp(CurrentPixel); and paste it before line dst[x,y] = SrcPixel; Replace Amount1 on Amount2 * 2 + 100 and CurrentPixel on SrcPixel. It remains to add some information: // Name: Dragan Effect // Submenu: Photo // Author: ReMake // Title: Dragan Effect v1.0 ReMake 2016 // Version: 1.0 // Desc: Imitation of Dragan effect // Keywords: paint.net|dragan|effect // URL: http://www.getpaint.net/redirect/plugins.html // Help: Our final script will look like this: // Name: Dragan Effect // Submenu: Photo // Author: ReMake // Title: Dragan Effect v1.0 ReMake 2016 // Version: 1.0 // Desc: Imitation of Dragan effect // Keywords: paint.net|dragan|effect // URL: http://www.getpaint.net/redirect/plugins.html // Help: #region UICode int Amount1 = 5; // [1,100] Sharpness int Amount2 = 0; // [-20,20] Hue #endregion // Setup for using pixel op private UnaryPixelOps.Invert invertOp = new UnaryPixelOps.Invert(); private UnaryPixelOps.Desaturate desaturateOp = new UnaryPixelOps.Desaturate(); private UserBlendOps.NormalBlendOp normalOp = new UserBlendOps.NormalBlendOp(); // Setup for using blending modes private UserBlendOps.OverlayBlendOp overlayOp = new UserBlendOps.OverlayBlendOp(); private UnaryPixelOps.HueSaturationLightness saturationOp; // Here is the main render loop function void Render(Surface dst, Surface src, Rectangle rect) { // Setup for calling the Sharpen effect SharpenEffect sharpenEffect = new SharpenEffect(); PropertyCollection sharpenProps = sharpenEffect.CreatePropertyCollection(); PropertyBasedEffectConfigToken sharpenParameters = new PropertyBasedEffectConfigToken(sharpenProps); sharpenParameters.SetPropertyValue(SharpenEffect.PropertyNames.Amount, 20); sharpenEffect.SetRenderInfo(sharpenParameters, new RenderArgs(dst), new RenderArgs(src)); // Call the Sharpen function sharpenEffect.Render(new Rectangle[1] { rect }, 0, 1); // Now in the main render loop, the dst canvas has a sharpened version of the src canvas // Setup for calling Gaussian Blur GaussianBlurEffect blurEffect = new GaussianBlurEffect(); PropertyCollection blurProps = blurEffect.CreatePropertyCollection(); PropertyBasedEffectConfigToken BlurParameters = new PropertyBasedEffectConfigToken(blurProps); BlurParameters.SetPropertyValue(GaussianBlurEffect.PropertyNames.Radius, Amount1); blurEffect.SetRenderInfo(BlurParameters, new RenderArgs(dst), new RenderArgs(src)); // Call Gaussian Blur blurEffect.Render(new Rectangle[1] {rect},0,1); for (int y = rect.Top; y < rect.Bottom; y++) { for (int x = rect.Left; x < rect.Right; x++) { ColorBgra SrcPixel = src[x,y]; SrcPixel = invertOp.Apply(SrcPixel); ColorBgra DstPixel = dst[x,y]; DstPixel.A = Int32Util.ClampToByte((int)(DstPixel.A / 2)); SrcPixel = normalOp.Apply(SrcPixel, DstPixel); SrcPixel = invertOp.Apply(SrcPixel); DstPixel = SrcPixel; ColorBgra MaxOpacPixel = SrcPixel; ColorBgra MinOpacPixel = SrcPixel; MaxOpacPixel.A = 255; MinOpacPixel.A = 75; SrcPixel = overlayOp.Apply(DstPixel, MaxOpacPixel); SrcPixel = overlayOp.Apply(SrcPixel, MinOpacPixel); SrcPixel.A = src[x,y].A; SrcPixel = overlayOp.Apply(SrcPixel, src[x,y]); // create a saturation operation based on a UI slider saturationOp = new UnaryPixelOps.HueSaturationLightness(0, Amount2*2+100, 0); SrcPixel = saturationOp.Apply(SrcPixel); dst[x,y] = SrcPixel; } } } Save this code with name DraganEffect (File -> Save or keys Ctrl+S). Create for our effect appropriate icon as a 16 x 16 pixel PNG file, for example like this: . Now let's save our effect as a DLL file: File-> Save as DLL... Almost all information is in the dialog box, which presented to you. Click the Select icon link and select the icon. Click the Build button - your new effect is ready! The user interface of our new effect looks like this. The results of the effect, see in the Create the Dragan effect in Paint.NET tutorial and in the Dragan Effect topic.