Jump to content

TechnoRobbo

Members
  • Posts

    1,740
  • Joined

  • Last visited

  • Days Won

    132

Everything posted by TechnoRobbo

  1. Find the most recent version here: ShapeMaker SVG (Scalable Vector Graphics) Shapes Lines and Curves for PDN 4.0.6 + Version 1.2.3+ Fix for HDPI Zoom and UI scaling Change Log Hidden Content: Version 1.2.1+ adds Fix for Circle Macro Crash Version 1.2.1+ adds Updated Manuals New Grid for easier alignment. Cubic Spline Macro Button Close Individual Path & Close Contiguous Paths 2 new WYSIWYG handle markers: Triangle marker for contiguous lines link Box marker for Paths closure Path List prefixes: "Z" and "MZ" indications for Close Path Node (nub) and Path count in Status Bar 4X & 8X Zoom bug fixes (Special Thanks to Rick Brewster for the cubic spline code based on the works of Oleg V. Polikarpotchkin) Version 1.0.6+ adds 4X Zoom and more ToolTips Version 1.0.5+ Fixes Smooth Quadratic Bug Version 1.0.3+ HDPI Updated - Special Thanks to Midora for helping with the testing. The Dwarf Horde Rob Tauler (TechnoRobbo) - Code Lead, Design John Robbins (Red Ochre) - Graphics Lead, Design Scott Stringer (Ego Eram Reputo) - Documentation Lead, Design David Issel (BoltBait) - Beta Testing, Design Foreword The ShapeMaker plugin is a tool which facilitates the creation of SVG (Scalable Vector Graphics) Shapes, Lines and Curves. The tool itself uses a WYSIWYG interface where Lines, Curves and entire Paths can be created and manipulated using just the mouse. Knowledge of the complex SVG structure is not required. ShapeMaker will create all that complex stuff for you and generate the Shape, code, or a complete reusable file. Why did we write this plugin? We wanted to create an easy-to-use click-and-drag interface which could create custom Shapes that paint.net itself could reuse via the new Shapes tool. That's right. Paint.net 4.0.6+ allows the user to add their own Shapes to the Shapes tool set. Not only can ShapeMaker Shapes be reused, the valid SVG generated can be pasted into HTML documents for modern browsers to render. We hope you like ShapeMaker! Video Tutorials http://forums.getpaint.net/index.php?/topic/32198-shapemaker-tutorials/?p=430223
  2. Start with a larger image than you intend. 2000 X 2000 pixel is common. us Gaussian blur to smooth out sharp edges
  3. My thoughts exactly I like the Spin & Fade Idea
  4. V1.1 ready for download Exports frames !!! Thanks to racerX New video coming to show how to use it to create animation
  5. Can be done but due to the limitation of PDN plugins it would export files that would be imported from the Layer menu using "Import from Files" (multiple files can be selected).
  6. TechnoRobbo's KeyFrame v1.2 an animation assistant for Midora's Animated images http://forums.getpaint.net/index.php?/topic/31629-animated-images/?p=424663 KeyFrame v1.1 exports frames Hidden Content: // Submenu: Object // Name: TR's Keyframe // Title: TR's Keyframe- v1.2 // Author: TechnoRobbo // URL: http://www.technorobbo.com #region UICode Pair<double, double> Amount1 = Pair.Create( 0.0 , 0.0 ); // Start Pair<double, double> Amount2 = Pair.Create( 0.0 , 0.0 ); // Via Point Pair<double, double> Amount3 = Pair.Create( 0.0 , 0.0 ); // End double Amount4 = 0; // [0,1] Time double Amount5 = 0.75; // [0.1,1.5] Path Shape bool Amount6 = false; // [0,1] Show Path int Amount7 = 10; // [1,100] Export count byte Amount8 = 0; // [255] Export Frames double Amount9 = 0; // [-2,2] Start Rotation double Amount10 = 0; // [-2,2] End Rotation double Amount11 = 1; // [0.01,2] Start Size double Amount12 = 1; // [0.01,2] End Size #endregion byte LastButton=0; String cboard; PointF[] spline(PointF p0, PointF p1, PointF p2, float tension) { PointF[] arr = {p0,p1,p2}; PointF[] PointArray = new PointF[0]; using (System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath()) { gp.AddCurve(arr, tension); gp.Flatten(null, .01f); PointArray = new PointF[gp.PointCount]; PointArray = gp.PathPoints; } return PointArray; } public void SaveImages() { System.Windows.Forms.SaveFileDialog SaveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); string fp = Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); SaveFileDialog1.InitialDirectory=fp; SaveFileDialog1.Filter = "PNG file (*.png)|*.png" ; SaveFileDialog1.FilterIndex = 1 ; SaveFileDialog1.RestoreDirectory = false ; if(SaveFileDialog1.ShowDialog() == DialogResult.OK) { cboard = SaveFileDialog1.FileName; }else{ cboard = String.Empty; } } void Render(Surface dst, Surface src, Rectangle rect) { if (IsCancelRequested)return; SignalCancelRequest(); float hw = (float)src.Width / 2f; float hh = (float)src.Height / 2f; float timeline = (float)Amount4; PointF start= new PointF((float)Amount1.First * hw + hw , (float)Amount1.Second * hh + hh); System.Drawing.Point istart= new System.Drawing.Point((int)-start.X,(int)-start.Y); PointF via = new PointF((float)Amount2.First * hw + hw , (float)Amount2.Second * hh + hh); PointF dest = new PointF((float)Amount3.First * hw + hw , (float)Amount3.Second * hh + hh); float idx = 1f / (float)Amount7; float rot = (float)Amount10 * timeline + (float)Amount9 - (float)Amount9 * timeline; float scale = (float)Amount12 * timeline + (float)Amount11 - (float)Amount11 * timeline; PointF[] arr = spline(start,via,dest,(float)Amount5); PointF midC = arr[ (int)(timeline * (arr.Length - 1))]; Surface Moved = src.Clone(); Surface shift = src.Clone(); shift.Clear(ColorBgra.Transparent); shift.CopySurface(src,new System.Drawing.Point(src.Width / 2 - (int)start.X, src.Height / 2 - (int)start.Y)); Moved.Clear(ColorBgra.Transparent); dst.Clear(ColorBgra.Transparent); if (LastButton!=Amount8){ LastButton=Amount8; System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(SaveImages)); t.SetApartmentState(System.Threading.ApartmentState.STA); t.Start(); t.Join(); if (cboard != String.Empty) { int count=0; for (float i = 0; i<1; i +=idx) { PointF midB = arr[ (int)(i * (arr.Length - 1))]; rot = (float)Amount10 * i + (float)Amount9 - (float)Amount9 * i; scale = (float)Amount12 * i + (float)Amount11 - (float)Amount11 * i; Moved.Clear(ColorBgra.Transparent); using (Bitmap bmp = new RenderArgs(shift).Bitmap) { using(Graphics g = new RenderArgs(Moved).Graphics) { System.Drawing.Imaging.ColorMatrix cm = new System.Drawing.Imaging.ColorMatrix(); cm.Matrix33 = 1f;//(Amount6) ? .5f: 1f; System.Drawing.Imaging.ImageAttributes ia = new System.Drawing.Imaging.ImageAttributes(); ia.SetColorMatrix(cm, System.Drawing.Imaging.ColorMatrixFlag.Default, System.Drawing.Imaging.ColorAdjustType.Bitmap); RectangleF pa = new RectangleF(0,0,bmp.Size.Width,bmp.Size.Height); g.DrawImage(bmp, rotateimage(midB.X,midB.Y,bmp.Size, scale ,rot),pa,GraphicsUnit.Pixel,ia); ia.Dispose(); } } string dboard = cboard.Replace(".", String.Format("{0}.",count++)); using (Bitmap tmp =new RenderArgs(Moved).Bitmap )tmp.Save(dboard); } } Moved = src.Clone(); } else { if (Amount6)dst.CopySurface(src); using(Graphics g = new RenderArgs(Moved).Graphics) { using (Bitmap bmp = new RenderArgs(shift).Bitmap) { System.Drawing.Imaging.ColorMatrix cm = new System.Drawing.Imaging.ColorMatrix(); cm.Matrix33 =(Amount6) ? .5f: 1f; System.Drawing.Imaging.ImageAttributes ia = new System.Drawing.Imaging.ImageAttributes(); ia.SetColorMatrix(cm, System.Drawing.Imaging.ColorMatrixFlag.Default, System.Drawing.Imaging.ColorAdjustType.Bitmap); RectangleF pa = new RectangleF(0,0,bmp.Size.Width,bmp.Size.Height); g.DrawImage(bmp, rotateimage(midC.X,midC.Y,bmp.Size, scale ,rot),pa,GraphicsUnit.Pixel,ia); ia.Dispose(); if (Amount6)g.DrawCurve(Pens.Red,arr); } } } LastButton=Amount8; using (Graphics dg = new RenderArgs(dst).Graphics ) { using (Bitmap Dbmp = new RenderArgs(Moved).Bitmap) { dg.DrawImage(Dbmp ,0f,0f); } } Moved.Dispose(); shift.Dispose(); } private System.Drawing.PointF[] rotateimage(float x, float y, System.Drawing.Size board,float scale, float rotate) { System.Drawing.PointF[] points = new System.Drawing.PointF[3]; float rot = rotate * (float)Math.PI; float cos = (float)Math.Cos(rot); float sin = (float)Math.Sin(rot); float width = board.Width * scale; float height = board.Height * scale; float left = width / -2; float top = height / -2; float right = width / 2; float bottom = height / 2; points[0] = new System.Drawing.PointF(left * cos - top * sin + x, top * cos + left * sin + y); points[1]= new System.Drawing.PointF(right * cos - top * sin + x, top * cos + right * sin + y); points[2]= new System.Drawing.PointF(left * cos - bottom * sin + x, bottom * cos + left * sin + y); return points; } TRsKeyFrame.zip
  7. Like this?? (it's not the Morph Plugin) http://forums.getpaint.net/index.php?/topic/32090-trs-keyframe/?p=429141
  8. How about this [updated in subsequent Post]
  9. No you don't. I think we just aren't used to our own voice.
  10. @Eli - No way. Is that real? @Maximillian why so blue, cheer up. POST EDIT: That dogs wearing a costume
  11. Really? I hate my recorded voice. I always sound drunk. Maybe it's my Midwest accent.
  12. I can't repro this. Can you provide more detail? How are you deselecting and selecting a layer? I'm clicking in the layers window and I can only "select" a layer. Did you mean deleting a layer? I would think not since you can reselect it.
  13. Your Welcome Seerose. meh Bridget Bardot = classic beauty.
  14. Thanks DD, there is a new plugin from the Dwarf Horde that's taken most of my programming time. It will be available soon.
  15. Your welcome Pixey, one tip lower detail is more effective than any other setting. Thanks barbieQ - Selfie? That's actually Angela Merkel in the pic. This is me https://www.dropbox.com/s/klwc3swv5dj9r7g/Selfie.JPG?raw=1
  16. Thanks racerx - I'm sure your aging gracefully Your Welcome Miss Nite Nurse 79, obviously you won't use it on your selfies.
  17. NSA had the selfie as soon as she took it. Darn it , I forgot to post the code. Eli, you ain't seen nothing yet.
  18. TechnoRobbo's Portrait Retoucher So you took the perfect selfie but forgot to put on your makeup? There's no need fear, TR's Portrait Retoucher is here! Take years off your photo - instantly reduces blemishes. Very Intuitive controls. All for one low easy payment of $0.00 USD *Shipping and handling not included. Menu: Effects -> Photo https://www.dropbox.com/s/59c1km27c111rws/merkelRetouch.png?raw=1 TRsRetouch.zip CodeLab Source Code Hidden Content: // Submenu: Photo // Name: TR's Portrait Retouch // Title: TR's Portrait Retouch- v1.0 // Author: TechnoRobbo // URL: http://www.technorobbo.com #region UICode int Amount1 = 10; // [3,20] Amount double Amount2 = 0; // [0,1] Diffusion int Amount3 = 8; // [0,64] Brightness double Amount4 = 2; // [0.5,2] Reduce Detail #endregion private ColorBgra ClampMe(ColorBgra x,int plus) { int nR = x.R + plus, nG = x.G + plus, nB = x.B + plus; nR = (nR > 255)?255:nR; nG = (nG > 255)?255:nG; nB = (nB > 255)?255:nB; return ColorBgra.FromBgr((byte)nB,(byte)nG,(byte)nR); } void Render(Surface dst, Surface src, Rectangle rect) { GaussianBlurEffect blurEffect = new GaussianBlurEffect(); PropertyCollection bProps = blurEffect.CreatePropertyCollection(); PropertyBasedEffectConfigToken bParameters = new PropertyBasedEffectConfigToken(bProps); bParameters.SetPropertyValue(GaussianBlurEffect.PropertyNames.Radius, Amount1); blurEffect.SetRenderInfo(bParameters, new RenderArgs(dst), new RenderArgs(src)); blurEffect.Render(new Rectangle[1] {rect},0,1); ColorBgra cp,ct; for (int y = rect.Top; y < rect.Bottom; y++) { if (IsCancelRequested) return; for (int x = rect.Left; x < rect.Right; x++) { cp = src[x,y]; ct = dst[x,y]; double k = (1 - Math.Pow(cp.GetIntensity(), Amount4)) * (1 - Amount2); ct.R = (byte)(k * (double)cp.R + (double)ct.R - k * (double)ct.R); ct.G = (byte)(k * (double)cp.G + (double)ct.G - k * (double)ct.G); ct.B = (byte)(k * (double)cp.B + (double)ct.B - k * (double)ct.; ct.A = (byte)cp.A; dst[x,y] = ClampMe(ct, Amount3); } } }
×
×
  • Create New...