顯示具有 C# 標籤的文章。 顯示所有文章
顯示具有 C# 標籤的文章。 顯示所有文章

Delphi 程式開發之軟體移植 (Delphi Source code migration)

 

Delphi 程式開發之軟體移植

協助遷移使用任何版本的 Delphi構建的任何類型的軟體程式

在 Windows 95 上運行的 Delphi 1.0


DELPHI軟體程式遷移服務


Delphi Software migration services

我們協助執行所有類型的軟體遷移

您的軟體可能是使用 Delphi 5 或 Delphi 7 編寫的,並且可能仍能正常工作。
但是我們必須考慮作業系統升級所帶來的風險,特別是如果您將軟體提供給客戶。
如同以下案例的風險:

  • 每個新的 Windows 版本都會破壞一些現有的功能,尤其是在 UI 部分;
  • 某些介面或 API 可能已過時;
  • 無法存取最新的操作系統功能或是實現的成本太高;
  • 3rd 方組件供應商停止提供對您的 Delphi 版本的支持;
  • 甚至有些供應商已經不存在了,但您仍然需要對這些組件進行更新。
假定您的軟體從 Delphi 5、7 和其他版本等舊版 Delphi 遷移到最新版本。
如果想遷移軟體程式,我們可以以最可行的方式遷移您的軟體程式碼。
並非在所有情況下都能順利遷移。
在初步分析之後,我們可以選擇重新轉寫或將舊程式遷移到新版本。

如果你的機台或軟體是用舊版DELPHI版本所撰寫,若想要遷移程式碼到新的作業系統上執行
歡迎與我聯絡: cmf6214@gmail.com



MVP人力銀行--誠徵資深軟體系統設計(System Design ,SD)工程師


WANTED 資深軟體系統設計(System Design, SD)工程師

 職缺資訊

工作地點
【學歷要求】
內湖瑞湖街/富邦金控/富邦人壽/資訊總處
大學以上
【科系限制】
資訊資管相關或數學、電機電子工程相關科系
【工作經驗】
5()以上
【其它條件】
5()以上Web 開發/設計經驗,熟C#
.Netframework 3.5()以上,MS SQL Server 2005()以上。
對程式設計,系統架構設計,及資料庫設計有經驗。
擔任工作主要為程式設計, 系統架構設計。

         
報名辦法: 請直接將您的履歷投遞至jammy.wang@fubon.com



影像捲動環繞 之 電玩畫面戲法


The wrapping image game trick

By Muammar©

解說 在電玩中所使用的讓 背景影像無休止的轉動之技巧




導言

你可曾想過電玩中的背景圖不斷的移動它到底有多長?
您必須注意到在某一時刻背景圖內容只是不斷的重複,這就是我們要學習這篇文章的重點.
兩天前, 我與我的孩子在公園散步時我注意到行人道上的磚塊排列方式是一個無止境的重複形狀,於是我決定用一個數學方法中來看這一問題。

幻覺





hypnosquare.gif
透過色彩與紋裡影像操作總是被使用在讓人產生錯覺的技法. 若要做出鋪磚錯覺效果來首先處理的第一個問題就是要讓圖片做出無縫連接 "tileable",以使其結束點能夠重複連接圖片產生連續的效果..
In other words, it's about placing a piece of texture next to each other without having a visible seam, and making sure not to have any eye-catching repeating spots in the overall picture.
It might be useful to say that not any picture will do, you need to have some sort of a repetitive pattern, at least at the edges of the picture.

現在,選擇圖片請確保包括兩個基本要求:
  1. 圖片的邊緣必須是 90° 角.
  2. 圖片邊緣不應該有光暈.

NYC.JPG
既然我們的圖片都準備好了,我們可平鋪就的方式有兩種選擇。 We might want to tile it only in one dimension, i.e., horizontally/vertically so the picture fits in a row/column, or we could make it completely tileable by making sure that all ends match up. However, if you're intending to make a fully tileable picture, you'd better make it a perfect square of a size based on a power of 2 (i.e., 2^5 = 32), for two main reasons:
  1. Many commercial imaging filters (most notably clouds) will create already seamless tiles, but only if the original image is based on a power of 2.
  2. Powers of two are easy to manage and check when it comes to pictures, and even your monitor resolution is based on a power of two!



