hollander Posted August 17, 2007 Share Posted August 17, 2007 (edited) I saw some requests for it on the forum, and I happened make one already after experimenting a bit with Codeab. it has got 2 modes, one for black/white, and the other for color (= black/white/red/green/blue/cyan/magenta/yellow) normally if you use this effect on an photo, it will be dithered. if you use it on a simple graphic (like an icon, or something made with ms paint.) it will not dither. (dither slider should only be used on blurry photos) monochrome.zip example: (black/white) (color) Spoiler // Name: Monochrome // Author: hollander #region UICode RadioButtonControl Amount1 = 0; // [1] Mode|Black and White|Color IntSliderControl Amount2 = 128; // [0,255,5] Brightness IntSliderControl Amount3 = 0; // [0,100] Dither #endregion void Render(Surface dst, Surface src, Rectangle rect) { ColorBgra CurrentPixel; ColorBgra CurrentPixel2; int m; float m2; float m3; int r; int g; int b; int r2; int g2; int b2; int mr = 124; int mg = 872; int mb = 164; for (int y = rect.Top; y < rect.Bottom; y++) { if (IsCancelRequested) return; for (int x = rect.Left; x < rect.Right; x++) { CurrentPixel = src[x, y]; CurrentPixel2 = src[x, y]; r = mr; g = mg; b = mb; mr += CurrentPixel2.R; mg += CurrentPixel2.G; mb += CurrentPixel2.B; CurrentPixel2.R = (byte)r; CurrentPixel2.G = (byte)g; CurrentPixel2.B = (byte)b; r = CurrentPixel2.R; g = CurrentPixel2.G; b = CurrentPixel2.B; r2 = CurrentPixel.R; g2 = CurrentPixel.G; b2 = CurrentPixel.B; m = ((r2 * (100 - Amount3) + (r * Amount3)) / 100); CurrentPixel.R = (byte)m; m = ((g2 * (100 - Amount3) + (g * Amount3)) / 100); CurrentPixel.G = (byte)m; m = ((b2 * (100 - Amount3) + (b * Amount3)) / 100); CurrentPixel.B = (byte)m; if (Amount1 == 0) { m = (int)((CurrentPixel.R + CurrentPixel.G + CurrentPixel.B) / 3); m += Amount2; m += 1; m2 = 512 / m; m3 = m / m2; m = (int)(m / m2); if (m == m3) { CurrentPixel.R = 255; CurrentPixel.G = 255; CurrentPixel.B = 255; } else { CurrentPixel.R = 0; CurrentPixel.B = 0; CurrentPixel.G = 0; } } else { m = (int)CurrentPixel.R; m += Amount2; m += 1; m2 = 512 / m; m3 = m / m2; m = (int)(m / m2); if (m == m3) { CurrentPixel.R = 255; } else { CurrentPixel.R = 0; } m = (int)CurrentPixel.G; m += Amount2; m += 1; m2 = 512 / m; m3 = m / m2; m = (int)(m / m2); if (m == m3) { CurrentPixel.G = 255; } else { CurrentPixel.G = 0; } m = (int)CurrentPixel.B; m += Amount2; m += 1; m2 = 512 / m; m3 = m / m2; m = (int)(m / m2); if (m == m3) { CurrentPixel.B = 255; } else { CurrentPixel.B = 0; } } dst[x, y] = CurrentPixel; } } } Edited August 1, 2019 by toe_head2001 Rebuilt for Paint.NET v4 Quote Link to comment Share on other sites More sharing options...
MiguelPereira Posted August 17, 2007 Share Posted August 17, 2007 It crashed! :!: ------------------------------------------------------------------------ This text file was created because Paint.NET crashed. Please e-mail this file to paint.net@hotmail.com so we can diagnose and fix the problem. Application version: Paint.NET v3.10 (Beta 2 Release build 3.10.2779.25584) Time of crash: 17-08-2007 21:21:19 Application uptime: 00:01:14.7656250 OS Version: 5.1.2600.131072 Service Pack 2 Workstation x86 .NET Framework version: 2.0.50727.42 x86 Processor: 2x "Intel® Pentium® 4 CPU 3.00GHz" @ ~2991MHz (SSE, SSE2) Physical memory: 510 MB Tablet PC: no Locale: pdnr.c: pt-PT, hklm: pt-PT, hkcu: n/a, cc: pt-PT, cuic: pt-PT Exception details: PaintDotNet.WorkerThreadException: Worker thread threw an exception ---> System.DivideByZeroException: Attempted to divide by zero. at PaintDotNet.Effects.UserScript.Render(Surface dst, Surface src, Rectangle rect) at PaintDotNet.Effects.UserScript.Render(EffectConfigToken parameters, RenderArgs dstArgs, RenderArgs srcArgs, Rectangle[] rois, Int32 startIndex, Int32 length) at PaintDotNet.Effects.BackgroundEffectRenderer.RendererContext.RenderImpl() --- End of inner exception stack trace --- at PaintDotNet.Effects.BackgroundEffectRenderer.Join() at PaintDotNet.Effects.BackgroundEffectRenderer.Start() at PaintDotNet.Menus.EffectMenuBase.EffectConfigTokenChangedHandler(Object sender, EventArgs e) at PaintDotNet.Effects.EffectConfigDialog.OnEffectTokenChanged() at PaintDotNet.Effects.TwoAmountsConfigDialogBase.amount1Slider_ValueChanged(Object sender, EventArgs e) at System.Windows.Forms.TrackBar.OnValueChanged(EventArgs e) at System.Windows.Forms.TrackBar.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ------------------------------------------------------------------------------ Can you share the algorithm of the plugin?? Quote [The stock on my sig is a photo I took not a render from Splatter] [My deviantART][My Gallery][My Space] Link to comment Share on other sites More sharing options...
hollander Posted August 17, 2007 Author Share Posted August 17, 2007 thanks for telling me. I fixed it now, and added a icon: http://rapidshare.com/files/49636134/monochrome.dll.html (I have my reasons for not sharing the source code.) Quote Link to comment Share on other sites More sharing options...
Scyphrex Posted August 18, 2007 Share Posted August 18, 2007 Im going to try this plugin. Quote My Sitehttp://z4.invisionfree.com/blackskydesigns Link to comment Share on other sites More sharing options...
moc426 Posted August 18, 2007 Share Posted August 18, 2007 post some examples. and can you host it on a better location than rapidshare. Quote Link to comment Share on other sites More sharing options...
Yata Posted August 18, 2007 Share Posted August 18, 2007 Yes, rapidshare will delete your file after 90 days of not being downloaded, which, in the future, would be a very large annoyance. http://www.mediafire.com is a good hosting side. Also... zip the .dll. Some security software does not allow people to download .dlls. Anyway, besides all that, thank you for writing this plugin! Quote "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former" [ dA Paint.NET Chat :: Yata on dA ] Link to comment Share on other sites More sharing options...
Paint_boy Posted August 18, 2007 Share Posted August 18, 2007 I can't download it. Can someone just send me the direct DLL? Quote Link to comment Share on other sites More sharing options...
Yata Posted August 18, 2007 Share Posted August 18, 2007 Try this: http://www.mediafire.com/?bwgljdxdm3r Quote "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former" [ dA Paint.NET Chat :: Yata on dA ] Link to comment Share on other sites More sharing options...
pyrochild Posted August 18, 2007 Share Posted August 18, 2007 This text file was created because Paint.NET crashed. Please e-mail this file to paint.net@hotmail.com so we can diagnose and fix the problem. Application version: Paint.NET v3.10 (Beta 2 Release build 3.10.2779.25584) Time of crash: 8/17/2007 10:28:06 PM Application uptime: 00:00:33.8780000 OS Version: 6.0.6000.0 Workstation x86 .NET Framework version: 2.0.50727.1378 x86 Processor: 2x "Genuine Intel® CPU T2250 @ 1.73GHz" @ ~1729MHz (DEP, SSE, SSE2, SSE3) Physical memory: 1013 MB Tablet PC: no Locale: pdnr.c: en-US, hklm: en-US, hkcu: n/a, cc: en-US, cuic: en-US Exception details: PaintDotNet.WorkerThreadException: Worker thread threw an exception ---> System.DivideByZeroException: Attempted to divide by zero. at PaintDotNet.Effects.UserScript.Render(Surface dst, Surface src, Rectangle rect) at PaintDotNet.Effects.UserScript.Render(EffectConfigToken parameters, RenderArgs dstArgs, RenderArgs srcArgs, Rectangle[] rois, Int32 startIndex, Int32 length) at PaintDotNet.Effects.BackgroundEffectRenderer.RendererContext.RenderImpl() --- End of inner exception stack trace --- at PaintDotNet.Effects.BackgroundEffectRenderer.Join() at PaintDotNet.Effects.BackgroundEffectRenderer.Start() at PaintDotNet.Menus.EffectMenuBase.EffectConfigTokenChangedHandler(Object sender, EventArgs e) at PaintDotNet.Effects.EffectConfigDialog.OnEffectTokenChanged() at PaintDotNet.Effects.ThreeAmountsConfigDialogBase.amount3Slider_ValueChanged(Object sender, EventArgs e) at System.Windows.Forms.TrackBar.OnValueChanged(EventArgs e) at System.Windows.Forms.TrackBar.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ------------------------------------------------------------------------------ Quote ambigram signature by Kemaru [i write plugins and stuff] If you like a post, upvote it! Link to comment Share on other sites More sharing options...
Fisherman's Friend Posted August 18, 2007 Share Posted August 18, 2007 I used the plugin with several pics and it didn't crashed. I have PDN 3.08 (latest stable build). In my opinion the effect is very nice and can produce some good results. Thanks and credits for this, hollander . One thing for me to ask: Can it be moved to the submenu "Color"? That would make sense and it wouldn't take space directly in "effects", which is near to explode (and I don't use all of the plugins out there). Quote Link to comment Share on other sites More sharing options...
moc426 Posted August 18, 2007 Share Posted August 18, 2007 it crashes when you turn the brightness too far down or the ditter too far up. as it says below, you are dividing by zero in some cases. Exception details: PaintDotNet.WorkerThreadException: Worker thread threw an exception ---> System.DivideByZeroException: Attempted to divide by zero. at PaintDotNet.Effects.UserScript.Render(Surface dst, Surface src, Rectangle rect) at PaintDotNet.Effects.UserScript.Render(EffectConfigToken parameters, RenderArgs dstArgs, RenderArgs srcArgs, Rectangle[] rois, Int32 startIndex, Int32 length) at PaintDotNet.Effects.BackgroundEffectRenderer.RendererContext.RenderImpl() --- End of inner exception stack trace --- at PaintDotNet.Effects.BackgroundEffectRenderer.Join() at PaintDotNet.Effects.BackgroundEffectRenderer.Start() at PaintDotNet.Menus.EffectMenuBase.EffectConfigTokenChangedHandler(Object sender, EventArgs e) at PaintDotNet.Effects.EffectConfigDialog.OnEffectTokenChanged() at PaintDotNet.Effects.TwoAmountsConfigDialogBase.amount2Slider_ValueChanged(Object sender, EventArgs e) at System.Windows.Forms.TrackBar.OnValueChanged(EventArgs e) at System.Windows.Forms.TrackBar.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) Quote Link to comment Share on other sites More sharing options...
Paint_boy Posted August 19, 2007 Share Posted August 19, 2007 Eek! Awesome extension! I have some suggestions. 1. Use capitals 2. With the mode black white/color maybe do a check box labeled "Color?" and checking it would cause color. Eek! It crashes when I use it This text file was created because Paint.NET crashed. Please e-mail this file to paint.net@hotmail.com so we can diagnose and fix the problem. Application version: Paint.NET v3.10 (Beta 2 Release build 3.10.2779.25584) Time of crash: 8/19/2007 4:08:37 PM Application uptime: 00:00:49.4510000 OS Version: 6.0.6000.0 Workstation x86 .NET Framework version: 2.0.50727.312 x86 Processor: 2x "AMD Athlon 64 X2 Dual Core Processor 3800+" @ ~2003MHz (DEP, SSE, SSE2, SSE3) Physical memory: 2045 MB Tablet PC: no Locale: pdnr.c: en-US, hklm: en-US, hkcu: en-US, cc: en-US, cuic: en-US Exception details: PaintDotNet.WorkerThreadException: Worker thread threw an exception ---> System.DivideByZeroException: Attempted to divide by zero. at PaintDotNet.Effects.UserScript.Render(Surface dst, Surface src, Rectangle rect) at PaintDotNet.Effects.UserScript.Render(EffectConfigToken parameters, RenderArgs dstArgs, RenderArgs srcArgs, Rectangle[] rois, Int32 startIndex, Int32 length) at PaintDotNet.Effects.BackgroundEffectRenderer.RendererContext.RenderImpl() --- End of inner exception stack trace --- at PaintDotNet.Effects.BackgroundEffectRenderer.Join() at PaintDotNet.Effects.BackgroundEffectRenderer.Start() at PaintDotNet.Menus.EffectMenuBase.EffectConfigTokenChangedHandler(Object sender, EventArgs e) at PaintDotNet.Effects.EffectConfigDialog.OnEffectTokenChanged() at PaintDotNet.Effects.TwoAmountsConfigDialogBase.amount2Slider_ValueChanged(Object sender, EventArgs e) at System.Windows.Forms.TrackBar.OnValueChanged(EventArgs e) at System.Windows.Forms.TrackBar.set_Value(Int32 value) at PaintDotNet.Effects.TwoAmountsConfigDialogBase.amount2Reset_Click(Object sender, EventArgs e) at System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ------------------------------------------------------------------------------ Quote Link to comment Share on other sites More sharing options...
pyrochild Posted August 19, 2007 Share Posted August 19, 2007 4 crash logs on one page. I'd say you need to rethink something, hollander... Quote ambigram signature by Kemaru [i write plugins and stuff] If you like a post, upvote it! Link to comment Share on other sites More sharing options...
Crazy Man Dan Posted August 19, 2007 Share Posted August 19, 2007 I was unable to get it to crash, and the effect seems as if it could be quite useful (kind of like Threshold with configurable granularity). I have one nagging complaint: Please change "ditter" to "dither." Dither is the proper term for the effect the slider provides. Cheers! Quote I am not a mechanism, I am part of the resistance; I am an organism, an animal, a creature, I am a beast. ~ Becoming the Archetype Link to comment Share on other sites More sharing options...
Fisherman's Friend Posted August 19, 2007 Share Posted August 19, 2007 4 crash logs on one page. I'd say you need to rethink something, hollander... Hollander, you should mind sharing the source. There are a lot of good programmers here, they will find the problem. Quote Link to comment Share on other sites More sharing options...
hollander Posted August 20, 2007 Author Share Posted August 20, 2007 I cant figure out what makes it crashes, the values m and m2 are always higher than 1 int Amount1=0; //[0,1]mode: black/wite -- color int Amount2=128; //[0,255]brightness int Amount3=0; //[0,100]dither int m; float m2; float m3; int r; int g; int b; int r2; int g2; int b2; int mr=124; int mg=872; int mb=164; void Render(Surface dst, Surface src, Rectangle rect) { PdnRegion selectionRegion = EnvironmentParameters.GetSelection(src.Bounds); // Delete any of these lines you don't need Rectangle selection = this.EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt(); long CenterX = (long)(((selection.Right - selection.Left) / 2)+selection.Left); long CenterY = (long)(((selection.Bottom - selection.Top) / 2)+selection.Top); ColorBgra PrimaryColor = (ColorBgra)EnvironmentParameters.PrimaryColor; ColorBgra SecondaryColor = (ColorBgra)EnvironmentParameters.SecondaryColor; int BrushWidth = (int)EnvironmentParameters.BrushWidth; ColorBgra CurrentPixel; for(int y = rect.Top; y < rect.Bottom; y++) { for (int x = rect.Left; x < rect.Right; x++) { if (selectionRegion.IsVisible(x, y)) { CurrentPixel = src[x,y]; ColorBgra CurrentPixel2 = src[x,y]; r=mr; g=mg; b=mb; mr+=CurrentPixel2.R; mg+=CurrentPixel2.G; mb+=CurrentPixel2.B; CurrentPixel2.R=(byte)r; CurrentPixel2.G=(byte)g; CurrentPixel2.B=(byte)b; r=CurrentPixel2.R; g=CurrentPixel2.G; b=CurrentPixel2.B; r2=CurrentPixel.R; g2=CurrentPixel.G; b2=CurrentPixel.B; m=((r2*(100-Amount3)+(r*Amount3))/100); CurrentPixel.R=(byte)m; m=((g2*(100-Amount3)+(g*Amount3))/100); CurrentPixel.G=(byte)m; m=((b2*(100-Amount3)+(b*Amount3))/100); CurrentPixel.B=(byte)m; dst[x,y] = CurrentPixel; if (Amount1==0){ m=(int)((CurrentPixel.R+CurrentPixel.G+CurrentPixel.B)/3); m+=Amount2; m+=1; m2=512/m; m3=m/m2; m=(int)(m/m2); if (m==m3){ CurrentPixel.R=255;CurrentPixel.G=255;CurrentPixel.B=255;}else {CurrentPixel.R=0;CurrentPixel.B=0;CurrentPixel.G=0;}} if (Amount1==1){ m=(int)CurrentPixel.R; m+=Amount2; m+=1; m2=512/m; m3=m/m2; m=(int)(m/m2); if (m==m3){ CurrentPixel.R=255;}else {CurrentPixel.R=0;} m=(int)CurrentPixel.G; m+=Amount2; m+=1; m2=512/m; m3=m/m2; m=(int)(m/m2); if (m==m3){ CurrentPixel.G=255;}else {CurrentPixel.G=0;} m=(int)CurrentPixel.B; m+=Amount2; m+=1; m2=512/m; m3=m/m2; m=(int)(m/m2); if (m==m3){ CurrentPixel.B=255;}else {CurrentPixel.B=0;} } dst[x,y] = CurrentPixel; } } } } Quote Link to comment Share on other sites More sharing options...
jsonchiu Posted August 20, 2007 Share Posted August 20, 2007 Uh... you can't add a byte to a int. Quote Some links: | Personal Website | Alien Attack | Try out my plugins: | Antialias | Diagonal Lines | Link to comment Share on other sites More sharing options...
hollander Posted August 21, 2007 Author Share Posted August 21, 2007 Uh... you can't add a byte to a int. you can. Quote Link to comment Share on other sites More sharing options...
jsonchiu Posted August 21, 2007 Share Posted August 21, 2007 Anyways, when did this become 2 pages? :shock: My eyes are bad these days... Quote Some links: | Personal Website | Alien Attack | Try out my plugins: | Antialias | Diagonal Lines | Link to comment Share on other sites More sharing options...
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.