kbarni Posted December 11, 2007 Share Posted December 11, 2007 (edited) Hello, Here is a simple plugin to correct the barrel or pincushion distortions in digital photos. (More information about these distortions in wikipedia article) You can download the plugin here: kb_lens.zip To use it simply unzip it to c:/Program Files/Paint.NET/Effects/, the plugin is in Filters->Photo->Distortion Here is an example of the plugin usage. On the first photo you can see the effect of the lens distortion (I traced it with dotted red line), which was eliminated in the second image using the plugin: This effect is even stronger with macro shots, cheaper lenses on compact cameras and ultra-wide (fisheye) lenses. I wrote the plugin using Codelabs, if there is someone who would like to implement it in C# (in order to give a nice interface or to optimize it), i can post the source code. Edited June 20, 2020 by toe_head2001 Fixed attachment 1 Quote Link to comment Share on other sites More sharing options...
Fisherman's Friend Posted December 11, 2007 Share Posted December 11, 2007 1.) You should consider to add example pics. They make it easier to speak about it. And people want to see what they will get. 2.) You have done it with codelab? How about providing the source code? I would be interested. 1 Quote Link to comment Share on other sites More sharing options...
MadJik Posted December 11, 2007 Share Posted December 11, 2007 Yes, sure I may help you (if you want me to)... I already think about the IndirectUI features: ...Choose the center X,Y Offset, ...Keep background (yes/no, instead transparent) ...X,Y separated factors ...Limits +/- 500 (instead 50) : ok perhaps it's crazy, but just for the fun of distortion! Like I did here: viewtopic.php?f=5&t=21525 (you could use this source as a template by your own...) Let me(us) know... Quote My DeviantArt | My Pictorium | My Plugins | Donate via Paypal Link to comment Share on other sites More sharing options...
Rick Brewster Posted December 12, 2007 Share Posted December 12, 2007 Screenshots please! 1 Quote The Paint.NET Blog: https://blog.getpaint.net/ Donations are always appreciated! https://www.getpaint.net/donate.html Link to comment Share on other sites More sharing options...
pyrochild Posted December 12, 2007 Share Posted December 12, 2007 Is there any reason why the left and right edges of the image are left intact? 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 December 12, 2007 Share Posted December 12, 2007 Screenshots please! I made some. @Pyro: This issue is occuring when I use it, too. Edit: Please note: I forgot to change the language to English. To prevent confusion, "Abbrechen" is not a weird plugin-related button, but means just "Cancel". :wink: And please forgive me the bad quality of the pictures, but I want them to be suitable for all bandwiths. Quote Link to comment Share on other sites More sharing options...
kbarni Posted December 13, 2007 Author Share Posted December 13, 2007 Good people, here's the code for CodeLabs! Have fun playing with it, I hope you'll make it even cooler! int Amount1=-20; //[-50,50] Amount per thousand(°/oo) float [] rd = null; int Achange=0; //To verify if there is a slider change void Render(Surface dst, Surface src, Rectangle rect) { float Percent= (float)(Amount1 / 500.0f); // Distortion percent PdnRegion selectionRegion = EnvironmentParameters.GetSelection(src.Bounds); Rectangle selection = this.EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt(); int w,h,x0,y0,w2,h2,raymax; float xd,yd,rdcur,ru; w = selection.Right - selection.Left; h = selection.Bottom - selection.Top; x0=selection.Bottom;y0=selection.Right; h2=h/2;w2=w/2; raymax=(int)Math.Sqrt(h2*h2+w2*w2)+1; if(rd == null){ //first run->alloc and init rd = new float[raymax]; Init(raymax,Percent,w,h); }else if(Achange!=Amount1){ //slider change->reinit Achange=Amount1; Init(raymax,Percent,w,h); } for(int y = rect.Top; y < rect.Bottom; y++){ for (int x = rect.Left+1; x < rect.Right/2+1; x++){ //BUG: if it goes from rect.Left it gives an exception ru=(float)Math.Sqrt((float)((w2-x)*(w2-x)+(h2-y)*(h2-y))); rdcur=rd[(int)ru]*(1-ru+(float)Math.Floor(ru)) + rd[(int)ru+1]*(ru-(float)Math.Floor(ru)); rdcur/=ru; xd=(w2-x)*rdcur;yd=(h2-y)*rdcur; dst[x,y] = src.GetBilinearSample(w2-xd,h2-yd); dst[w-x,y] = src.GetBilinearSample(w2+xd,h2-yd); } //idea of optimisation: the function is symmetrical horizontally and vertically, //so at the same moment (x,y),(w-x,y),(x,h-y),(w-x,h-y) can be calculated } } void Init(int raymax, float percent, int w, int h) { //We precalculate the distortion function in rd double k,r,inc,ru1,ru0,m; int l; // *** Calculate K *** (k is the distortion constant based on the distortion %) double yd1,yd2,rd2,alfa; yd1=h/2; yd2=yd1*(1-percent); alfa=Math.Atan2(h,w); rd2=yd2/Math.Sin(alfa); k=(yd1-yd2)/(rd2*rd2*yd2-yd1*yd1*yd1); r=0; inc=0.1; l=1;rd[0]=0; while(l ru0=r+r*r*r*k; r+=0.1; ru1=r+r*r*r*k; if(Math.Floor(ru0)!=Math.Floor(ru1)){ m=(ru1-ru0)/inc; rd[l]=(float)(r-(ru1-Math.Floor(ru1))/m); l++; } } } Quote Link to comment Share on other sites More sharing options...
kbarni Posted December 13, 2007 Author Share Posted December 13, 2007 And sorry I didn't post any screenshots, here's mine, a real example with lens distortion: On the original I marked the distorted edgees with red dotted line. There are lenses with even stronger distortions (especially the wide angle zoom lenses). I hope you find this plugin usefull. Quote Link to comment Share on other sites More sharing options...
Fisherman's Friend Posted December 13, 2007 Share Posted December 13, 2007 Thanks! Quote Link to comment Share on other sites More sharing options...
MadJik Posted December 13, 2007 Share Posted December 13, 2007 Ok...This is the code with the new IndirectUIAdded:X,Y offset (strange effect)Quality levelChanged:Bug left/right seams solvedRange -/+ 500 Source : CameraLens.zipUpdated dll:CameraLens.zip Quote My DeviantArt | My Pictorium | My Plugins | Donate via Paypal Link to comment Share on other sites More sharing options...
kbarni Posted December 13, 2007 Author Share Posted December 13, 2007 I updated the original plugin, still using my codelabs version. You can download it in the original post! This fixes just the nasty edge bug, there is no other change. Thanks for the quick modification, MadJik, I think I'll modify your version too (when i'll have time)! Quote Link to comment Share on other sites More sharing options...
Rick Brewster Posted December 14, 2007 Share Posted December 14, 2007 There are some major rendering goof-ups if you move the center/offset around. It looks like the effect is not writing to every pixel in DstArgs, and so they just retain their old values. Quote The Paint.NET Blog: https://blog.getpaint.net/ Donations are always appreciated! https://www.getpaint.net/donate.html Link to comment Share on other sites More sharing options...
R3VENGE Posted January 1, 2008 Share Posted January 1, 2008 this will help making tv screens for my ut2k4 maps. im new to plugins but i have loads within one night lol. Quote psn id: R3V-fiR3 Link to comment Share on other sites More sharing options...
Red ochre Posted February 27, 2016 Share Posted February 27, 2016 I doubt kbarni is still visiting the forum, so not too much point in posting this?. (I was using it within a selection). Shame, as it is a useful effect. Thanks for posting the code, I may try to squash some bugs at some point. File: C:\Program Files\NEWpdn\Effects\kb_lens.dll Effect Name: PaintDotNet.Effects.UserScript Full error message: PaintDotNet.WorkerThreadException: Worker thread threw an exception ---> System.IndexOutOfRangeException: Index was outside the bounds of the array. Quote Red ochre Plugin pack.............. Diabolical Drawings ................Real Paintings Link to comment Share on other sites More sharing options...
Herbii Posted June 20, 2020 Share Posted June 20, 2020 Hi there! Trying to download this plugin but nothing works. It doesn't even download as a .zip? Quote Link to comment Share on other sites More sharing options...
toe_head2001 Posted June 20, 2020 Share Posted June 20, 2020 The file is a ZIP file, but was simply missing the .ZIP extension. I've fixed the attachment to resolve that. Quote My Gallery | My Plugin Pack Layman's Guide to CodeLab 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.