PNG - 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.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
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
