KingDZ 變菜鳥,每日一個C#小執行個體之—旋轉的圖片

來源:互聯網
上載者:User

上一個例子我們實現的是百葉窗的效果,這節課的例子我們實現的是旋轉的圖片效果,哈哈,這節課離不開GDI的操作,各位小菜菜們,我們一起來寫我們的代碼吧。

下面是,為了實現我們下面的效果,我們必須要知道幾個技術點。

 

TranslateTransform

的使用,我們首先把這張圖片的圓心移動到中心位置,也就是說我們要轉移中心點

    Bitmap bmp;    Bitmap background;    Graphics g;    private void pictureBox1_Click(object sender, EventArgs e)    {        bmp = (Bitmap)pictureBox1.Image.Clone();   //複製到映像         background = new Bitmap(pictureBox1.Width, pictureBox1.Height, System.Drawing.Imaging.PixelFormat.Format48bppRgb);        g = Graphics.FromImage(background);        g.TranslateTransform(background.Width / 2, background.Height / 2);    }

注意到上面的複製映像的辦法,我們以前已經看到過了,下面說的是  System.Drawing.Imaging.PixelFormat.Format48bppRgb

PixelFormat  是一個枚舉    指定映像中每個像素的顏色資料的格式。

Indexed

該像素資料包含色彩索引值,這意味著這些值是系統色彩表中顏色的索引,而不是單個顏色值。

Gdi

像素資料包含 GDI 顏色。

Alpha

像素資料包含沒有進行過自左乘的 alpha 值。

PAlpha

像素格式包含自左乘的 alpha 值。

Extended

保留。

Canonical

預設像素格式,每像素 32 位。 此格式指定 24 位色彩深度和一個 8 位 Alpha 色板。

Undefined

未定義像素格式。

DontCare

沒有指定像素格式。

Format1bppIndexed

指定像素格式為每像素 1 位,並指定它使用索引顏色。 因此顏色表中有兩種顏色。

Format4bppIndexed

指定格式為每像素 4 位而且已建立索引。

Format8bppIndexed

指定格式為每像素 8 位而且已建立索引。 因此顏色表中有 256 種顏色。

Format16bppGrayScale

像素格式為每像素 16 位。 該顏色資訊指定 65536 種灰色調。

Format16bppRgb555

指定格式為每像素 16 位;紅色、綠色和藍色分量各使用 5 位。 剩餘的 1 位未使用。

Format16bppRgb565

指定格式為每像素 16 位;紅色分量使用 5 位,綠色分量使用 6 位,藍色分量使用 5 位。

Format16bppArgb1555

像素格式為每像素 16 位。 該顏色資訊指定 32,768 種色調,其中 5 位為紅色,5 位為綠色,5 位為藍色,1 位為 alpha。

Format24bppRgb

指定格式為每像素 24 位;紅色、綠色和藍色分量各使用 8 位。

Format32bppRgb

指定格式為每像素 32 位;紅色、綠色和藍色分量各使用 8 位。 剩餘的 8 位未使用。

Format32bppArgb

指定格式為每像素 32 位;alpha、紅色、綠色和藍色分量各使用 8 位。

Format32bppPArgb

指定格式為每像素 32 位;alpha、紅色、綠色和藍色分量各使用 8 位。 根據 alpha 分量,對紅色、綠色和藍色分量進行自左乘。

Format48bppRgb

指定格式為每像素 48 位;紅色、綠色和藍色分量各使用 16 位。

Format64bppArgb

指定格式為每像素 64 位元;alpha、紅色、綠色和藍色分量各使用 16 位。

Format64bppPArgb

指定格式為每像素 64 位元;alpha、紅色、綠色和藍色分量各使用 16 位。 根據 alpha 分量,對紅色、綠色和藍色分量進行自左乘。

Max

此枚舉的最大值。

我們採用

Format24bppRgb

即可。

好了,第一步貯備完成了,已經將背景畫好了,而且經座標的原點轉移到圖片中心位置。下面我們開始自訂自己的  事件

當然最簡單的就是用到了,timer控制項 ,這裡我自己聲明一個全域的 

Timer tm;
tm = new Timer();       

然後

tm.Interval = 100;

tm.Tick += new EventHandler(tm_Tick);

tm.Enabled = true;

void tm_Tick(object sender, EventArgs e){    g.Clear(Color.White);    g.RotateTransform(10.0f);    g.DrawImage(bmp, -bmp.Width / 2, -bmp.Height / 2);    Graphics gn = pictureBox1.CreateGraphics();    gn.DrawImage(background, 0, 0);}首先是清空PictureBox裡面所有東東,為下面重新繪製做準備。
g.RotateTransform(10.0f);

每一次Time——Tick事件,將圖片旋轉10度。

g.DrawImage(bmp, -bmp.Width / 2, -bmp.Height / 2);
Graphics gn = pictureBox1.CreateGraphics();gn.DrawImage(background, 0, 0);

將圖片與背景一起完成。

好了下面我們實現的是,按指定角度旋轉圖片。這個需要一個文字框,用來輸入旋轉角度。

首先,將整個表單都變成一張畫布。

g = this.CreateGraphics();g.Clear(Color.White);

然後我們得到 圖片

 

Image img = pictureBox1.Image;

 

得到活動表單的 長和寬

PointF center = new PointF(this.Size.Width / 2, Size.Height / 2);

然後畫一個矩形  得到這個矩形的中心點座標

RectangleF re = new RectangleF(center.X, center.Y, img.Width, img.Height);PointF pCenter = new PointF(re.X + re.Width / 2, re.Y + re.Height / 2);
//移動到矩形中心點座標g.TranslateTransform(pCenter.X, pCenter.Y);//旋轉指定的角度g.RotateTransform(Convert.ToInt32(txtRotate.Text));//準備畫圖  旋轉之後,座標變負g.TranslateTransform(-pCenter.X, -pCenter.Y);//在矩形中繪製圖形g.DrawImage(img, re);//重設座標原點g.ResetTransform();

 

好了,這節課程的小例子結束了。歡迎大家拍磚

 

哈哈哈。

RotatePic.rar

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.