Photoshop中比較常用的一個功能就是曲線調整,如圖
透過滑鼠新增、刪除、拖曳曲線節點,這樣即可調整影像參數。這個功能就其想法來說(這裡只考慮曲線本身,資料儲存等不在此列),是比較簡單的:
曲線由一組Point表示節點
滑鼠移動節點實際上是修改單一Point
插入刪除Point
一個節點是一個手柄Handle,就是一個小方塊
在Paint裡畫出一條經過所有節點的曲線DrawCur
在Paint裡畫出一條經過所有節點的曲線DrawCurve
下面是部分範例程式碼:
List<point> points;</point>
Rectangle getHandle(Point p) { Rectangle rect = new Rectangle( p.X - 3, p.Y - 3, 6, 6); return rect; }
判断某点是否位于手柄区域:
繪製手把:
bool isHandle(Point p) { foreach (Point pt in points) { if (isInside(p, getHandle(pt))) { downIndex = points.IndexOf(pt); downPoint = pt; current = pt; return true; } } return false; }
注意这个部分可以适当放大一下判断区域,这样便于鼠标操作(手柄太小,不易点击)。
曲線繪製採用了Graphics類的基數樣條繪製方法,預設張力0.5。
繪製十字定位線(輔助功能):
void drawHandle(Graphics g, Point p) { if (points.IndexOf(p) == downIndex) g.FillRectangle( Brushes.Black, getHandle(p)); else g.DrawRectangle( Pens.Black, getHandle(p)); }
void drawCurve(Graphics g) { g.DrawCurve(Pens.Black, points.ToArray()); }