背景

To make the picture tileable, the first thing you need to do is to offset it horizontally and/or vertically, preferably by 50% of its original dimensions. This is best demonstrated by means of a picture. So in a picture like shown below, the creepy alien seems to be nudged over from the picture to reappear on the other side of it. "Sorry Bob".
BOBs.JPG
Now that we have made sure the edges match seamlessly, let's see how the endless wrapping works.. We need to look at the picture in a different way, recognizing the overall image as a beam of columns and rows of pixels, those when meet will make a perfect cylinder.
ShiftedClips.JPG
Now, to make an illusion of a picture moving to the right, we simply iterate through the columns of the picture, taking the most right column or columns; depending on how smooth the movement of the picture should be (the more columns you take out in a single movement, the less smoothness the movement of the picture will have), we take out that column(s), shift the rest of the picture to exactly cover the gap created by the taken column(s), and then we reattach those columns back to the picture, but to the gap created in the beginning of the picture when we moved (Clip1) to cover for the taken out columns (Clip2) in the first place. The following pictures show the movement technique by indexing the pixels of a sample picture of a 4X4.
Matrix.JPG
Notice the shift of the indexes in the blue to move the respective image from left to right, and the green one to give the illusion of a downward moving picture. Also notice that if more than one column is moved, the series still maintains to keep ordered in a contiguous manner.

Using the Code

Ocean.JPG
I'm going to explain only the endless ocean solution as it covers the wrapping trick for both dimensions.
Note that you can change the direction of both samples by holding down the Control key and pressing the respective Arrow key.
To move the picture, we first need to clip it as explained above, and here is the function to do it:
 Collapse
private Bitmap Crop(Bitmap srcBitmap, Rectangle rectClip)
{
    Bitmap tmpBmp = new Bitmap(rectClip.Width, rectClip.Height);
    Graphics g = Graphics.FromImage(tmpBmp);

    g.DrawImage(srcBitmap, 0, 0, rectClip, GraphicsUnit.Pixel);
    g.Dispose();
    return tmpBmp;
}
The function takes the source bitmap as its first parameter, and the rectangle to cut out, considering the start location of the clipping and the dimensions, then returns that part as a Bitmap object.
We also use some user controls inherited from the PictureBox class to support background transparency.
 Collapse
using System;
using System.Windows.Forms;

namespace UI_Test
{
    public class TransparentPictureBox : PictureBox
    {
        public TransparentPictureBox()
        {
            this.SetStyle(ControlStyles.Opaque, true);
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams parms = base.CreateParams;
                parms.ExStyle |= 0x20; 
                return parms;
            }
        }
    }
}
Once compiled, you'll see the control added to your solution components list at the top of the toolbox pane with the labelTransparentPictureBox.
Now, let's take a look at the entire code listing and discuss each part separately.
 Collapse
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Media;

