30種類の画像アニメーション特効アルゴリズム(C#マルチスレッド版)(上)
オリジナル作品は、転載が許可されていますので、転載時には必ずハイパーリンク形式で文章を明記してください 元の出典 、作者情報と本声明.さもないと法律責任を追及する.http://mengliao.blog.51cto.com/876134/473169
これは比較的複雑なプログラムで、30種類の画像アニメーションの特効プレゼンテーションが含まれており、C#を使用して作成され、ソースプログラムは約2000行以上あります. このソフトウェアは実際には主に4つの方面の内容です. ランダムワイヤ、交互ブロック、マルチスキャンなどを含む1、30種類のアニメーション特効アルゴリズム.これらのアルゴリズムの設計は比較的巧みで、つまり画像処理のいくつかの技術を大量に使用している. 2、.NETのGDI+技術機能は非常に強く、本ソフトウェアでは、シミュレーション変換マトリクス、色変換マトリクス、ブロック処理など、GDI+の各方面にほとんど関与しています. 3、マルチスレッド技術を採用し、ソフトウェアを秩序正しく見えるようにし、同時に信号量を採用して一時停止、継続、キャンセルなどの機能を実現する. 4、比较的に厳格なオブジェクト向けのプログラム设计技术を采用して、クラスの定义から方法の、事件の定义まですべて厳格にOOP理论によって完成して、比较的に完全で、精確にOOPの精髄を体現したと言える. これはスクリーンショットのアニメーション効果です. ソースプログラムが多すぎるので、3回に分けて出します.
これは比較的複雑なプログラムで、30種類の画像アニメーションの特効プレゼンテーションが含まれており、C#を使用して作成され、ソースプログラムは約2000行以上あります. このソフトウェアは実際には主に4つの方面の内容です. ランダムワイヤ、交互ブロック、マルチスキャンなどを含む1、30種類のアニメーション特効アルゴリズム.これらのアルゴリズムの設計は比較的巧みで、つまり画像処理のいくつかの技術を大量に使用している. 2、.NETのGDI+技術機能は非常に強く、本ソフトウェアでは、シミュレーション変換マトリクス、色変換マトリクス、ブロック処理など、GDI+の各方面にほとんど関与しています. 3、マルチスレッド技術を採用し、ソフトウェアを秩序正しく見えるようにし、同時に信号量を採用して一時停止、継続、キャンセルなどの機能を実現する. 4、比较的に厳格なオブジェクト向けのプログラム设计技术を采用して、クラスの定义から方法の、事件の定义まですべて厳格にOOP理论によって完成して、比较的に完全で、精確にOOPの精髄を体現したと言える. これはスクリーンショットのアニメーション効果です. ソースプログラムが多すぎるので、3回に分けて出します.
- using System;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- using System.Drawing.Imaging;
- using System.Threading;
- using System.Windows.Forms;
-
- namespace Mengliao.CSharp.A14
- {
- #region
-
- // ,
- enum AnimateType
- {
- Animator01, Animator02, Animator03, Animator04, Animator05,
- Animator06, Animator07, Animator08, Animator09, Animator10,
- Animator11, Animator12, Animator13, Animator14, Animator15,
- Animator16, Animator17, Animator18, Animator19, Animator20,
- Animator21, Animator22, Animator23, Animator24, Animator25,
- Animator26, Animator27, Animator28, Animator29, Animator30
- }
-
- #endregion
-
- class AnimatorImage
- {
- #region
-
- //
- private Bitmap bmp;
- //
- private bool drawStarted = false;
-
- // ,
- private AutoResetEvent cancelEvent = new AutoResetEvent(false);
-
- // ,
- private ManualResetEvent pauseEvent = new ManualResetEvent(false);
-
- // DC
- private Graphics dc;
-
- #endregion
-
- #region
-
- private Bitmap outBmp;
- /// <summary>
- /// 。
- /// </summary>
- public Bitmap OutBmp
- {
- get { return outBmp; }
- }
-
- private int delay;
- /// <summary>
- /// 。
- /// </summary>
- public int Delay
- {
- get { return delay; }
- set { delay = Math.Min(Math.Max(1, value), 100); } // 1 100
- }
-
- /// <summary>
- /// 。
- /// </summary>
- public event PaintEventHandler Redraw;
- protected void OnRedraw(Rectangle clipRectangle)
- {
- if (Redraw != null)
- {
- Redraw.Invoke(this, new PaintEventArgs(dc, clipRectangle));
- }
- }
-
- /// <summary>
- /// 。
- /// </summary>
- public event EventHandler DrawStarted;
- protected void OnDrawStarted(object sender, EventArgs e)
- {
- drawStarted = true;
- if (DrawStarted != null)
- {
- DrawStarted.Invoke(sender, e);
- }
- }
-
- /// <summary>
- /// 。
- /// </summary>
- public event EventHandler DrawCompleted;
- protected void OnDrawCompleted(object sender, EventArgs e)
- {
- drawStarted = false;
- cancelEvent.Reset();
- if (DrawCompleted != null)
- {
- DrawCompleted.Invoke(sender, e);
- }
- }
-
- #endregion
-
- #region
-
- //
- private void ShowError(string errMsg)
- {
- Font font = new Font(" ", 9);
- SizeF size = dc.MeasureString(errMsg, font);
- PointF point = new PointF((outBmp.Width - size.Width) / 2f, (outBmp.Height - size.Height) / 2f);
- // , ,
- dc.DrawString(errMsg, font, Brushes.Red, point.X - 1f, point.Y);
- dc.DrawString(errMsg, font, Brushes.Red, point.X + 1f, point.Y);
- dc.DrawString(errMsg, font, Brushes.Red, point.X, point.Y - 1f);
- dc.DrawString(errMsg, font, Brushes.Red, point.X, point.Y + 1f);
- //
- dc.DrawString(errMsg, font, Brushes.White, point);
- ShowBmp(new Rectangle(Point.Round(point), Size.Round(size)));
- }
-
- // ,
- private void ShowBmp(Rectangle clipRectangle)
- {
- string cancelMsg = " !";
- OnRedraw(clipRectangle);
- if (cancelEvent.WaitOne(0)) //
- {
- // ,
- throw new ApplicationException(cancelMsg);
- }
- while (pauseEvent.WaitOne(0)) //
- {
- if (cancelEvent.WaitOne(10)) //
- {
- pauseEvent.Reset();
- throw new ApplicationException(cancelMsg);
- }
- }
- }
- private void ShowBmp(RectangleF clipRectangle) //
- {
- ShowBmp(Rectangle.Round(clipRectangle));
- }
- private void ShowBmp() //
- {
- ShowBmp(new Rectangle(0, 0, bmp.Width, bmp.Height));
- }
-
- //
- private void ClearBackground()
- {
- dc.Clear(Color.FromKnownColor(KnownColor.ButtonFace)); //
- ShowBmp(); //
- }
-
- #endregion
-
- #region
-
- /// <summary>
- /// 。
- /// </summary>
- public void CancelDraw()
- {
- if (drawStarted)
- {
- cancelEvent.Set();
- }
- }
-
- /// <summary>
- /// 。
- /// </summary>
- public void PauseDraw()
- {
- if (drawStarted)
- {
- pauseEvent.Set();
- }
- }
-
- /// <summary>
- /// 。
- /// </summary>
- public void ResumeDraw()
- {
- if (drawStarted)
- {
- pauseEvent.Reset();
- }
- }
-
- #endregion
-
- #region
- /// <summary>
- /// , , ; 1。
- /// </summary>
- /// <param name="inBmp"> </param>
- public AnimatorImage(Bitmap inBmp)
- {
- delay = 1;
- this.bmp = (Bitmap)inBmp.Clone();
- outBmp = new Bitmap(this.bmp.Width, this.bmp.Height);
- dc = Graphics.FromImage(outBmp);
- }
-
- #endregion
-
- #region
- /// <summary>
- /// 。
- /// </summary>
- /// <param name="animateType"> </param>
- public void DrawAnimator(AnimateType animateType)
- {
- if (drawStarted) //
- {
- if (pauseEvent.WaitOne(0)) // , ,
- pauseEvent.Reset();
- else
- pauseEvent.Set();
- return;
- }
- ThreadStart threadMethod;
- switch (animateType)
- {
- case AnimateType.Animator01:
- threadMethod = Animator01;
- break;
- case AnimateType.Animator02:
- threadMethod = Animator02;
- break;
- case AnimateType.Animator03:
- threadMethod = Animator03;
- break;
- case AnimateType.Animator04:
- threadMethod = Animator04;
- break;
- case AnimateType.Animator05:
- threadMethod = Animator05;
- break;
- case AnimateType.Animator06:
- threadMethod = Animator06;
- break;
- case AnimateType.Animator07:
- threadMethod = Animator07;
- break;
- case AnimateType.Animator08:
- threadMethod = Animator08;
- break;
- case AnimateType.Animator09:
- threadMethod = Animator09;
- break;
- case AnimateType.Animator10:
- threadMethod = Animator10;
- break;
- case AnimateType.Animator11:
- threadMethod = Animator11;
- break;
- case AnimateType.Animator12:
- threadMethod = Animator12;
- break;
- case AnimateType.Animator13:
- threadMethod = Animator13;
- break;
- case AnimateType.Animator14:
- threadMethod = Animator14;
- break;
- case AnimateType.Animator15:
- threadMethod = Animator15;
- break;
- case AnimateType.Animator16:
- threadMethod = Animator16;
- break;
- case AnimateType.Animator17:
- threadMethod = Animator17;
- break;
- case AnimateType.Animator18:
- threadMethod = Animator18;
- break;
- case AnimateType.Animator19:
- threadMethod = Animator19;
- break;
- case AnimateType.Animator20:
- threadMethod = Animator20;
- break;
- case AnimateType.Animator21:
- threadMethod = Animator21;
- break;
- case AnimateType.Animator22:
- threadMethod = Animator22;
- break;
- case AnimateType.Animator23:
- threadMethod = Animator23;
- break;
- case AnimateType.Animator24:
- threadMethod = Animator24;
- break;
- case AnimateType.Animator25:
- threadMethod = Animator25;
- break;
- case AnimateType.Animator26:
- threadMethod = Animator26;
- break;
- case AnimateType.Animator27:
- threadMethod = Animator27;
- break;
- case AnimateType.Animator28:
- threadMethod = Animator28;
- break;
- case AnimateType.Animator29:
- threadMethod = Animator29;
- break;
- default:
- threadMethod = Animator30;
- break;
- }
- Thread drawThread = new Thread(threadMethod);
- drawThread.IsBackground = true; // ,
- drawThread.Start();
- }
-
- #endregion
-
- // ==========
- //
- // ==========
-
- #region ( )
-
- // : ,
- private void Animator01()
- {
- const float blockSize = 8; // ,
- try
- {
- OnDrawStarted(this, EventArgs.Empty); //
- //ClearBackground();
-
- Color bgColor = Color.FromKnownColor(KnownColor.ButtonFace);
- RectangleF srcRect = new RectangleF(0, 0, bmp.Width, bmp.Height);
- for (float i = (float)Math.Floor(-bmp.Height / blockSize); i <= Math.Ceiling(bmp.Height / blockSize); i++)
- {
- dc.Clear(bgColor); // DC
- float j = i * blockSize / 2;
- float destTop = bmp.Height / 2 - j; //
- //
- RectangleF destRect = new RectangleF(0, destTop, bmp.Width, 2 * j);
- // ,
- dc.DrawImage(bmp, destRect, srcRect, GraphicsUnit.Pixel);
-
- ShowBmp();
- Thread.Sleep(10 * delay); //
- }
- }
- catch (Exception ex)
- {
- ShowError(ex.Message);
- }
- finally
- {
- OnDrawCompleted(this, EventArgs.Empty); //
- }
- }
-
- #endregion
-
- #region ( )
-
- // : ,
- private void Animator02()
- {
- const int stepCount = 4; // ,
- try
- {
- OnDrawStarted(this, EventArgs.Empty);
- ClearBackground();
-
- Rectangle sourTopRect = new Rectangle(0, 0, bmp.Width, bmp.Height / 2); //
- Rectangle sourBottRect = new Rectangle(0, bmp.Height / 2, bmp.Width, bmp.Height / 2); //
- for (int i = 0; i <= bmp.Height / 2; i += stepCount)
- {
- Rectangle destTopRect = new Rectangle(0, i - bmp.Height / 2 + 1, bmp.Width, bmp.Height / 2); //
- Rectangle destBottRect = new Rectangle(0, bmp.Height - i - 1, bmp.Width, bmp.Height / 2); //
- dc.DrawImage(bmp, destTopRect, sourTopRect, GraphicsUnit.Pixel);
- dc.DrawImage(bmp, destBottRect, sourBottRect, GraphicsUnit.Pixel);
-
- ShowBmp(Rectangle.Union(destTopRect, destBottRect));
- Thread.Sleep(10 * delay);
- }
- }
- catch (Exception ex)
- {
- ShowError(ex.Message);
- }
- finally
- {
- OnDrawCompleted(this, EventArgs.Empty);
- }
- }
-
- #endregion
-
- #region ( )
-
- // : , ,
- private void Animator03()
- {
- const float stepCount = 4; //
- try
- {
- OnDrawStarted(this, EventArgs.Empty);
- ClearBackground();
-
- // , Region ,
- Region region = new Region(new GraphicsPath());
- //
- TextureBrush textureBrush = new TextureBrush(bmp);
- for (float x = 0; x <= bmp.Width / 2f; x += stepCount)
- {
- //
- region.Union(new Rectangle(0, 0, bmp.Width, bmp.Height));
- // ,
- // , , ,
- float y = x * bmp.Height / bmp.Width;
- RectangleF rect = new RectangleF(x, y, bmp.Width - 2f * x, bmp.Height - 2f * y);
- //
- region.Exclude(rect);
- dc.FillRegion(textureBrush, region); //
-
- ShowBmp(region.GetBounds(dc));
- Thread.Sleep(10 * delay);
- }
- // stepCount , ,
- dc.DrawImage(bmp, 0, 0);
-
- ShowBmp();
- }
- catch (Exception ex)
- {
- ShowError(ex.Message);
- }
- finally
- {
- OnDrawCompleted(this, EventArgs.Empty);
- }
- }
-
- #endregion
-
- #region ( )
-
- // : ,
- private void Animator04()
- {
- const int stepCount = 4; // ,
- try
- {
- OnDrawStarted(this, EventArgs.Empty);
- ClearBackground();
-
- Rectangle sourRect = new Rectangle(0, 0, bmp.Width, bmp.Height); //
- for (int i = 0; i <= bmp.Width / 2; i += stepCount)
- {
- int j = i * bmp.Height / bmp.Width; // , , ,
- Rectangle destRect = new Rectangle(bmp.Width / 2 - i, bmp.Height / 2 - j, 2 * i, 2 * j);
- dc.DrawImage(bmp, destRect, sourRect, GraphicsUnit.Pixel);
-
- ShowBmp(destRect);
- Thread.Sleep(10 * delay);
- }
- }
- catch (Exception ex)
- {
- ShowError(ex.Message);
- }
- finally
- {
- OnDrawCompleted(this, EventArgs.Empty);
- }
- }
-
- #endregion
-
- #region
-
- // : , ,
- private void Animator05()
- {
- const float blockSize = 50; //
- try
- {
- OnDrawStarted(this, EventArgs.Empty);
- ClearBackground();
-
- // 、 ,
- for (int y = 0; y < Math.Ceiling(bmp.Height / blockSize); y++)
- {
- for (int x = 0; x < Math.Ceiling(bmp.Width / blockSize); x++)
- {
- RectangleF rect;
- if (y % 2 == 0) //
- {
- rect = new RectangleF(x * blockSize, y * blockSize, blockSize, blockSize);
- }
- else //
- {
- rect = new RectangleF((bmp.Width / blockSize - x - 1) * blockSize, y * blockSize, blockSize, blockSize);
- }
- dc.DrawImage(bmp, rect, rect, GraphicsUnit.Pixel);
-
- ShowBmp(rect);
- Thread.Sleep(10 * delay);
- }
- }
- }
- catch (Exception ex)
- {
- ShowError(ex.Message);
- }
- finally
- {
- OnDrawCompleted(this, EventArgs.Empty);
- }
- }
-
- #endregion
-
- #region ( )
-
- // : , ,
- private void Animator06()
- {
- const float blockSize = 70; //
- const int showWidth = 1; //
- try
- {
- OnDrawStarted(this, EventArgs.Empty);
- ClearBackground();
-
- // , Region ,
-