其主要思路就是提取图片每个1px宽度上面的像素点,每个宽度只提取一个,并用Point记录这个像素点的 x和y。这样做的前提是图片除了波形有明显颜色以外,其他地方的像素点都能被排除,最方便的就是把排除区域变透明。但在这里我遇到了个问题,明明图片看着透明了,但其实Color的透明度不一定是0,就无排除无效的点,反而是把这种透明点算成波形上的点了,最后提取出来的波形就是错误的。
对于图片的透明操作,我是在这个网站做的:稿定。https://www.uupoop.com/#/,专业版导图什么的也不收费,只需要注册就行。
具体操作也简单:
颜色不杂的图片可以用矩形工具填充白色把杂色遮住。
然后
滤镜 锐化 可以加深保留的颜色这步可以省略。
最后
其他 ColorToAlpha,把图片变为透明图片。
我一个不会ps的,自己摸索一阵子,就能成。
然后获取图片像素的方法:
public static void GetImagePixelV3(Bitmap img, ref Dictionary<Point, Color> dicsMax) { for (int i = 0; i < img.Width; i++) { for (int j = 0; j < img.Height; j++) { var color = img.GetPixel(i, j); if (color.A == 0 && color.B == 0 && color.G == 0 && color.R == 0) { continue; } else { if (color.A <128)//透明度 { continue; } var pt = new Point(i, j); dicsMax[pt] = color; break; } } } }
画图:就GD+
var map = new Bitmap(ImgWidth, ImgHeight); var g = Graphics.FromImage(map); for (int i = 0; i < DicsTop.Count; i++) { var pt2 = DicsTop.ElementAt(i).Key; points.Add(pt2); } points.Sort((x1, x2) => { return x1.X - x2.X; }); for (int i = 1; i < points.Count; i++) { var pt1 = points[i - 1]; var pt2 = points[i]; g.DrawLine(Pens.Blue, pt1, pt2); } g.Dispose(); picDraw1.BackgroundImage = map;