namespace SampleGameII
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private enum Style
        {
            Left,
            Right,
            Up,
            Down
        }

        private void tmr_MoveBG_Tick(object sender, EventArgs e)
        {
            if (!chReverse.Checked)
                PIC1.Image = MoveImage((Bitmap)PIC1.Image.Clone(), iSpeed, sDirection);
            else
            {
                if (iSpeed >= Properties.Resources.Ocean.Width - iSpeed)
                    iSpeed = 3;
                else
                    iSpeed += 3;
                PIC1.Image = MoveImage(Properties.Resources.Ocean, iSpeed, sDirection);
            }
            Spaceship.Refresh();
        }


        private Bitmap Crop(Bitmap srcBitmap, Rectangle rectClip)
        {
            Bitmap tmpBmp = new Bitmap(rectClip.Width, rectClip.Height);
            Graphics g = Graphics.FromImage(tmpBmp);

            g.DrawImage(srcBitmap, 0, 0, rectClip, GraphicsUnit.Pixel);
            g.Dispose();
            return tmpBmp;
        }

        private Bitmap MoveImage(Bitmap srcBitmap, int iMargin, string sDirection)
        {
            Bitmap tmpBmp, Clip1, Clip2;
            tmpBmp = Clip1 = Clip2 = null;

            switch (sDirection)
            {
                case "Left":
                    {
                        tmpBmp = new Bitmap(srcBitmap.Width, srcBitmap.Height);
                        Clip1 = Crop(
                            srcBitmap,
                            new Rectangle(
                                new Point(0, 0),
                                new Size(srcBitmap.Width - iMargin, srcBitmap.Height)));
                        Clip2 = Crop(
                            srcBitmap,
                            new Rectangle(
                                new Point(srcBitmap.Width - iMargin, 0),
                                new Size(iMargin, srcBitmap.Height)));

                        Graphics g = Graphics.FromImage(tmpBmp);

                        if (!chReverse.Checked)
                        {
                            g.DrawImage(Clip1, iMargin, 0, 
                               srcBitmap.Width - iMargin, srcBitmap.Height);
                            g.DrawImage(Clip2, 0, 0, iMargin, srcBitmap.Height);
                        }
                        else
                        {
                            g.DrawImage(Clip2, iMargin, 0, 
                               srcBitmap.Width - iMargin, srcBitmap.Height);
                            g.DrawImage(Clip1, 0, 0, iMargin, srcBitmap.Height);
                        }

                        g.Dispose();

                        break;
                    }
                case "Right":
                    {
                        tmpBmp = new Bitmap(srcBitmap.Width, srcBitmap.Height);
                        Clip1 = Crop(
                            srcBitmap,
                            new Rectangle(
                                new Point(iMargin, 0),
                                new Size(srcBitmap.Width - iMargin, srcBitmap.Height)));
                        Clip2 = Crop(
                            srcBitmap,
                            new Rectangle(
                                new Point(0, 0),
                                new Size(iMargin, srcBitmap.Height)));

                        Graphics g = Graphics.FromImage(tmpBmp);


                        if (!chReverse.Checked)
                        {
                            g.DrawImage(Clip1, 0, 0, srcBitmap.Width - iMargin, 
                                        srcBitmap.Height);
                            g.DrawImage(Clip2, srcBitmap.Width - iMargin, 0, 
                                        iMargin, srcBitmap.Height);
                        }
                        else
                        {
                            g.DrawImage(Clip2, 0, 0, srcBitmap.Width - iMargin, 
                                        srcBitmap.Height);
                            g.DrawImage(Clip1, srcBitmap.Width - iMargin, 0, 
                                        iMargin, srcBitmap.Height);
                        }
                        g.Dispose();

                        break;
                    }
                case "Up":
                    {
                        tmpBmp = new Bitmap(srcBitmap.Width, srcBitmap.Height);
                        Clip1 = Crop(
                            srcBitmap,
                            new Rectangle(
                                new Point(0, 0),
                                new Size(srcBitmap.Width, srcBitmap.Height - iMargin)));
                        Clip2 = Crop(
                            srcBitmap,
                            new Rectangle(
                                new Point(0, srcBitmap.Height - iMargin),
                                new Size(srcBitmap.Width, iMargin)));

                        Graphics g = Graphics.FromImage(tmpBmp);


                        if (!chReverse.Checked)
                        {
                            g.DrawImage(Clip1, 0, iMargin, srcBitmap.Width, 
                                        srcBitmap.Height - iMargin);
                            g.DrawImage(Clip2, 0, 0, srcBitmap.Width, iMargin);
                        }
                        else
                        {
                            g.DrawImage(Clip2, 0, iMargin, srcBitmap.Width, 
                                        srcBitmap.Height - iMargin);
                            g.DrawImage(Clip1, 0, 0, srcBitmap.Width, iMargin);
                        }
                        g.Dispose();

                        break;
                    }
                case "Down":
                    {
                        tmpBmp = new Bitmap(srcBitmap.Width, srcBitmap.Height);
                        Clip1 = Crop(
                            srcBitmap,
                            new Rectangle(
                                new Point(0, iMargin),
                                new Size(srcBitmap.Width, srcBitmap.Height - iMargin)));
                        Clip2 = Crop(
                            srcBitmap,
                            new Rectangle(
                                new Point(0, 0),
                                new Size(srcBitmap.Width, iMargin)));

                        Graphics g = Graphics.FromImage(tmpBmp);


                        if (!chReverse.Checked)
                        {
                            g.DrawImage(Clip1, 0, 0, srcBitmap.Width, 
                                        srcBitmap.Height - iMargin);
                            g.DrawImage(Clip2, 0, srcBitmap.Height - iMargin, 
                                        srcBitmap.Width, iMargin);
                        }
                        else
                        {
                            g.DrawImage(Clip2, 0, 0, srcBitmap.Width, 
                                        srcBitmap.Height - iMargin);
                            g.DrawImage(Clip1, 0, srcBitmap.Height - iMargin, 
                                        srcBitmap.Width, iMargin);
                        }
                        g.Dispose();

                        break;
                    }
            }

            return tmpBmp;
        }


        int iSpeed;
        string sDirection;

        private void Form1_Load(object sender, EventArgs e)
        {
            sDirection = "Up";
            iSpeed = 3;
            tmr_MoveBG.Start();
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Left || e.KeyCode == Keys.Right
               || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
            {
                sDirection = e.KeyCode.ToString();


                iSpeed = 3;
                tmr_MoveBG.Start();

                Bitmap bm;

                    bm = new Bitmap(Properties.Resources.Spaceship2);


                if (e.KeyCode == Keys.Right)
                    bm.RotateFlip((System.Drawing.RotateFlipType)Enum.Parse(
                      typeof(System.Drawing.RotateFlipType), 
                      "Rotate90FlipNone", true));
                if (e.KeyCode == Keys.Left)
                    bm.RotateFlip((System.Drawing.RotateFlipType)Enum.Parse(
                      typeof(System.Drawing.RotateFlipType), 
                      "Rotate270FlipNone", true));
                if (e.KeyCode == Keys.Down)
                    bm.RotateFlip((System.Drawing.RotateFlipType)Enum.Parse(
                      typeof(System.Drawing.RotateFlipType), 
                      "Rotate180FlipNone", true));
                
                Spaceship.Image = bm;
            }
        }

        private void chReverse_CheckedChanged(object sender, EventArgs e)
        {
            if (!chReverse.Checked)
            {
                PIC1.Image = Properties.Resources.Ocean;
                tmr_MoveBG.Stop();
                iSpeed = 3;
                tmr_MoveBG.Start();
            }
        }

        private void tbSpeed_Scroll(object sender, EventArgs e)
        {
            tmr_MoveBG.Interval = 50 - (tbSpeed.Value * 5);
            lblSpeed.Text = "Speed: "+ (tbSpeed.Value+1).ToString();
        }
    }
}
The motion illusion is initiated and carried out using the tmr_MoveBG timer. The MoveImage function is called with every tick of the timer, passing a clone of the currently modified Image of the picture box and assigning it back to thePictureBox control to be passed again with the next tick.
 Collapse
