Jump to content


  • Content Count

  • Joined

  • Last visited

Posts posted by jchunn

  1. Try looking at some of the tutorials that perform anti-aliasing. Most of them have released their source.

    Yes, but every plugin other than this one is in C#, thus it would not be easy for him to exactly implement without a C# to VB.net translator, which even then the output is very shaky.

    I have no problem translating from one to the other... to translate from C# to VB all you have to do is delete the semicolons from the end of each line :lol:

    Seriously... I can do the translation... (how do ya think I got this far :) ) but I have looked at a few already, and the ones I have looked at seem to do it in different ways. I have only had time to look at a couple so far... so I'm still looking, but if anyone wants to point me to the best example, that would help. If not, I'll figure it out.

  2. Another idea:

    As I was updating the Random lines plugin, I found usefull the possibility to keep the lines as they are and play with the width.

    So you should add a reseed button in the list of suggestions...

    I already have that one on my list... good idea. Some properties are easier to edit in place (without reseeding automatically) than others. For example, alpha (which will be called intensity, and you have not seen it yet) will be easy to edit without reseeding. Width is a little more difficult, but possible, compared to frequency, which will be much more difficult (although still remotely possible if I make some relatively major changes).

    Right now, however, I am struggling with how to do anti-alias, which is the highest priority, and I have no clue how to do it. Any code that demonstrates that would be helpful... ?

  3. Edit:

    I'm not trying to troll your thread. I just think that Fisherman's Friend and I have a valid point...

    Agreed. I have never questioned the fact that your points are valid. In fact, as I mentioned, I debated these same points before I posted the plugin, which is why I stuck it in the "Object" menu, just to avoid cluttering up the top level of the effects menu while I thought it through (I personally dislike having 50 plugins in the top level menu, but maybe thats just me). The only point that I have disagreed with is that the output isn't based on the source... since it is. I really don't care where it goes in the menu system... if anyone actually wants to use it, they will probably be okay with either "distort" or "render" or "object" without too much concern. A nice enhancement for Paint.Net would be to allow the user to organize their own plugins.... but I have bigger fish to fry... so for now, I will put it in the render submenu in any future versions until further notice (right now it is in the distort menu in the current version of the code on my computer, so hopefully I won't forget to change it). If anyone else wants to debate that, I'm all ears, but that is not high on my priority list. Majik made some suggestions that I think require more of my brain cycles :?

    Thanks sincerely for the feedback.

  4. Actually, it "blends" with the existing pixels. . .

    Well, for the user it "feels" like a render. Tile Reflection really distorts the source, this one creates a new thing without using the source image.

    At least it looks that way for me.

    I understand your point... I really do... but even though it may look that way, especially on very dark or very light images... if you look closely, especially when the "width" is on a high setting, you can see that the "source" image is still visible, blended with the output. This is also clear in the code, if you are a coder. I might add an alpha slider (or intensity, or something like that) which would make that much easier to see, and add some flexibility. The source is absolutely a part of the output pixels.

    I agree that Tile Reflection clearly "distorts" the source (by moving pixels around), where this plugin simply modifies the pixels in place, which for many might seem to be less of a "distortion" and more of a "render"... that is why I was unsure of where to put it in the menu.


  5. Nice effect... Good to have now a source for VB! Thanks.

    Some suggestions (ideas):

    1. option for horizontal ?

    2. can you add the possibility to divide the lines (not only merging)

    3. quality slider...

    4. random width per line (or variable width)...

    5. frequency: low value, less lines, high value more lines, it's more natural in this way IMO.

    1. I can do that... it will take a little time to re-think the "top-to-bottom" logic, but not insurmountable. What would REALLY be difficult would be to let the user select an angle, at least given my implementation. Any suggestions on that would be welcome.

    2. It can be done... I have actually already given that some thought. Early attempts ran a high likelyhood of "re-merging", so I'll need to give that more thought to see how I can reduce that likelyhood.

    3. I'm sure I could look at other plugins to see how others have implemented that... but I am VERY open to suggestions on what quality "means" in this context. Anti-aliasing? Not sure... any advice is appreciated.

    4. I had an early version that did that... easy to implement... probably should be optional?

    5. Yes, I agree... that will be in any future versions.

    Also, I'll probably move it to the distort submenu.

  6. Hmmmm... I hadn't thought of that either.... good point about the y,x vs. x,y given the way the "rois" are passed in. While in theory, I had been focusing on the point that you cannot make assumptions about how the rois are passed in, I have observed that they are always (in my testing so far at least) are horizontal slices, very long in the x direction and very short in the y direction. Thanks for the tip.

  7. This should go into the Distort menu, not the Object menu.
    You mean Render, don't you? This plugin doesn't distort the existing pixels, it overwrites them with new information.

    Actually, it "blends" with the existing pixels.

    I debated with myself over which menu it should go in, between distort and render... and I see merit to both options, but I am leaning towards distort, only because that is where "Tile Reflection" is, which is probably the closest thing to this plugin among the built in effects.

  8. Ok, I have spent some time learning the plugin model to prove that plugins can be written for Paint.Net using Visual Basic.Net. Apparently, they can.
    They can be programmed in pretty much any .NET language. A quick search coulda told you that :P

    Yes, and I did do that search, and I did find those comments, and I knew it already, being an avid .net programmer... but Rick and some others had suggested that it "should" work in vb.net, so I set out to prove it... just for kicks. I have not seen any posts or plugins saying it had already been done, but I'm sure I could have missed it.


  9. MODERATORS NOTE:  this plugin has been superseded by a newer version:




    Download here

    Ok, I have spent some time learning the plugin model to prove that plugins can be written for Paint.Net using Visual Basic.Net. Apparently, they can.

    I am posting this here in hopes that some of you "gurus" will play with it and make suggestions. I am no graphic artist... I am a programmer, so if anyone finds this effect the least bit useful, I would LOVE to see any creations that use it.


    And here is the source (zipped)



    Jesse Chunn

  10. I have been playing with the effects api for a couple of days now... just trying to get something to work (and I have gotten something to work). I would deeply apprreciate it if somebody wouldn't mind taking a minute to review my comments below and provide some insight. Some of the folks here have obviously created some astounding plugins, and I think one of those folks could reply to this with their eyes closed. I have read through the forum, and I have toyed around with some of the plugin source that is available, but I am still not completely sure I have this right.

    Please correct any incorrect assumptions here:

    The "rois" variable (rectangles of interest, I presume) that is passed into the "OnRender" method appears to be at the heart of the multithreaded model. When the method is called, it looks like one or more rectangles are passed in via this "rois" array, and it looks like the expectation of the application is that the plugin will process the areas contained in the "rois" that are passed in, and only those areas, during that pass. It also appears that the "OnRender" method will be called multiple times for a single rendering, passing in different "rois" until the entire selected area (or is it the entire surface of the layer?) has been covered.

    If I am correct so far, then it appears that this must be looked at from the perspective of the "location" of each rectangle. In other words, the plugin could be asked to render an arbitrary location within the overall selection (although I assume logically that they are passed in from top to bottom?). The plugin, then, must use the location of the rectangle (and the pixels within that rectangle) relative to the overall selection or the overall layer, depending on what your plugin does.

    Again assuming I am right so far, then the x,y location of a pixel must be used in any math that determines how the effect acts on that pixel. While that is obviously true even in a single threaded implementation, the point is that you cant really use other variables within a loop (like i, for example) in the math, at least not easily, since i would start over at zero in each pass (unless, of course, you use relative position to set the initial value of i).

    I am just trying to verify how this works. My testing this far seems to verify what I have said, but I don't want to get too far along only to find that I have misunderstood something. Any commentary would be greatly appreciated.


  11. Another answer - just try:

    void Test()
       Image image = new Bitmap(16, 16);
       Graphics G = Graphics.FromImage(image);
       G.DrawLine(new Pen(Color.Red), 8, 1, 8, 2);

    I'm not sure what you are trying to say here. The code you posted specifies the following:

    Line Starting point: 8,1

    Line Ending point: 8,2

    None of the arguments provided to the Drawline method specify "length", they are x,y coordinates for the beginning and end of the line (x1, y1, x2, y2).

    As for the tree analogy...

    Tree = border of a pixel

    Space between trees = pixel

    100 "trees" would be 99 "spaces", right?

    If that is true, then 3 "trees" would be 2 "spaces", right?

    If that is true, then a line on the screen that has a length of 2 would have 3 "trees" (or borders) and 2 "spaces" (or pixels), right?

  12. I would have to agree that if a line "contains" two pixels in its' length, it is two pixels long.

    A ruler is 12 inches long... it is measured from the beginning of the ruler to the end, and "contains" 12 full inches... you don't start from the end of the first inch.

    Other graphics programs measure length in those terms. That does not mean that this is not by design, but if it is, it is less intuitive to me than I would like.

    Just my two cents. The author of the software may have a reason for this that I am unaware of.

  13. Here is my rant...

    I hate it when people stop in inappropriate places. For example, on a crowded escalator at the airport, someone takes one step off of the end, and stops and looks around, lost. Everybody behind them is now struggling to get around them, with bags and kids and whatever. The person still just stands there, like an idiot, with people bumping into them and pushing past them. It's not like the other people on the escalator have a choice and can stop while you ponder your next move... the escalator is pushing forward, and all those people are coming, like it or not. Next time you're in an airport, just watch the end of a busy escalator for 5 minutes... it really is comical how inconsiderate people can be.

    Same thing at the door of big buildings. People take one step inside the door and then just stand there... sometimes looking around, lost, and other times talking to someone. Everybody else is trying to get into the building, and these people just stand there as everybody "scoots" past them as best they can. Move, for gods sake. You are standing right in the middle of a "bottleneck".

    And then there are grocery store isles and people with their basket on one side, their big butt on the other, and they seem totally oblivious to the fact that you are coming down the isle with your own basket... and obviously need to get by. They just continue to look at the various brands of olive-oil... for endless minutes... as if it is critical that they get just the right brand and size, reading each label carefully, and they cannot think it through without blocking the entire isle.

    And then there are people that drive hummers in the city... and people that must be within two inches of your bumper on a 4 lane highway in the slow lane when there are no other cars around... and people that sit in an intersection talking on the phone and then pull out in front of you at the last second even though there is not another car in front of or behind you for miles.... and people that ... well ... you get the picture.

    The word of the day is "considerate". Be considerate of other people. "Consider" the fact that you might not be the only person in the world. Consider that fact that I think what I am doing is just as important to me as what you are doing is to you. Consider the fact that one person out of a hundred will actually attack you physically for being an inconsiderate jerk.


  14. You can stand around and predict rain, or you can get busy building an ark.

    Software eventually works... hardware eventually fails.

    Extraordinary people are just ordinary people with an extraordinary amount of determination.

    Don't put off till tomorrow what your wife will gripe about today.

    If you can't figure out who the sucker is at the poker table within 30 minutes... it's YOU.

    A stitch in time saves a lot of unnecessary bleeding.

    If you think things need to change, change them.

    If you reduce taxes without reducing spending, then you are in effect increasing the deficit.

    The only reason for time is so that everything doesn't happen at once.

    My wife ran off with my best friend, and I sure do miss him.

    Those with the largest number of home runs also have the highest number of strike outs (look it up), so quit waiting for the perfect pitch and swing already.

    What better time than now? What better place than here?

    People that complain that they never have enough time to get everything done spend too much of their time complaining and not enough of their time getting stuff done.

    Next time you are on the road, look around. There are more people on the phone than not. I'm not against talking on the phone when you drive, but get an earpiece and a voice-dial phone, for everybodies sake.

    Ok, these are becoming more like rants than philosophy, so I'll stop now, but I could go on for days ;)

  15. When I try to open some images (by clicking the "open" icon on the toolbar or using the file-> open menu), I get the file-open dialog, select a file, click the "open" button, and PDN locks up (screen does not respond to mouse, does not repaint) for about 45 seconds or so, then it gives me a message stating that PDN has experienced an error and must close... and I should refer to the pdncrash.log on my desktop.

    The application has been working fine and opening images fine for the two weeks or so that I have had it. I have mostly been creating images from scratch, so I can't say exactly what percentage of open attempts result in this issue. I have opened several images successfully, for sure, so it does not always do this.

    I am attaching an image that it has happened on several times. I tried to attach the log file, but for some reason, the forum wouldn't let me, so I am pasting it below. I DID reboot and try to open the attached file immediately afterwards, and still had the problem, so I don't think it is a corrupt memory issue (suggested in the log), since I didn't do anything to corrupt any memory (unless it is PDN that is corrupting the memory when trying to open this file?).

    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.22 (Final Release build 3.22.2933.24445)

    Time of crash: 1/28/2008 9:48:50 PM

    Application uptime: 00:01:44.6562500

    OS Version: 5.1.2600.131072 Service Pack 2 Workstation x86

    .NET Framework version: 2.0.50727.1433 x86

    Processor: 2x "Genuine Intel® CPU T2300 @ 1.66GHz" @ ~1672MHz (SSE, SSE2)

    Physical memory: 1014 MB

    Tablet PC: no

    Updates: true, 1/27/2008

    Locale: pdnr.c: en-US, hklm: en-US, hkcu: n/a, cc: en-US, cuic: en-US

    Loaded assemblies:

    mscorlib, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089 @ C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll

    PaintDotNet, Version=3.22.2933.24445, Culture=neutral, PublicKeyToken=null @ C:\Program Files\Paint.NET\PaintDotNet.exe

    System.Windows.Forms, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089 @ C:\WINDOWS\assembly\GAC_MSIL\System.Windows.Forms\\System.Windows.Forms.dll

    System, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089 @ C:\WINDOWS\assembly\GAC_MSIL\System\\System.dll

    System.Drawing, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @ C:\WINDOWS\assembly\GAC_MSIL\System.Drawing\\System.Drawing.dll

    PaintDotNet.Core, Version=3.22.2933.24442, Culture=neutral, PublicKeyToken=null @ C:\Program Files\Paint.NET\PaintDotNet.Core.dll

    PaintDotNet.Base, Version=3.22.2933.24440, Culture=neutral, PublicKeyToken=null @ C:\Program Files\Paint.NET\PaintDotNet.Base.dll

    PaintDotNet.SystemLayer, Version=3.22.2933.24441, Culture=neutral, PublicKeyToken=null @ C:\Program Files\Paint.NET\PaintDotNet.SystemLayer.dll

    PaintDotNet.Resources, Version=3.22.2933.24441, Culture=neutral, PublicKeyToken=null @ C:\Program Files\Paint.NET\PaintDotNet.Resources.dll

    PaintDotNet.Data, Version=3.22.2933.24442, Culture=neutral, PublicKeyToken=null @ C:\Program Files\Paint.NET\PaintDotNet.Data.dll

    PaintDotNet.Effects, Version=3.22.2933.24443, Culture=neutral, PublicKeyToken=null @ C:\Program Files\Paint.NET\PaintDotNet.Effects.dll

    CodeLab, Version=3.20.2933.30843, Culture=neutral, PublicKeyToken=null @ C:\Program Files\Paint.NET\Effects\CodeLab.dll

    Feather, Version=, Culture=neutral, PublicKeyToken=null @ C:\Program Files\Paint.NET\Effects\Feather.dll

    stdWoodTexture, Version=, Culture=neutral, PublicKeyToken=null @ C:\Program Files\Paint.NET\Effects\stdWoodTexture.dll

    Microsoft.VisualBasic, Version=, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @ C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualBasic\\Microsoft.VisualBasic.dll

    System.Xml, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089 @ C:\WINDOWS\assembly\GAC_MSIL\System.Xml\\System.Xml.dll

    DdsFileType, Version=1.11.2933.24444, Culture=neutral, PublicKeyToken=null @ C:\Program Files\Paint.NET\FileTypes\DdsFileType.dll

    Exception details:

    System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

    at System.Windows.Forms.UnsafeNativeMethods.GetOpenFileName(OPENFILENAME_I ofn)

    at System.Windows.Forms.OpenFileDialog.RunFileDialog(OPENFILENAME_I ofn)

    at System.Windows.Forms.FileDialog.RunDialogOld(IntPtr hWndOwner)

    at System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner)

    at System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner)

    at PaintDotNet.SystemLayer.ClassicFileDialog.<>c__DisplayClass3.b__1(IWin32Window modalOwner)

    at PaintDotNet.SystemLayer.UI.<>c__DisplayClass4.b__0(Object sender, EventArgs e)

    at System.Windows.Forms.Form.OnShown(EventArgs e)

    at System.Windows.Forms.Form.CallShownEvent()

    at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)

    at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)

    at System.Threading.ExecutionContext.runTryCode(Object userData)

    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)

    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)

    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

    at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)

    at System.Windows.Forms.Control.InvokeMarshaledCallbacks()



  16. Nice tutorial for a beginner like me (pretty good with Image Composer, but this is my first try with PDN).

    Since the post was called "How to make ... Insides", I was going for something that looked kinda like what "muscles" look like if you peel back skin.

    Applying "sharpen" a few times gave me the texture I was after.


  • Create New...