發表文章

目前顯示的是 11月, 2021的文章

[C#] 分割圖片

圖片
練習製作滑塊拼圖小遊戲,必須用到圖片切割,所以去找了一下其實還蠻簡單的,System.Drawing.Bitmap 就有方法了,此知識來自 StackOverFlow : How to crop an image using C#? 。 using System.IO; try { Image img = Image.FromFile(@"C:\.....\sample.jpg"); Bitmap bmp = (Bitmap)img; } catch(FileNotFoundException ex) { } Rectangle rect = new Rectangle(100, 180, 300, 200); Image result = bmp.Clone(rect, img.PixelFormat); 上面的程式碼就會將 sample.jpg 圖片上 (100, 180) 的位置開始切下寬300、高200的長方形賦予給 result,下為示意圖片: 就會得到黃色矩形的圖片,如下 要如影片切割成多塊來移動,我是用 PictureBox[] ,要注意的是第幾個 row 其實在坐標上有關的是 y 坐標,而第幾個 column 對應的是 x 坐標,另外因為 PictureBox 是另外 new 出來不是手動滑鼠拉的,必須有 Form.Controls.Add() 來讓他出現在視窗上。 using System.IO; PictureBox[] picBlock = new PictureBox[16]; int blockWidth, blockHeight; try { Image img = Image.FromFile(@"C:\.....\sample.jpg"); Bitmap bmp = (Bitmap)img; blockWidth = img.Width / 4; blockHeight = img.Height / 4; } catch(FileNotFoundException ex) { } for(int i=0; i

[C#] GUI 中的 .RotateTransform() 方法無旋轉中心參數

圖片
在用 C# 練習時鐘問題,要將圖片旋轉時發現 Graphics.RotateTransform() 方法竟然只有一個參數就是角度(另一個多載也沒有),如上圖上方是 C#,下方是 Java,促使我研究了一下,其實不難。首先先瞭解一下電腦中的坐標系是向右為 x 軸正向,向下是 y 軸正向,如下圖: 有摸 GUI 的人應該很熟悉了,其實四個象限存在,只是視窗可視的部份是 x,y 皆正,上圖我用黃色區域表示第一象限。如果要把一張圖片(這裡我用台灣翠青旗)畫出來,要求旗子的左上角定位在 (20, 30) P 這一點,如下圖: 這非常簡單,C# 的話用 DrawImage() 方法: namespace RotateDemo { public partial class Form1 : Form { Image flag; public Form1() { try { flag = Image.FromFile("flag.png"); } catch(Exception) { } } private void Form1_Paint(object sender, PaintEventArgs e) { Graphics gfx = e.Graphics; gfx.DrawImage(flag, 20, 30); // 重點在這行 } } } 接下來我都省略其他部份著重在 gfx 的動作,如果要將形狀為矩形的旗子正中央定位在 (20, 30),則 DrawImage 坐標的引數減去矩形寬與高的一半即可: gfx.DrawImage(flag, 20-38/2, 30-26/2); // 假定圖片(旗子)大小是寬38,高26,不精準的示意尺寸 以上兩個可以利用 Graphics 的 .TranslateTransform() 平移變換方法。想像一下 Graphics 有一張自己的畫布,和螢幕上可視的視窗不一樣,最開始原點 O' 和視窗上的原點 O 重合,兩軸稱作 u 軸和 v 軸,分別與視窗上的 x 軸和 y 軸重...