private void tmr_MoveBG_Tick(object sender, EventArgs e)
{
    if (!chReverse.Checked)
        PIC1.Image = MoveImage((Bitmap)PIC1.Image.Clone(), iSpeed, sDirection);
    else
    {
        if (iSpeed >= Properties.Resources.Ocean.Width - iSpeed)
            iSpeed = 3;
        else
            iSpeed += 3;
        PIC1.Image = MoveImage(Properties.Resources.Ocean, iSpeed, sDirection);
    }
    Spaceship.Refresh();
}
The MoveImage function takes the source image as its first parameter as a Bitmap, along with the margin to clip and the desired direction to move to.
The direction parameter is evaluated through a switch case block to clip and redraw the right image, and then finally returns it to be set back to the PictureBox control, which will be taken again as a clone to be the new source image to pass to the function.
 Collapse
private Bitmap MoveImage(Bitmap srcBitmap, int iMargin, string sDirection)
{
    Bitmap tmpBmp, Clip1, Clip2;
    tmpBmp = Clip1 = Clip2 = null;

    switch (sDirection)
    {
        case "Left":
            {
                tmpBmp = new Bitmap(srcBitmap.Width, srcBitmap.Height);
                Clip1 = Crop(
                    srcBitmap,
                    new Rectangle(
                        new Point(0, 0),
                        new Size(srcBitmap.Width - iMargin, srcBitmap.Height)));
                Clip2 = Crop(
                    srcBitmap,
                    new Rectangle(
                        new Point(srcBitmap.Width - iMargin, 0),
                        new Size(iMargin, srcBitmap.Height)));

                Graphics g = Graphics.FromImage(tmpBmp);

                if (!chReverse.Checked)
                {
                    g.DrawImage(Clip1, iMargin, 0, 
                          srcBitmap.Width - iMargin, srcBitmap.Height);
                    g.DrawImage(Clip2, 0, 0, iMargin, srcBitmap.Height);
                }
                else
                {
                    g.DrawImage(Clip2, iMargin, 0, 
                       srcBitmap.Width - iMargin, srcBitmap.Height);
                    g.DrawImage(Clip1, 0, 0, iMargin, srcBitmap.Height);
                }

                g.Dispose();

                break;
            }
        case "Right":
            {
                tmpBmp = new Bitmap(srcBitmap.Width, srcBitmap.Height);
                Clip1 = Crop(
                    srcBitmap,
                    new Rectangle(
                        new Point(iMargin, 0),
                        new Size(srcBitmap.Width - iMargin, srcBitmap.Height)));
                Clip2 = Crop(
                    srcBitmap,
                    new Rectangle(
                        new Point(0, 0),
                        new Size(iMargin, srcBitmap.Height)));

                Graphics g = Graphics.FromImage(tmpBmp);


                if (!chReverse.Checked)
                {
                    g.DrawImage(Clip1, 0, 0, srcBitmap.Width - iMargin, srcBitmap.Height);
                    g.DrawImage(Clip2, srcBitmap.Width - iMargin, 0, 
                                iMargin, srcBitmap.Height);
                }
                else
                {
                    g.DrawImage(Clip2, 0, 0, srcBitmap.Width - iMargin, srcBitmap.Height);
                    g.DrawImage(Clip1, srcBitmap.Width - iMargin, 0, 
                                iMargin, srcBitmap.Height);
                }
                g.Dispose();

                break;
            }
        case "Up":
            {
                tmpBmp = new Bitmap(srcBitmap.Width, srcBitmap.Height);
                Clip1 = Crop(
                    srcBitmap,
                    new Rectangle(
                        new Point(0, 0),
                        new Size(srcBitmap.Width, srcBitmap.Height - iMargin)));
                Clip2 = Crop(
                    srcBitmap,
                    new Rectangle(
                        new Point(0, srcBitmap.Height - iMargin),
                        new Size(srcBitmap.Width, iMargin)));

                Graphics g = Graphics.FromImage(tmpBmp);


                if (!chReverse.Checked)
                {
                    g.DrawImage(Clip1, 0, iMargin, srcBitmap.Width, 
                                srcBitmap.Height - iMargin);
                    g.DrawImage(Clip2, 0, 0, srcBitmap.Width, iMargin);
                }
                else
                {
                    g.DrawImage(Clip2, 0, iMargin, srcBitmap.Width, 
                                srcBitmap.Height - iMargin);
                    g.DrawImage(Clip1, 0, 0, srcBitmap.Width, iMargin);
                }
                g.Dispose();

                break;
            }
        case "Down":
            {
                tmpBmp = new Bitmap(srcBitmap.Width, srcBitmap.Height);
                Clip1 = Crop(
                    srcBitmap,
                    new Rectangle(
                        new Point(0, iMargin),
                        new Size(srcBitmap.Width, srcBitmap.Height - iMargin)));
                Clip2 = Crop(
                    srcBitmap,
                    new Rectangle(
                        new Point(0, 0),
                        new Size(srcBitmap.Width, iMargin)));

                Graphics g = Graphics.FromImage(tmpBmp);


                if (!chReverse.Checked)
                {
                    g.DrawImage(Clip1, 0, 0, srcBitmap.Width, srcBitmap.Height - iMargin);
                    g.DrawImage(Clip2, 0, srcBitmap.Height - iMargin, 
                                srcBitmap.Width, iMargin);
                }
                else
                {
                    g.DrawImage(Clip2, 0, 0, srcBitmap.Width, srcBitmap.Height - iMargin);
                    g.DrawImage(Clip1, 0, srcBitmap.Height - iMargin, 
                                srcBitmap.Width, iMargin);
                }
                g.Dispose();

                break;
            }
    }


    return tmpBmp;
}
In order to change the direction of the image, we capture the keyCode and assign it as a string to the sDirectionvariable and simply flip the spaceship image to match the new direction. Notice that the background image changes its direction as the sDirection variable value changes, for the timer is still running, and uses it to determine the moving direction.
 Collapse
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Left || e.KeyCode == Keys.Right
       || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
    {
        sDirection = e.KeyCode.ToString();


        iSpeed = 3;
        tmr_MoveBG.Start();

        Bitmap bm;

            bm = new Bitmap(Properties.Resources.Spaceship2);


        if (e.KeyCode == Keys.Right)
            bm.RotateFlip((System.Drawing.RotateFlipType)Enum.Parse(
              typeof(System.Drawing.RotateFlipType), 
              "Rotate90FlipNone", true));
        if (e.KeyCode == Keys.Left)
            bm.RotateFlip((System.Drawing.RotateFlipType)Enum.Parse(
              typeof(System.Drawing.RotateFlipType), 
              "Rotate270FlipNone", true));
        if (e.KeyCode == Keys.Down)
            bm.RotateFlip((System.Drawing.RotateFlipType)Enum.Parse(
              typeof(System.Drawing.RotateFlipType), 
              "Rotate180FlipNone", true));
        
        Spaceship.Image = bm;
    }
}
The reversed effect is decided by checking the "Reverse Effect" check box which simply restarts the moving timer to use the new settings:
 Collapse
