欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

PNG - MetaTrader 5 库

author emer | 759 人阅读 | 0 人评论 |

PNG - library for MetaTrader 5

PNG - library for MetaTrader 5

PNG - library for MetaTrader 5

该库允许您轻松地处理 PNG 图形文件,并缩放它们。

上传 PNG 图片有两种方法:

通过资源处理 PNG 图像:

// 构造函数
// CPng(const uchar &bin_data[], bool create_canvas = false, int x = 0, int y = 0); // // 从资源中获取PNG
#包括<画布\png.mqh>#资源“//图像//图标.png” 作为 乌查尔png_数据[]#资源“//图像//image1.png” 作为 乌查尔图片1[]

CPng png1(png_data);             // 从资源中获取 PNG (icons.png),将其解压到位图数组 png1.bmp[] 中,并且还不创建画布CPng png2(图像1,真的,200,50); // 从资源中获取PNG(image1.png),将其解压到位图数组png2.bmp[]中,创建画布并将其显示在屏幕上的坐标(X=200,Y=50)处


通过文件处理 PNG 图像:

// 构造函数
// CPng(字符串 file_path, bool create_canvas = false, int x = 0, int y = 0); // 从文件中获取PNG
#包括<画布\png.mqh>

CPng png1(“图像1.png”);               // 从文件 (MQL5\Files\image1.png) 获取 PNG 图像,将其解压到位图数组 png1.bmp[] 中,并且还不创建画布CPng png2(“立方体.png”,真的,200,100);// 从文件 (MQL5\Files\cubes.png) 获取 PNG 图像,创建画布并将其显示在屏幕上的坐标 (X=200, Y=100) 处


正如您所看到的,可以立即形成画布并将图像显示在屏幕上。您还可以满足于仅创建 bmp[] 位图数组,而不为此图像创建画布对象。在这种情况下,您可以在更高级的实现中使用您自己的画布(请参阅下面的演示)。

此外,这个CPng类的一个重要功能是能够使用Resize(double NewWidth)方法生成一个新的图像尺寸,该图像将位于_bmp[]数组中,该数组也可以显示在屏幕上,形成这个尺寸的画布。

在这种情况下,类实例将包含两个宽度为“的 bmp[] 数组(原始图像)”宽度“和身高”高度”,以及调整大小的 _bmp[] 数组(宽度“_宽度“和身高”_高度")。 CPng 类中名称开头带有下划线的所有方法和参数均指调整大小的图像(_bmp[]、_width、_height、_CreateCanvas()、_MoveCanvas())

以下功能还可用于处理原始图像和修改后的图像:

  空白              调整大小(双倍的新宽度);              // 调整图像大小  布尔值              创建画布(常量 整数x,常量 整数y);  // 为 bpm[] 数组创建画布(原始大小)  布尔值              _创建画布(常量 整数x,常量 整数y);  // 为 _bpm[] 数组创建画布(调整大小)  布尔值              移动画布(常量 整数x,常量 整数y);      // 将图像画布移动到原始大小  布尔值              _移动画布(常量 整数x,常量 整数y);    // 移动调整大小的图像画布  空白              BmpArrayFree() {数组自由(bmp);}          // 如果不再需要,则清除主位图数组以节省内存


我准备了一个演示程序 - Expert (Expert_Test_PNG.mq5),它紧凑而直观地演示了该库的工作。在这个例子中,除了简单地显示PNG图像之外,还实现了对PNG图标表的解析。 (参见gif动画)

我看到了这个算法的实现,用于解压缩PNG文件@佐罗在这个邮政7年前,它被作为这个库的基础。调整大小算法是我开发的。

PNG - library for MetaTrader 5

#包括<画布\png.mqh>#包括<画布\iCanvas_CB.mqh>// https://www.mql5.com/ru/code/22164
#资源“//图像//图标.png” 作为 乌查尔png_数据[]//+------------------------------------------------------------------+CPng png1(png_data);                  // 从资源中获取 PNG,将其解压到位图数组 bmp[] 中,并且还不创建画布CPng png2(“立方体.png”,真的,0,100);// 从文件中获取 PNG,创建画布并将其显示在屏幕上的坐标 (X=0, Y=100) 处
//+------------------------------------------------------------------+
整数 初始化时() {
   png1.调整大小(600);
   png1._CreateCanvas(700,150);
   png1.调整大小(宽.宽度/6);
   png2.调整大小(220);
   png2._CreateCanvas(W.MouseX, W.MouseY);

   png1.BmpArrayFree();
  事件集毫秒定时器30);
  返回初始化成功);
}//+------------------------------------------------------------------+
空白 解初始化常量 整数原因) {
  事件终止定时器();
}//+------------------------------------------------------------------+
空白 勾选() {
}//+------------------------------------------------------------------+
空白 定时器() {
  静止的 双倍的角度=0;
   绘制图标(角度);
   角度+=0.06;
}//+------------------------------------------------------------------+
空白 图表事件常量 整数ID,
                  常量 长的&l参数,
                  常量 双倍的&d参数,
                  常量 细绳&sparam) {
  如果(ID==CHARTEVENT_MOUSE_MOVE){
      png2._MoveCanvas(W.MouseX, W.MouseY);
      png2.MoveCanvas(W.MouseX/10,100+W.鼠标Y/10);
      png1._MoveCanvas(700+W.MouseX/16,150+W.鼠标Y/16);
   }
}//+------------------------------------------------------------------+
空白绘制图标 (双倍的角度){
   画布.擦除(0);
  双倍的dx = png1._宽度/8.0;
  双倍的dy = png1._高度/6.0;
  为了整数x =0; x<8; x++)
      为了整数y =0; y<6; y++) {
        整数我=y*8+x;
        整数X = (i+1)*W.宽度/50;
        整数Y=60+圆形((角度+X*20.0/W.宽度)*50);
        整数地址=整数(y*dy)*png1._宽度 +整数(x*dx);
        为了整数小时=0; h数组复制(Canvas.m_pixels,png1._bmp,(Y+h)*W.Width+X,adr+h*png1._width,整数(dx));
      }
   Canvas.Update();
}//+------------------------------------------------------------------+




附件下载

📎 expert_test_png.mq5 (2.73 KB)

📎 icanvas_cb.mqh (57.71 KB)

📎 Png.mqh (51.77 KB)

📎 cubes.png (221.61 KB)

📎 icons.png (210.86 KB)

Source: MQL5 #45439

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录