自定义控件系列,基于OxyPlot开发。
ImageCanvas控件
功能包括:二维数组图像显示;伪彩(十七种标准Colormap,支持自定义Colormap);支持绘制直线、折线、角度、椭圆(包括圆)、矩阵(包括正方形)、多边形即ROI、文本标注、箭头标注、标题;自动计算长度、角度、面积(像素点个数、总和、平均值);保存、加载绘制对象;保存 ROI数据模板;缩放、平移;旋转、翻转。
更多功能更新中:图像处理部分。
部分测试代码
private void Button_Click(object sender, RoutedEventArgs e)
{
if ((sender as Button).Name.ToString() == "btnImageData")
{
var singleData = new double[row];
for (int x = 0; x < row; ++x)
{
singleData[x] = Math.Exp((-1.0 / 2.0) * Math.Pow((x - 40.0) / 10, 2.0));
}
var data = new double[row, col];
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
data[i, j] = singleData[i] * singleData[(j + 20) % col];
}
}
File.WriteAllLines("data.txt", SetMatToString(data));
myImageCanvas1.SetObjData(data);
myImageCanvas2.SetObjData(data);
myImageCanvas2.SetObjSize(col * 3, row * 3);
myImageCanvas1.SetPixelSize(2, 1);
myImageCanvas2.SetPixelSize(1, 1);
// 操作列表
operationFlag = myImageCanvas1.GetObjDrawingFlag();
operationList.Items.Clear();
for (int i = 0; i < operationFlag.Length; i++)
{
operationList.Items.Add(operationFlag[i]);
}
operationList.SelectedIndex = 1;
// 标题信息
infoList.Items.Clear();
infoList.Items.Add("LeftTopInfo");
infoList.Items.Add("RightTopInfo");
infoList.Items.Add("LeftBottomInfo");
infoList.Items.Add("RightBottomInfo");
infoList.SelectedIndex = 0;
// 颜色列表
colorbarFlag = myImageCanvas1.GetObjColorbarFlag();
colorList.Items.Clear();
for (int i = 0; i < colorbarFlag.Length; i++)
{
colorList.Items.Add(colorbarFlag[i]);
}
colorList.SelectedIndex = -1;
// 订阅事件
myImageCanvas1.UpdateEvent += UpdateTransferFunction;
myImageCanvas2.UpdateEvent += UpdateTransferFunction;
}
else if ((sender as Button).Name.ToString() == "btnZoom")
{
isZoom = !isZoom;
myImageCanvas1.SetObjZoomEnabled(isZoom);
myImageCanvas2.SetObjZoomEnabled(isZoom);
}
else if ((sender as Button).Name.ToString() == "btnSize")
{
myImageCanvas2.SetObjSize(col * 2, row * 2);
double ratio = Math.Min(myImageCanvas2.ActualWidth / col, myImageCanvas2.ActualHeight / row);
myImageCanvas2.SetObjRightTopText("Zoom: " + (int)(ratio * myImageCanvas2.GetObjZoomRatio()));
}
else if ((sender as Button).Name.ToString() == "btnClear")
{
myImageCanvas1.SetObjClear();
myImageCanvas2.SetObjClear();
}
else if ((sender as Button).Name.ToString() == "btnDefault")
{
myImageCanvas1.SetObjDefault();
myImageCanvas2.SetObjDefault();
}
else if ((sender as Button).Name.ToString() == "btnSave")
{
myImageCanvas2.SaveObjDrawings("test.draw");
}
else if ((sender as Button).Name.ToString() == "btnLoad")
{
myImageCanvas2.LoadObjDrawings("test.draw");
}
else if ((sender as Button).Name.ToString() == "btnSaveROI")
{
myImageCanvas2.SaveObjROIModel("test.roi");
}
else if ((sender as Button).Name.ToString() == "btnROIArea")
{
List<double> areas = myImageCanvas2.GetObjROIArea();
if (areas.Count >= 2)
{
MessageBox.Show(areas[0].ToString() + "\n" + areas[1]);
}
}
else if ((sender as Button).Name.ToString() == "btnMirror")
{
myImageCanvas2.SetObjMirror("Horizontal");
}
else if ((sender as Button).Name.ToString() == "btnMirrorVertical")
{
myImageCanvas2.SetObjMirror("Vertical");
}
else if ((sender as Button).Name.ToString() == "btnRotate")
{
myImageCanvas2.SetObjRotate();
}
else if ((sender as Button).Name.ToString() == "btnClearTransform")
{
myImageCanvas2.SetObjTransformClear();
}
}