private void chReverse_CheckedChanged(object sender, EventArgs e)
{
    if (!chReverse.Checked)
    {
        PIC1.Image = Properties.Resources.Ocean;
        tmr_MoveBG.Stop();
        iSpeed = 3;
        tmr_MoveBG.Start();
    }
}
The new setting for the reverse effect is handled by switching the placement of the clips so that the bigger clip (Clip 1) takes the place of the smaller one (Clip 2) and vice versa, and hence the moving stretch effect to fit the clips in the wrong sizes.
 Collapse
if (!chReverse.Checked)
{
    g.DrawImage(Clip1, iMargin, 0, srcBitmap.Width - iMargin, srcBitmap.Height);
    g.DrawImage(Clip2, 0, 0, iMargin, srcBitmap.Height);
}
else
{
    g.DrawImage(Clip2, iMargin, 0, srcBitmap.Width - iMargin, srcBitmap.Height);
    g.DrawImage(Clip1, 0, 0, iMargin, srcBitmap.Height);
}
Finally, we determine the speed of the movement by increasing/decreasing the interval value of the timer.
 Collapse
private void tbSpeed_Scroll(object sender, EventArgs e)
{
    tmr_MoveBG.Interval = 50 - (tbSpeed.Value * 5);
    lblSpeed.Text = "Speed: "+ (tbSpeed.Value+1).ToString();
}
Of course, we could have increased the number of columns taken out in a clip, sacrificing some of the smoothness by increasing the margin in the MoveImage function.
 Collapse
