上一個例子我們實現的是百葉窗的效果,這節課的例子我們實現的是旋轉的圖片效果,哈哈,這節課離不開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