此文是用.NET Iobject 7c 下利用vs2010开发的winform版 单值专题图的创建及色带的修改。在此记下来以便后期参考(可能很快就会被淹没,超图的更新换代很快)

  初期由于不知道样式的承载控件应该选择那个,测试过listview、listbox,但是效果都不满意,偶然间查到datagridview可以更好的充当这个角色,展示效果做好肯定就要配套的修改功能了,这个修改我咨询过客服,客服说在修改方面,只是给了一个样式修改的接口,我测试过对修改对象进行清空,赋值都不行,对象和地图展示的关联较强;

在测试中发现,若是对专题图对象删除再次添加,所添加的名称和删除图层的名称保持不变,最后只能曲线的进行对图层的删除和重新添加,

----》 第一个窗体为主窗体展示,最后一个窗体为增删值做准备

说明:1 下拉框根据单值的条件筛选填入字段名称

   2 承载数据的控件时datagridview,需要把该控件的列指定特定的值 如图 2

     3  按钮--添加所有值就是重新根据条件进行读取一次数据并展示出来

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SuperMap.Mapping;
using SuperMap.Data;
using SuperMap.UI;
using soTest.ThematicMap;namespace SuperMap.SampleCode.Mapping
{public partial class frmThemeUnique : Form{Workspace m_workspace;List<ColorGradientType> setColorTheml = null;Dataset objLayer = null;ThemeUnique objThemeUnique = null;MapControl objMapControl = null;public frmThemeUnique(Workspace m_workspace, Dataset layer, ThemeUnique objThemeUnique,MapControl objMapControl){InitializeComponent();this.m_workspace = m_workspace;this.objLayer = layer;this.objThemeUnique = objThemeUnique;this.objMapControl = objMapControl;dataGridView2.CellMouseClick += new DataGridViewCellMouseEventHandler(dataGridView2_CellMouseClick);dataGridView2.CellMouseDoubleClick += new DataGridViewCellMouseEventHandler(dataGridView2_CellMouseDoubleClick);}/// <summary>/// 窗体加载事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void frmThemeUnique_Load(object sender, EventArgs e){resources = m_workspace.Resources;// string path = Application.StartupPath.Substring(0, Application.StartupPath.LastIndexOf("CurExe"));//设置单值专题图数值        #region MyRegion            setColorTheml = new List<ColorGradientType>();setColorTheml.Add(ColorGradientType.Spectrum);setColorTheml.Add(ColorGradientType.Terrain);setColorTheml.Add(ColorGradientType.GreenOrangeViolet);setColorTheml.Add(ColorGradientType.Rainbow);setColorTheml.Add(ColorGradientType.CyanGreen);setColorTheml.Add(ColorGradientType.CyanBlue);//  setColorTheml.Add("青->蓝渐变色", ColorGradientType.PinkBlue);setColorTheml.Add(ColorGradientType.PinkRed);setColorTheml.Add(ColorGradientType.BlueRed);setColorTheml.Add(ColorGradientType.GreenRed);setColorTheml.Add(ColorGradientType.GreenBlue);setColorTheml.Add(ColorGradientType.YellowBlue);setColorTheml.Add(ColorGradientType.YellowGreen);setColorTheml.Add(ColorGradientType.YellowRed);setColorTheml.Add(ColorGradientType.CyanBlack);setColorTheml.Add(ColorGradientType.PinkBlack);setColorTheml.Add(ColorGradientType.YellowBlack);setColorTheml.Add(ColorGradientType.BlueBlack);setColorTheml.Add(ColorGradientType.GreenBlack);setColorTheml.Add(ColorGradientType.RedBlack);setColorTheml.Add(ColorGradientType.CyanWhite);setColorTheml.Add(ColorGradientType.PinkWhite);setColorTheml.Add(ColorGradientType.YellowWhite);setColorTheml.Add(ColorGradientType.BlueWhite);setColorTheml.Add(ColorGradientType.GreenWhite);setColorTheml.Add(ColorGradientType.RedWhite);setColorTheml.Add(ColorGradientType.BlackWhite);#endregiondataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect;dataGridView2.AllowUserToAddRows = false;setDZcombox();if (objThemeUnique == null){showDZinformation();}else{updateThemeUnique(objThemeUnique);}}public void updateThemeUnique(ThemeUnique objThemeUnique){comboBox1.Text = objThemeUnique.UniqueExpression;         for (int i = 0; i < objThemeUnique.Count; i++){objThemeUniqueItem.Add(objThemeUnique[i]);Image im = getImage(objLayer.Type, objThemeUnique[i].Style);dataGridView2.Rows.Add(true, im, objThemeUnique[i].Caption);             }}#region 单值专题图public void setDZcombox(){DatasetVector objDv = objLayer as DatasetVector;FieldInfos objFled = objDv.FieldInfos;FieldInfo objFd = null;for (int i = 0; i < objFled.Count; i++){objFd = objFled[i];comboBox1.Items.Add(objFd.Name.Trim());}if (comboBox1.Items.Count > 0)comboBox1.SelectedIndex = 0;objFled = null;objDv = null;}// 设置单值专题图ThemeUnique themeunique = null;DatasetVector datasetVector = null;Geometry objg = null;Resources resources = null;//单只专题图子项集合List<ThemeUniqueItem> objThemeUniqueItem = new List<ThemeUniqueItem>();//删除的单值专题图集合List<ThemeUniqueItem> objDeleteThemeUniqueItem = new List<ThemeUniqueItem>();List<string> list = new List<string>();/// <summary>/// 单值绑定方法/// </summary>public void showDZinformation(){themeunique = new ThemeUnique();//清空数据objThemeUniqueItem.Clear();objDeleteThemeUniqueItem.Clear();list.Clear();//专题图清空themeunique.Clear();//列表清空dataGridView2.Rows.Clear();// 当只有普通图层时,添加专题图层datasetVector = objLayer as DatasetVector;//设置字段表达式themeunique.UniqueExpression = comboBox1.Text.Trim();Recordset objRecor = datasetVector.GetRecordset(false, CursorType.Static);FieldInfos objFled = datasetVector.FieldInfos;objRecor.MoveFirst();for (int j = 0; j < objRecor.RecordCount; j++){//新建DataTable的行对象             if (objRecor.FieldCount == objFled.Count){object value = objRecor.GetFieldValue(comboBox1.SelectedIndex);if (value != null){if (!string.IsNullOrWhiteSpace(value.ToString().Trim())){objg = objRecor.GetGeometry();list.Add(value.ToString().Trim());}}}else{// MessageBox.Show("字段数有问题!", "提示");}objRecor.MoveNext();//移到下个列}//释放对象objRecor.Dispose();//专题图子项ThemeUniqueItem objItem = null;GeoStyle geostyle1 = null;Random objRan = new Random();// 根据指定的渐变颜色类型,返回一个 Colors 类的对象//运行结果是根据指定的渐变颜色返回的4个颜色构成的颜色集合,颜色值为://(R=0,G=255,B=0),(R=0,G=255,B=85),(R=0,G=255,B=170),(R=0,G=255,B=255)Colors colors = Colors.MakeGradient(list.Count, ColorGradientType.BlueBlack, false);// 得到点线面的RootGroupList<string> isTrueAndFalse = new List<string>();for (int i = 0; i < list.Count; i++){string itemName = list[i];objItem = new ThemeUniqueItem();objItem.Caption = itemName;objItem.IsVisible = true;geostyle1 = GeoStyleSample(objLayer.Type, colors[isTrueAndFalse.Count]);// geostyle1;objItem.Style = geostyle1;objItem.Unique = itemName;if (!isTrueAndFalse.Contains(itemName)){objThemeUniqueItem.Add(objItem);Image im = getImage(objLayer.Type, geostyle1);dataGridView2.Rows.Add(true, im, itemName);isTrueAndFalse.Add(itemName);}}}/// <summary>/// 单元格单击事件 此事件主要针对专题图的显示和隐藏进行操作/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void dataGridView2_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e){if (dataGridView2.Columns[e.ColumnIndex].Name.Equals("checkbox")){bool value = (bool)dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;if (value){dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = false;objThemeUniqueItem[e.RowIndex].IsVisible = false;}else{dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = true;objThemeUniqueItem[e.RowIndex].IsVisible = true;}}}/// <summary>/// 单元格双击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void dataGridView2_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e){          if (dataGridView2.Columns[e.ColumnIndex].Name.Equals("imgvalue")){//样式符号GeoStyle objGeoStyle = SymbolDialog.ShowDialog(m_workspace.Resources, objThemeUniqueItem[e.RowIndex].Style, GetSymbolType(objLayer.Type));if (objGeoStyle != null){//更新专题图样式objThemeUniqueItem[e.RowIndex].Style = objGeoStyle;//更换列表中的图像if (objLayer.Type == DatasetType.Point){//获取符号编号int num = objGeoStyle.MarkerSymbolID;//加载符号库SymbolLibrary symbolMarkerLibrary = resources.MarkerLibrary;//拟定一个点对象GeoPoint point = new GeoPoint(5, 5);//获取并赋值对应的点样式point.Style = objGeoStyle;//从库中查找对应的点符号编号Symbol symbol = symbolMarkerLibrary.FindSymbol(num);//objThemeUniqueItem[e.RowIndex].Style.SetSymbolMarker(symbol as SymbolMarker);dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = DrawSymbol(symbol, point, 20, 20);}else if (objLayer.Type == DatasetType.Line){//获取符号编号int num = objGeoStyle.LineSymbolID;//加载符号库SymbolLibrary symbolMarkerLibrary = resources.LineLibrary;//拟定一个线对象Point2Ds point2Ds = new Point2Ds();point2Ds.Add(new Point2D(0, 5));point2Ds.Add(new Point2D(15, 5));GeoLine line = new GeoLine(point2Ds);//获取并赋值对应的点样式line.Style = objGeoStyle;//从库中查找对应的线符号编号Symbol symbol = symbolMarkerLibrary.FindSymbol(num);// objThemeUniqueItem[e.RowIndex].Style.SetSymbolLine(symbol as SymbolLine);dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = DrawSymbol(symbol, line, 20, 20);}else if (objLayer.Type == DatasetType.Region){//获取符号编号int num = objGeoStyle.FillSymbolID;//加载符号库SymbolLibrary symbolFillLibrary = resources.FillLibrary;//拟定一个面对象Point2Ds point2Ds = new Point2Ds();point2Ds.Add(new Point2D(0, 0));point2Ds.Add(new Point2D(0, 15));point2Ds.Add(new Point2D(15, 15));point2Ds.Add(new Point2D(15, 0));GeoRegion region = new GeoRegion(point2Ds);//获取并赋值对应的面样式region.Style = objGeoStyle;//从库中查找对应的点符号编号Symbol symbol = symbolFillLibrary.FindSymbol(num);//objThemeUniqueItem[e.RowIndex].Style.SetSymbolFill(symbol as SymbolFill);dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = DrawSymbol(symbol, region, 20, 20);}}}}/// <summary>/// 根据数据集类型获取符号库的类型/// </summary>/// <param name="datasetType">数据集类型</param>/// <returns>返回符号库类型</returns>private SymbolType GetSymbolType(DatasetType datasetType){SymbolType result = SymbolType.Marker;switch (datasetType){case DatasetType.Line:{result = SymbolType.Line;}break;case DatasetType.Point:{result = SymbolType.Marker;}break;case DatasetType.Region:{result = SymbolType.Fill;}break;default:break;}return result;}/// <summary>///获取列表中显示的图片 设置默认值并在列表中显示/// </summary>/// <param name="P"></param>/// <param name="geostyle1"></param>/// <returns></returns>public Image getImage(DatasetType P, GeoStyle geostyle1){Image im = null;if (P == DatasetType.Point){//符号库SymbolLibrary symbolMarkerLibrary = resources.MarkerLibrary;SymbolGroup m_symbolMarkerRootGroup = symbolMarkerLibrary.RootGroup;GeoPoint point = new GeoPoint(5, 5);point.Style = geostyle1;Symbol symbol = null;if (geostyle1.MarkerSymbolID == null){symbol = m_symbolMarkerRootGroup[0];//symbolMarkerLibrary.FindSymbol(0);//}else {symbol = m_symbolMarkerRootGroup[geostyle1.MarkerSymbolID];//symbol = symbolMarkerLibrary.FindSymbol(geostyle1.MarkerSymbolID);//symbolMarkerLibrary.FindSymbol(0);//}             im = DrawSymbol(symbol, point, 20, 20);}else if (P == DatasetType.Line){SymbolLibrary symbolLineLibrary = resources.LineLibrary;SymbolGroup m_symbolLineRootGroup = symbolLineLibrary.RootGroup;Point2Ds point2Ds = new Point2Ds();point2Ds.Add(new Point2D(0, 5));point2Ds.Add(new Point2D(15, 5));GeoLine line = new GeoLine(point2Ds);line.Style = geostyle1;Symbol symbol = null;if (geostyle1.LineSymbolID == null){symbol = m_symbolLineRootGroup[0];//symbolMarkerLibrary.FindSymbol(0);//}else{symbol = m_symbolLineRootGroup[geostyle1.LineSymbolID];//symbol = symbolLineLibrary.FindSymbol(geostyle1.LineSymbolID);//symbolMarkerLibrary.FindSymbol(0);//}              im = DrawSymbol(symbol, line, 20, 20);}else if (P == DatasetType.Region){SymbolLibrary symbolFillLibrary = resources.FillLibrary;SymbolGroup m_symbolFillRootGroup = symbolFillLibrary.RootGroup;//构造点对象,由点组成面对象Point2Ds point2Ds = new Point2Ds();point2Ds.Add(new Point2D(0, 0));point2Ds.Add(new Point2D(0, 15));point2Ds.Add(new Point2D(15, 15));point2Ds.Add(new Point2D(15, 0));GeoRegion region = new GeoRegion(point2Ds);region.Style = geostyle1;Symbol symbol = null;if (geostyle1.FillSymbolID == null){symbol = m_symbolFillRootGroup[0];//symbolMarkerLibrary.FindSymbol(0);//}else{symbol = m_symbolFillRootGroup[geostyle1.FillSymbolID];// symbol = symbolFillLibrary.FindSymbol(geostyle1.FillSymbolID);//symbolMarkerLibrary.FindSymbol(0);//}// Symbol symbol = m_symbolFillRootGroup[0];//symbolFillLibrary.FindSymbol(0);//im = DrawSymbol(symbol, region, 20, 20);}return im;}/// <summary>/// 设置符号样式/// </summary>/// <param name="P"></param>/// <param name="c"></param>/// <returns></returns>public GeoStyle GeoStyleSample(DatasetType P, Color c){GeoStyle objGeoStyle = new GeoStyle();switch (P){case DatasetType.Point:// 实例化一个点几何对象,并对其进行风格设置// GeoStyle geoStyle_P = new GeoStyle();objGeoStyle.LineColor = c;objGeoStyle.MarkerSize = new Size2D(5, 5);// geoStyle_P.MarkerSymbolID = 0;  //系统图标//objGeoStyle = geoStyle_P;break;case DatasetType.Line:// 实例化一个线几何对象,并对其进行风格设置//GeoStyle geoStyle_L = new GeoStyle();objGeoStyle.LineColor = c;//geoStyle_L.LineSymbolID = 15;objGeoStyle.LineWidth = 1.0;                 // objGeoStyle = geoStyle_L;break;case DatasetType.Region:// 实例化一个面几何对象,并对其进行渐变风格设置//GeoStyle geoStyle_R = new GeoStyle();objGeoStyle.FillBackColor = Color.White;;objGeoStyle.FillForeColor = c;objGeoStyle.FillBackOpaque = true;// geoStyle_R.FillOpaqueRate = 50;// geoStyle_R.FillSymbolID = 0;//geoStyle_R.FillGradientMode = FillGradientMode.Linear;//objGeoStyle = geoStyle_R;break;}return objGeoStyle;}#endregion#region 点、线、面 datagridview绘制/// <summary>/// 绘制符号转换为图片/// 我去。。。/// </summary>/// <param name="symbol"></param>public Image DrawSymbol(Symbol symbol, Geometry geometry, Int32 width, Int32 height){try{Bitmap bitmap = new Bitmap(width, height);if (symbol.Type == SymbolType.Marker){//geometry.Style.MarkerSymbolID = symbol.ID;                 Toolkit.Draw(geometry, m_workspace.Resources, Graphics.FromImage(bitmap));}else if (symbol.Type == SymbolType.Line){//此句必须加上,不然在点击切换样式时无效果// geometry.Style.LineSymbolID = symbol.ID;      symbol.Draw(bitmap, geometry);//  Toolkit.Draw(geometry, mainfrm.m_workspace.Resources, Graphics.FromImage(bitmap));}else if (symbol.Type == SymbolType.Fill){//geometry.Style.FillSymbolID = symbol.ID;symbol.Draw(bitmap, geometry);// Toolkit.Draw(geometry, mainfrm.m_workspace.Resources, Graphics.FromImage(bitmap));}Image objImage = bitmap;return objImage;}catch (Exception ex){// Trace.WriteLine(ex.Message);}return null;}#endregion//确定按钮private void btnSure_Click(object sender, EventArgs e){//默认的方式 预备暂时不用// ThemeUnique themeunique = ThemeUnique.MakeDefault(datasetVector, comboBox1.Text.Trim(), setColorTheml[comboBoxEx1.SelectedIndex]);// 将制作好的专题图添加到地图中显示if (datasetVector != null && objThemeUniqueItem.Count > 0){for (int i = 0; i < objThemeUniqueItem.Count; i++){themeunique.Add(objThemeUniqueItem[i]);}// Layer sd = mainfrm.m_LayersControl.Map.Layers.FindLayer("");             Layer layer = objMapControl.Map.Layers.Add(datasetVector, themeunique, true);// m_MapControl.Map.Refresh();themeunique.Dispose();this.Close();}else {               objThemeUnique.Clear();// mainfrm.m_LayersControl.Map.Layers.Remove()for (int i = 0; i < objThemeUniqueItem.Count; i++){objThemeUnique.Add(objThemeUniqueItem[i]);}//objThemeUnique.FromXML(themeunique.ToXML());                objMapControl.Map.Refresh();               this.Close();}}/// <summary>/// 取消/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void BtnCancle_Click(object sender, EventArgs e){this.Close();}private void btnAddValue_Click(object sender, EventArgs e){showDZinformation();}/// <summary>/// 添加子项/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnAddChild_Click(object sender, EventArgs e){          changeUniqueItem showChage = new changeUniqueItem(objDeleteThemeUniqueItem, objThemeUniqueItem,dataGridView2,this);       showChage.ShowDialog();}/// <summary>/// 添加值/// </summary>/// <param name="num"></param>public void addToDataGridView(int num){if (objDeleteThemeUniqueItem.Count > 0){Image im = getImage(objLayer.Type, objDeleteThemeUniqueItem[num].Style);dataGridView2.Rows.Add(true, im, objDeleteThemeUniqueItem[num].Caption);}}/// <summary>/// 删除子项/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnDeleteChild_Click(object sender, EventArgs e){int num = dataGridView2.CurrentRow.Index;if (num >= 0) {//移除专题图               dataGridView2.Rows.RemoveAt(num);objDeleteThemeUniqueItem.Add(objThemeUniqueItem[num]);objThemeUniqueItem.RemoveAt(num);              }}}
}

主窗体代码

超图举例单值专题图色带样式控制相关推荐

  1. 超图单值专题图 - 行政区划类型学习

    打开自带数据源: 先制作一个标签专题图:字段选择 SmArea: 完成后如下: 然后添加一个单值专题图:类别选择 行政区划类型: 完成后有三个图层: 字段选择SmGeoPosition: 完成后如下: ...

  2. Supermap 组合单值专题图与标签专题图演示样例

    效果图例如以下:单值专题图并显示每一个区域的相关文字信息 代码: <!DOCTYPE> <html> <head> <meta http-equiv=&quo ...

  3. Supermap 组合单值专题图与标签专题图示例

    效果图如下:单值专题图并显示每个区域的相关文字信息 代码: <!DOCTYPE> <html> <head> <meta http-equiv="C ...

  4. 超图桌面版制作一幅简单专题图示例

    打开桌面版本8c,打开自带示例数据源 重庆: 根据数据集 main_road_0 制作一幅地图:此数据集是重庆市主要公路的一部分:制作地图见此: https://blog.csdn.net/bcbob ...

  5. 超图桌面版制作分段专题图学习

    接此: https://blog.csdn.net/bcbobo21cn/article/details/107118903 打开自带示例数据源,OverlayData: 先制作一份标签专题图:效果如 ...

  6. vue使用e-charts制作专题图(广西省为例)---第一篇

    vue使用E-Charts制作专题图(广西省为例)---第一篇 写博客是为了做笔记 先给大家看一下效果图: "专题图"顾名思义就是地图的每一部分根据一定的标准,展现出不一样颜色,使 ...

  7. arcpy.mapping实战-专题图制图自动化

    arcpy.mapping实战-专题图制图自动化 by 李远祥 最初对arcpy.mapping感兴趣是因为一次大规模的专题地图调整的需要,由于某某单位利用ArcEngine编写的专题图出图系统,出现 ...

  8. 第八章 ArcGIS地图制图 点线面符号、专题图、标记的制作

    文章目录 第一节 点符号的制作方法 1 ArcGIS的样式管理器使用 2 制作一些点符号,如一个图中间一个字 3 FontCreator使用 4 修改己有的符号库 第二节 线面符号制作 1 简单线符号 ...

  9. hexo给文章插入图片、进行图片样式控制

    写在前面 在hexo插入图片这方面花了不少时间,原本使用了大佬的插件,一直没成功,然后找到了使用"{%%}"插入图片的解决方法,下文描述了四种插入图片的方法和大佬插件使用上的一点问 ...

最新文章

  1. 解析三层架构(1)---为什么要分层?
  2. c语言u64数据类型打印,小谈C语言中常见数据类型在32及64位机上的使用
  3. html 按下和松开事件,JQuery通过键盘控制键盘按下与松开触发事件
  4. bzoj3156 防御准备 - 斜率优化
  5. Java如何将指定字符串转化为指定日期格式
  6. 编译型和解释型语言的区别
  7. 如何将两部手机内容互换_什么是内容营销?如何将内容营销做到深入人心?
  8. ListView和RecycleView的性能比对
  9. py3+urllib+re,爬虫下载捧腹网图片
  10. python编程从入门到实践第八章_Python编程从入门到实践的第三天
  11. 开始上手docker
  12. IDC:2017年医疗行业IT花费将达336.5亿
  13. 锂离子电池性能测试软件,锂离子电池的常规性能测试方式介绍
  14. typora高级设置字体_设计黑金风格高级感logo
  15. 微信小程序-icon图标
  16. bing搜索php,必应bing网页搜索小偷php程序 v1.0PHP小偷采集源码下载-华软网
  17. 大学计算机思维导论第一讲测验答案,第一讲导论习题.doc
  18. 举例说明如何使用【聚合数据】的API接口
  19. 彻底搞明白梯度下降算法1:方向导数与梯度概念理解
  20. 浪潮服务器光驱安装操作系统,浪潮服务器安装

热门文章

  1. item_search_shop -VVIC 商家商品列表
  2. 南京师范大学计算机控制系统,基于计算机软件控制系统的静电放电研究-南京师范大学学报.PDF...
  3. vue父子组件之间的传值,及互相调用父子组件之间的方法
  4. Linux课堂笔记--第九天
  5. 现在智能机怎么玩Java游戏,教你如何用安卓机玩JAVA老游戏
  6. 地大计算机学院田甜,【学霸画像】第七十一期—记计算机学院2013级本科生詹才韬...
  7. 面向对象设计原则(一)单一原则
  8. python opencv 图片/视频 拼接
  9. Amy姐白富美训练营内部资料
  10. “聪明程序员”的自嘲