GoldenCrystal Posted May 1, 2008 Posted May 1, 2008 I don't think this effect already existed (maybe I din't search enough), so I wrote this little effect today. Basically, this takes an opaque image along with a background/transparent color, and makes the image transparent in respect of the chosen color. The closer a pixel's color is to the chosen color, the more transparent it will become. This can be used, for example, to change the background color of an image. I took this image as an example: Then I applied my filter choosing some random blue color I could find in the sky of the picture: Here the image is really transparent (you might want to open it in Paint.NET to see better) and can blend really well on any background. Now I applied a dark background (just by adding a layer under the image, and filling it with the color) and the image looks like if it was the night This is still really simple, and you don't have any other parameter than the color yet. I hosted the plugin on my ftp here: [Download] If you have any questions or comment... 1 4 Quote
MattBlackLamb Posted May 1, 2008 Posted May 1, 2008 Tanel made a colour to Alpha plugin which is what that seems to be doing... Quote dA Son, someday you will make a girl happy for a short period of time. Then she'll leave you & be with men that are ten times better than you can imagine. These men are called musicians.
BoltBait Posted May 1, 2008 Posted May 1, 2008 Isn't this the same as: viewtopic.php?f=16&t=6466 or viewtopic.php?f=16&t=22215 Quote Download: BoltBait's Plugin Pack | CodeLab | and a Free Computer Dominos Game
GoldenCrystal Posted May 1, 2008 Author Posted May 1, 2008 I looked at those, and it looks these are absolutely not the same thing, though the one by Tanel effectively looks a lot like my effect. My intent was not to remove some parts of the image, but to do something more or less like an "evolved color-keying". My effect preserves the whole image, but just decompose it as a background color + transparent image. I just tried to maximize the transparency of every pixel, and calculated then calculated rgb values in order to have something like this: "original color" = blend("background color", "filtered color") I'll try to find a better image to show this Quote
Dalton Posted May 1, 2008 Posted May 1, 2008 Same or not, I like it! Quote MyBB Tutorials, check out my site.
pink77punk Posted May 8, 2008 Posted May 8, 2008 Thank you so much for this wonderful plug-in! You have saved me hours and hours of work! Quote
MJW Posted April 27, 2016 Posted April 27, 2016 This is a very good plugin to use, because it appears to use the correct algorithm for maximizing transparency while making the new color blend to produce the original color when alpha-blended to erased color. Not every plugin that does something similar does it as well. (Must have been a tough crowd, since the plugin's author got no Reputation points for this useful plugin.) Quote
david.atwell Posted April 27, 2016 Posted April 27, 2016 Actually, the author got no rep points because this plugin was posted back when we were still on forum software that didn't have any rep points. :-) Quote The Doctor: There was a goblin, or a trickster, or a warrior... A nameless, terrible thing, soaked in the blood of a billion galaxies. The most feared being in all the cosmos. And nothing could stop it, or hold it, or reason with it. One day it would just drop out of the sky and tear down your world.Amy: But how did it end up in there?The Doctor: You know fairy tales. A good wizard tricked it.River Song: I hate good wizards in fairy tales; they always turn out to be him.
MJW Posted June 2, 2016 Posted June 2, 2016 One major weakness of this otherwise excellent plugin is that it doesn't handle non-opaque pixels correctly. Quote
ReMake Posted June 3, 2016 Posted June 3, 2016 FYI: VS code for a plugin Spoiler using System; using System.Text; using System.Windows; using System.Reflection; using System.Windows.Forms; using PaintDotNet; using PaintDotNet.Effects; using PaintDotNet.IndirectUI; using PaintDotNet.PropertySystem; using System.Collections.Generic; using System.Drawing; using System.Drawing.Text; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Make Transparent Plugin")] [assembly: AssemblyDescription("Make Transparent Paint.NET Effect")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("GoldenCrystal")] [assembly: AssemblyProduct("MakeTransparent")] [assembly: AssemblyCopyright("Copyright © GoldenCrystal 2008")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: AssemblyVersion("1.0.0.0")] namespace MakeTransparentEffect { public class PluginSupportInfo : IPluginSupportInfo { public string Author { get { return "GoldenCrystal"; } } public string Copyright { get { return ((AssemblyCopyrightAttribute)base.GetType().Assembly.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false)[0]).Copyright; } } public string DisplayName { get { return ((AssemblyProductAttribute)base.GetType().Assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0]).Product; } } public Version Version { get { return base.GetType().Assembly.GetName().Version; } } public Uri WebsiteUri { get { return new Uri("http://www.getpaint.net/redirect/plugins.html"); } } } [PluginSupportInfo(typeof(PluginSupportInfo), DisplayName = "MakeTransparent")] public class MakeTransparentEffectPlugin : PropertyBasedEffect { public static string StaticName { get { return "Make Transparent"; } } public static Image StaticIcon { get { return new Bitmap(typeof(MakeTransparentEffectPlugin), "EffectPluginIcon.png"); } } public MakeTransparentEffectPlugin() : base(StaticName, StaticIcon, "Color", EffectFlags.Configurable) { } public enum PropertyNames { Amount1 } protected override PropertyCollection OnCreatePropertyCollection() { List<Property> props = new List<Property>(); props.Add(new Int32Property(PropertyNames.Amount1, ColorBgra.ToOpaqueInt32(ColorBgra.FromBgra(EnvironmentParameters.PrimaryColor.B, EnvironmentParameters.PrimaryColor.G, EnvironmentParameters.PrimaryColor.R, 255)), 0, 0xffffff)); return new PropertyCollection(props); } protected override ControlInfo OnCreateConfigUI(PropertyCollection props) { ControlInfo configUI = CreateDefaultConfigUI(props); configUI.SetPropertyControlValue(PropertyNames.Amount1, ControlInfoPropertyNames.DisplayName, "Background Color"); configUI.SetPropertyControlValue(PropertyNames.Amount1, ControlInfoPropertyNames.Description, "Color that will be made 100% transparent"); configUI.SetPropertyControlType(PropertyNames.Amount1, PropertyControlType.ColorWheel); return configUI; } protected override void OnSetRenderInfo(PropertyBasedEffectConfigToken newToken, RenderArgs dstArgs, RenderArgs srcArgs) { this.Amount1 = ColorBgra.FromOpaqueInt32(newToken.GetProperty<Int32Property>(PropertyNames.Amount1).Value); base.OnSetRenderInfo(newToken, dstArgs, srcArgs); } protected override void OnCustomizeConfigUIWindowProperties(PropertyCollection props) { // Change the effect's window title props[ControlInfoPropertyNames.WindowTitle].Value = "Make Transparent"; base.OnCustomizeConfigUIWindowProperties(props); } protected override unsafe void OnRender(Rectangle[] rois, int startIndex, int length) { if (length == 0) return; for (int i = startIndex; i < startIndex + length; ++i) { Render(DstArgs.Surface, SrcArgs.Surface, rois[i]); } } #region User Entered Code #region UICode ColorBgra Amount1 = ColorBgra.FromBgr(0, 0, 0); // Background Color #endregion private ColorBgra TransformColor(ColorBgra color) { int R = Amount1.R - color.R; int G = Amount1.G - color.G; int B = Amount1.B - color.B; int maxvalue = (R > G) ? ((R > B) ? R : B) : ((G > B) ? G : B); int minvalue = (R < G) ? ((R < B) ? R : B) : ((G < B) ? G : B); int max = Math.Max(Math.Abs(maxvalue), Math.Abs(minvalue)); if (max > 0) { return ColorBgra.FromBgraClamped(Amount1.B + 255 * (color.B - Amount1.B) / max, Amount1.G + 255 * (color.G - Amount1.G) / max, Amount1.R + 255 * (color.R - Amount1.R) / max, max); } return ColorBgra.FromBgra(255, 255, 255, 0); } void Render(Surface dst, Surface src, Rectangle rect) { Rectangle selection = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt(); ColorBgra CurrentPixel; for (int y = rect.Top; y < rect.Bottom; y++) { for (int x = rect.Left; x < rect.Right; x++) { CurrentPixel = src[x, y]; dst[x, y] = TransformColor(CurrentPixel); } } } #endregion } } 1 Quote
MJW Posted June 3, 2016 Posted June 3, 2016 Thank you, ReMake. I'd like to modify it to correctly deal with pixel alpha. I'm not certain about the propriety of doing so without the original programmer's permission, I think it's probably okay. (I'm impressed with the simplicity of GoldenCrystal's implementation; my version of the same idea was somewhat less straight-forward.) Quote
lynxster4 Posted June 3, 2016 Posted June 3, 2016 (edited) I just tried this plugin. I think it works great. I removed a dark orange color and made a layer of purple and lavender rays with Red's Gradients Galore. I then started to play around with the blend modes and had some very pleasant surprises! This image was on my work computer and labeled 'Welcome Scan'. Could have came with the OS or been a part of some HP software from my printer/scanner. @MJW...if you can update this plugin to work as you see as 'correctly' that would be fantastic! Thank you. Edited July 27, 2017 by lynxster4 re-hosted image Quote My Art Gallery | My Shape Packs | ShapeMaker Mini Tut | Air Bubble Stained Glass Chrome Text with Reflections | Porcelain Text w/ Variegated Coloring | Realistic Knit PatternOpalescent Stained Glass | Frosted Snowman Cookie | Leather Texture | Plastic Text | Silk Embroidery Visit my Personal Website "Never, ever lose your sense of humor - you'll live longer"
ReMake Posted June 3, 2016 Posted June 3, 2016 ... I'm not certain about the propriety of doing so without the original programmer's permission, I think it's probably okay. It is unlikely that you will be able to contact the author. GoldenCrystal was at a forum one day only. If you make this plugin better - it will be good. 1 Quote
dipstick Posted June 3, 2016 Posted June 3, 2016 I forgot I had this plugin already. Not a bad little plugin either..... 2 Quote
MJW Posted June 3, 2016 Posted June 3, 2016 (edited) Perhaps I'm confused, but I don't think Make Transparent always works correctly. If I place a (200, 200, 200) gray layer over a (100, 100, 100) gray layer, then apply Make Transparent to the top layer with the color set to (100, 100, 100), the apparent color changes. I don't think it should. I thought it might be because I made some experimental changes, but I re-downloaded the original DLL, and believe I'm using that version. Still, I thought I'd previously tested the plugin and found it worked as it should. If someone else could run the little test I described above, I'd appreciate it. If it doesn't work as it ought to, I'll probably make a new plugin. The test: Starting with two layers, Fill the upper layer with (200, 200, 200) Fill the lower layer with (100, 100, 100) Set the Primary Color to (100, 100, 100) Select a region in the upper layer Apply Make Transparent The appearance of the selected region shouldn't change. (ANOTHER) EDIT: I'm pretty sure that Make Transparent doesn't do what I'd like it to do, which is to change the transparency and color of each pixel in a manner that minimizes alpha while producing the original color when alpha-blended to the specified background color. I know how to do that, but I'll have to experiment to find the best way to minimize the annoying off-by-one errors that occur due to rounding differences. Accounting for the pixel alpha is easy: it's just a matter of scaling the computed alpha by the pixel alpha. I'd always thought that was the case, but I finally went through the math, and (believe I) confirmed it. ONE MORE EDIT: What I believed I confirmed is not true. The actual solution is to compute the new color and alpha relieve to the image color alpha-blended to the selected color. I've made a new plugin, Color Clearer, that's intended to do what I think it ought to do. Edited June 7, 2016 by MJW Quote
zaphodikus Posted August 7 Posted August 7 Hi All This download and the OP website appears to no longer exist, very curious, I'm playing right now with the re-made Kill Color Keeper , but it's just not bending to my will to remove complex backgrounds and the way I used to remove background using the wand in multiple layers , manually erasing the big bits, and mooshing the layers together again still seems to work pretty well in comparison. Where-as the AI background removers online work pretty well sadly. Maybe my expectation is wrong, but am keen to try out this plugin. Quote
toe_head2001 Posted August 7 Posted August 7 18 minutes ago, zaphodikus said: This download and the OP website appears to no longer exist Fake news. The download still works. Your web browser is probably blocking HTTP downloads (as opposed to HTTPS downloads). 1 Quote My Gallery | My Plugin Pack Layman's Guide to CodeLab
zaphodikus Posted August 7 Posted August 7 Confirm yes, thank you. That linky does work if I enable http again and then turn it back off later. Cheers. I spent all morning trying a few background removers and watching some rather old youtubes that merely confirm that I am doing it roughly right. I find the free Adobe online remover 1080p limit too restrictive even though it's pretty excellent and since I generally have a few minutes each time I don't mind using a few better tools than magic wand, in combination to get nice feathered cut-outs if I am patient. As always love the tool and the great community. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.