Image Warper App : Icon Image « 2D Graphics « C# / C Sharp






Image Warper App

Image Warper App
 
/*
Code revised from chapter 6


GDI+ Custom Controls with Visual C# 2005
By Iulian Serban, Dragos Brezoi, Tiberiu Radu, Adam Ward 

Language English
Paperback 272 pages [191mm x 235mm]
Release date July 2006
ISBN 1904811604

Sample chapter
http://www.packtpub.com/files/1604_CustomControls_SampleChapter.pdf



For More info on GDI+ Custom Control with Microsoft Visual C# book 
visit website www.packtpub.com 

*/ 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace ImageWarperApp
{
    public partial class Form1 : Form
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void applyButton_Click(object sender, EventArgs e)
        {
            imageWarperControl1.ImageAngle = Double.Parse(angleBox.Text) * System.Math.PI / 180;
            imageWarperControl1.ImageScale = Double.Parse(scaleBox.Text) / 100;
            imageWarperControl1.ImageSkew = new SizeF(float.Parse(skewHorizontalBox.Text), float.Parse(skewVerticalBox.Text));

        }

        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.angleBox = new System.Windows.Forms.TextBox();
            this.scaleBox = new System.Windows.Forms.TextBox();
            this.skewHorizontalBox = new System.Windows.Forms.TextBox();
            this.skewVerticalBox = new System.Windows.Forms.TextBox();
            this.label1 = new System.Windows.Forms.Label();
            this.label2 = new System.Windows.Forms.Label();
            this.label3 = new System.Windows.Forms.Label();
            this.label4 = new System.Windows.Forms.Label();
            this.applyButton = new System.Windows.Forms.Button();
            this.imageWarperControl1 = new ImageWarperApp.ImageWarperControl();
            this.SuspendLayout();
            // 
            // angleBox
            // 
            this.angleBox.Location = new System.Drawing.Point(128, 42);
            this.angleBox.Name = "angleBox";
            this.angleBox.Size = new System.Drawing.Size(100, 20);
            this.angleBox.TabIndex = 1;
            // 
            // scaleBox
            // 
            this.scaleBox.Location = new System.Drawing.Point(128, 100);
            this.scaleBox.Name = "scaleBox";
            this.scaleBox.Size = new System.Drawing.Size(100, 20);
            this.scaleBox.TabIndex = 2;
            // 
            // skewHorizontalBox
            // 
            this.skewHorizontalBox.Location = new System.Drawing.Point(128, 157);
            this.skewHorizontalBox.Name = "skewHorizontalBox";
            this.skewHorizontalBox.Size = new System.Drawing.Size(100, 20);
            this.skewHorizontalBox.TabIndex = 3;
            // 
            // skewVerticalBox
            // 
            this.skewVerticalBox.Location = new System.Drawing.Point(128, 217);
            this.skewVerticalBox.Name = "skewVerticalBox";
            this.skewVerticalBox.Size = new System.Drawing.Size(100, 20);
            this.skewVerticalBox.TabIndex = 4;
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(7, 45);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(104, 13);
            this.label1.TabIndex = 5;
            this.label1.Text = "Rotation Angle (deg)";
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Location = new System.Drawing.Point(7, 103);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(84, 13);
            this.label2.TabIndex = 6;
            this.label2.Text = "Scale Factor (%)";
            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.Location = new System.Drawing.Point(7, 160);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(117, 13);
            this.label3.TabIndex = 7;
            this.label3.Text = "Skew Horizontal Factor";
            // 
            // label4
            // 
            this.label4.AutoSize = true;
            this.label4.Location = new System.Drawing.Point(7, 220);
            this.label4.Name = "label4";
            this.label4.Size = new System.Drawing.Size(105, 13);
            this.label4.TabIndex = 8;
            this.label4.Text = "Skew Vertical Factor";
            // 
            // applyButton
            // 
            this.applyButton.BackColor = System.Drawing.SystemColors.ActiveCaption;
            this.applyButton.Location = new System.Drawing.Point(61, 285);
            this.applyButton.Name = "applyButton";
            this.applyButton.Size = new System.Drawing.Size(118, 34);
            this.applyButton.TabIndex = 9;
            this.applyButton.Text = "Apply New Settings";
            this.applyButton.UseVisualStyleBackColor = false;
            this.applyButton.Click += new System.EventHandler(this.applyButton_Click);
            // 
            // imageWarperControl1
            // 
            this.imageWarperControl1.ImageAngle = 0;
            this.imageWarperControl1.ImageScale = 0;
            this.imageWarperControl1.ImageSkew = new System.Drawing.SizeF(0F, 0F);
            this.imageWarperControl1.Location = new System.Drawing.Point(253, 45);
            this.imageWarperControl1.Name = "imageWarperControl1";
            this.imageWarperControl1.Size = new System.Drawing.Size(185, 192);
            this.imageWarperControl1.TabIndex = 0;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(450, 342);
            this.Controls.Add(this.applyButton);
            this.Controls.Add(this.label4);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.skewVerticalBox);
            this.Controls.Add(this.skewHorizontalBox);
            this.Controls.Add(this.scaleBox);
            this.Controls.Add(this.angleBox);
            this.Controls.Add(this.imageWarperControl1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private ImageWarperControl imageWarperControl1;
        private System.Windows.Forms.TextBox angleBox;
        private System.Windows.Forms.TextBox scaleBox;
        private System.Windows.Forms.TextBox skewHorizontalBox;
        private System.Windows.Forms.TextBox skewVerticalBox;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.Label label4;
        private System.Windows.Forms.Button applyButton;
        
    }
    public partial class ImageWarperControl : UserControl
    {
        public ImageWarperControl()
        {
            InitializeComponent();
        }

        private void ImageWarperControl_Load(object sender, EventArgs e)
        {
            
            img = CreatePicture();
        }

        private void ImageWarperControl_Paint(object sender, PaintEventArgs e)
        {
                  // set up all our parameters first before calling DrawWarpedPicture.
      Graphics target = this.CreateGraphics(); //draw onto the form's surface
      PointF pivotOnImage = new PointF(img.Width / 2, img.Height / 2);
      PointF pivotOnTarget = new PointF(this.Width / 2, this.Height / 2);
      double rotate = imageAngle;
      double scaleFactor = imageScale;
      SizeF skewing = imageSkew;
      DrawWarpedPicture(target, img, pivotOnImage, pivotOnTarget, rotate, scaleFactor, skewing);
       }
        private Image CreatePicture()
        {
            // Create a new Bitmap object, 50 x 50 pixels in size
            Image canvas = new Bitmap(50, 50);
            // create an object that will do the drawing operations
            Graphics artist = Graphics.FromImage(canvas);
            // draw a few shapes on the canvas picture
            artist.Clear(Color.Lime);
            artist.FillEllipse(Brushes.Red, 3, 30, 30, 30);
            artist.DrawBezier(new Pen(Color.Blue, 3), 0, 0, 40, 15, 10, 35, 50, 50);
            // now the drawing is done, we can discard the artist object
            artist.Dispose();
            // return the picture
            return canvas;
        }
        public void DrawWarpedPicture(
            Graphics surface,   //the surface to draw on
            Image img,    //the image to draw
            PointF sourceAxle,  //pivot point passing through image.
            PointF destAxle,  //pivot point's position on destination surface
            double degrees,  //degrees through which the image is rotated clockwise
            double scale,     //size multiplier
            SizeF skew      //the slanting effect size, applies BEFORE scaling or rotation
          )
        {
            //give this array temporary coords that will be overwritten in the loop below
            //the skewing is done here orthogonally, before any trigonometry is applied
            PointF[] temp = new PointF[3] {  new PointF(skew.Width, -skew.Height),
                    new PointF((img.Width - 1) + skew.Width, skew.Height),
                    new PointF(-skew.Width,(img.Height - 1) - skew.Height) };
            double ang, dist;
            //convert the images corner points into scaled, rotated, skewed and translated points
            for (int i = 0; i < 3; i++)
            {
                //measure the angle to the image's corner and then add the rotation value to it
                ang = GetBearingRadians(sourceAxle, temp[i], out dist) + degrees;
                dist *= scale; //scale
                temp[i] = new PointF((Single)((Math.Cos(ang) * dist) + destAxle.X), (Single)((Math.Sin(ang) * dist) + destAxle.Y));
            }
            surface.DrawImage(img, temp);
        }
        private static double GetBearingRadians(PointF reference, PointF target, out double distance)
        {
            double dx = target.X - reference.X;
            double dy = target.Y - reference.Y;
            double result = Math.Atan2(dy, dx);
            distance = Math.Sqrt((dx * dx) + (dy * dy));
            if (result < 0)
                result += (Math.PI * 2); //add  the negative number to 360 degrees to correct the atan2 value
            return result;
        }
        private double imageAngle;
        private double imageScale;
        private SizeF imageSkew;
        private Image img = null;
        public double ImageAngle
        {
            get
            {
                return imageAngle;
            }
            set
            {
                if (imageAngle != value)
                {
                    imageAngle = value;
                    Invalidate();
                }
            }
        }
        public double ImageScale
        {
            get
            {
                return imageScale;
            }
            set
            {
                if (imageScale != value)
                {
                    imageScale = value;
                    Invalidate();
                }
            }
        }
        public SizeF ImageSkew
        {
            get
            {
                return imageSkew;
            }
            set
            {
                if (imageSkew != value)
                {
                    imageSkew = value;
                    Invalidate();
                }
            }
        }

        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary> 
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // ImageWarperControl
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Name = "ImageWarperControl";
            this.Load += new System.EventHandler(this.ImageWarperControl_Load);
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.ImageWarperControl_Paint);
            this.ResumeLayout(false);

        }
        #endregion
    }
    
}

           
         
  








Related examples in the same category

1.Image Paint Simple DemoImage Paint Simple Demo
2.Draw imageDraw image
3.Image Icon FormImage Icon Form
4.Icon Image DrawIcon Image Draw
5.Image ClassImage Class
6.MetaFile and DrawMetaFile and Draw
7.Picture ControlsPicture Controls
8.Control PaletteControl Palette
9.Cube ImageCube Image
10.Image Zoom 1Image Zoom 1
11.Image FlipImage Flip
12.Icon Extraction