PIC1.Image = MoveImage((Bitmap)PIC1.Image.Clone(), iSpeed, sDirection);
Note that the iSpeed value is predetermined in this example in the form_load event along with the sDirectionvalue.
 Collapse
private void Form1_Load(object sender, EventArgs e)
{
    sDirection = "Up";
    iSpeed = 3;
    tmr_MoveBG.Start();
}

Points of Interest

A major drawback of this technique is that the newly drawn image obscures the overlaying PictureBox image, and hence the timer keeps refreshing it with every tick, which generates this inconvenient flickering of the image.
 Collapse
private void tmr_MoveBG_Tick(object sender, EventArgs e)
{
    ...
    Spaceship.Refresh();
}






Free Source Code - AForge.NET 影像處理

本頁提供 AForge.NET Framework 1.7.0 版本中的可用功能的清單

AForge.NET Framework 包含下面幾個函式庫:

AForge.Imaging ,直至目前為止即框架最大庫包含不同影像處理常式作為圖像增強 / 處理,旨在幫助一些電腦計算機視覺任務:


  • 顏色篩選器 (灰度、 深褐色反向、 旋轉管道、 通道提取、 通道替換、 通道篩選, 顏色篩選級別線性,重新映射擴展,對比度的顏色的篩選,歐幾裡德顏色 長條圖均衡化,gamma 修正) ;

  • HSL 篩選器 (線性更正、 亮度 / 對比度 / 飽和度更正、 順化修飾符 HSL 篩選) ;
    YCbCr 篩選器 (線性更正、 YCbCr 篩選、 通道 (提取更換)) ;

  • binarization 篩選器 (閾值,閾值與攜帶,訂購抖動拜耳抖動,佛洛德施泰因貝格抖動, burkes 抖動,抖動 Sierra 抖動,賈維斯-茹迪塞-Ninke Stucki 抖動) ;
    Adaptive binarization (簡單圖像統計、 反覆運算閾值、 大津閾值) ;

  • 數學形態學篩選器 (侵蝕,dilatation,關閉,hit-and-miss 細化 thickening,開幕 頂帽子,底部帽子) ;

  • convolution 篩選器 (表示、 模糊、 提高邊緣、 Gaussian 模糊、 自訂 convolution 篩選器) ;

  • 2 源篩選器(合併、 相交、 添加、 減去、 差異,邁向 morph) ;

  • 邊緣探測器 (homogeneity, difference、 sobel,canny) ;

  • 添加劑和鹽 Papper 噪音發電機 ;

  • 平面欄位照明改正 ;

  • pixellate,抖動、 收縮、 油繪畫畫布作物 / 填充 / 移動,Mirroring ; 的簡單 skeletonization

  • 中位數的篩選器、 Adaptive 平滑、 保守平滑 ;

  • 紋理髮電機基於 Perlin 噪音 ;

  • 紋理篩選器 (texturer、 紋理篩選、 紋理合併) ;

  • 傅裡葉轉換 (低通及高通篩選器) ;

  • blob 計數器,標籤篩選最大 blob 提取 ; Blob 的連接元件
    調整大小和旋轉 (最接近相鄰、 雙線性,bicubic) ;

  • 轉角探測器 (莫拉韋克,Susan) ;

  • 範本匹配 (詳盡-最簡單的一個用於現在) ;

  • 阻止匹配 (詳盡-最簡單的一個用於現在) ;

  • 霍夫 Line 和 Circle 轉換 ;

  • 圖像顏色統計 (RGB HSL,YCbCr) 和垂直 / 水準統計 (RGB) ;

  • 等。
AForge.Vision 庫包含不同的議案檢測常式,如:

  • 探測器基於兩個框架差異 ;

  • 探測器基於背景建模 ;

  • 點票探測器,這可能計數檢測到物件和設置區域利益的支援。
AForge.Neuro 庫包含一些常見神經網路體系的實現和他們學習演算法:

  • multi-layer 飼料轉發網路利用啟動功能 ;

  • 距離網路 (Kohonen SOM,例如) ;

  • 簡單 perceptron 學習三角洲規則學習,回傳播學習 Kohonen SOM 學習 ;

  • 啟動函數 (bipolar 的 sigmoid 閾值 sigmoid)。
    AForge.Genetic 庫包含的類旨在解決不同的任務從優生演算法 (GA),遺傳程式設計 (GP) 和程式設計 (GEP) 地區的基因運算式:

  • GA 染色體 (二進位、 短 array,雙陣列),GP 樹基於的染色體和 GEP 染色體 ;

  • 選擇演算法 (精英、 職級的輪盤輪) ;

  • 公共健身函數 (1 / 2D 函數優化、 符號回歸,時序預測)。
    人口類來處理染色體。

AForge.MachineLearning 庫包含一些類從電腦學習區域:

  • QLearning Sarsa 學演算法 ;
    Ε 貪心,玻耳茲曼輪盤輪和禁忌搜索勘探政策。
AForge.Robotics 庫包含一些類操作一些 Robotics 工具包:

  • Lego Mindstorm RCX Robotics 工具包 ;

  • Mindstorm Lego NXT Robotics 工具包。

AForge.Video 庫包含階級提供對視頻資料的訪問。 好了它是考慮到的影像處理 Framework 中的內容量的。

  • 存取 JPEG 和 MJPEG串 流,使存取 IP 攝錄機 ;

  • 透過 DirectShow 介面 存取 USB Web 相機、 擷取裝置和視頻檔 ;

  • 使用音訊 for Windows 介面讀 / 寫 AVI 檔。
AForge.NET 框架包含還一些更多庫 / 命名空間提供其他功能的可能直接在使用或由其樣本 Framework 使用應用程式。
資料來源: http://www.aforgenet.com/framework/features.html

AForge.NET 2.0
功能 文檔 下載 討論 專案 成員 捐款