ResourceReadImage
Hàm này đọc dữ liệu từ tài nguyên đồ họa được tạo bởi hàm ResourceCreate() hoặc được lưu trong tệp EX5 trong quá trình biên dịch.
bool ResourceReadImage(
const string resource_name, // tên tài nguyên đồ họa để đọc
uint& data[], // mảng để nhận dữ liệu từ tài nguyên
uint& width, // để nhận chiều rộng hình ảnh trong tài nguyên
uint& height // để nhận chiều cao hình ảnh trong tài nguyên
);
2
3
4
5
6
Tham số
resource_name
[truyền vào] Tên của tài nguyên đồ họa chứa hình ảnh. Để truy cập tài nguyên của chính nó, tên được sử dụng ở dạng ngắn "::resourcename". Nếu tải tài nguyên từ tệp EX5 đã biên dịch, cần sử dụng tên đầy đủ với đường dẫn tương đối từ thư mục MQL5, tên tệp và tên tài nguyên – "path\filename.ex5::resourcename".
data[][]
[truyền vào] Mảng một chiều hoặc hai chiều để nhận dữ liệu từ tài nguyên đồ họa.
img_width
[truyền ra] Chiều rộng hình ảnh của tài nguyên đồ họa tính bằng pixel.
img_height
[truyền ra] Chiều cao hình ảnh của tài nguyên đồ họa tính bằng pixel.
Giá trị trả về
Trả về true
nếu thành công, ngược lại trả về false
. Để lấy thông tin về lỗi, gọi hàm GetLastError()
.
Ghi chú
Nếu mảng data[]
sau đó được sử dụng để tạo tài nguyên đồ họa, nên sử dụng định dạng màu COLOR_FORMAT_ARGB_NORMALIZE
hoặc COLOR_FORMAT_XRGB_NOALPHA
.
Nếu mảng data[]
là hai chiều và kích thước thứ hai của nó nhỏ hơn kích thước X (chiều rộng) của tài nguyên đồ họa, hàm ResourceReadImage()
trả về false
và quá trình đọc không được thực hiện. Nhưng nếu tài nguyên tồn tại, kích thước thực tế của hình ảnh sẽ được trả về trong các tham số width
và height
. Điều này sẽ cho phép thực hiện một lần thử khác để nhận dữ liệu từ tài nguyên.
Ví dụ:
//+------------------------------------------------------------------+
//| Hàm khởi động chương trình script |
//+------------------------------------------------------------------+
void OnStart()
{
//--- khai báo các tham số của tài nguyên đồ họa
string rc_name="Resource";
uint rc_width=100;
uint rc_height=100;
uint rc_data[];
uint rc_size=rc_width*rc_height;
ResetLastError();
//--- đặt kích thước của mảng pixel
if(ArrayResize(rc_data,rc_size)!=rc_size)
{
Print("ArrayResize() failed. Error code: ",GetLastError());
return;
}
//--- điền mảng pixel với màu trong suốt và tạo tài nguyên đồ họa dựa trên nó
ArrayInitialize(rc_data,0x00FFFFFF);
if(!ResourceCreate(rc_name,rc_data,rc_width,rc_height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
{
Print("ResourceCreate() failed. Error code: ",GetLastError());
return;
}
Print("Size of created recource array: ",rc_data.Size());
//--- kiểm tra tài nguyên đồ họa đã tạo
//--- lấy dữ liệu thời gian và giá của thanh hiện tại
MqlTick tick={};
if(!SymbolInfoTick(Symbol(),tick))
{
Print("SymbolInfoTick() failed. Error code: ",GetLastError());
return;
}
//--- tạo đối tượng Bitmap sử dụng tọa độ của giá và thời gian tick cuối cùng
string obj_name="Bitmap";
if(!ObjectCreate(0,obj_name,OBJ_BITMAP,0,tick.time,tick.bid))
{
Print("ObjectCreate() failed. Error code: ",GetLastError());
return;
}
//--- đặt chiều rộng và chiều cao của đối tượng bitmap đã tạo bằng chiều rộng và chiều cao của tài nguyên đồ họa
//--- đặt điểm neo của đối tượng vào trung tâm của nó
ObjectSetInteger(0,obj_name,OBJPROP_XSIZE,rc_width);
ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,rc_height);
ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- chỉ định tài nguyên đồ họa đã tạo trước đó cho đối tượng bitmap dưới dạng tệp hình ảnh
//--- trong trường hợp này, để chỉ ra tên của tài nguyên đồ họa được sử dụng, cần thêm "::" trước tên của nó
ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+rc_name);
//--- đặt màu DodgerBlue với độ trong suốt 200
uint clr=ColorToARGB(clrDodgerBlue,200);
//--- điền toàn bộ mảng pixel của tài nguyên đồ họa với màu đã đặt
ArrayInitialize(rc_data,clr);
//--- cập nhật dữ liệu tài nguyên đồ họa
Update(rc_name,rc_data,rc_width,rc_height,true);
//--- chờ 3 giây trước khi đọc dữ liệu tài nguyên đồ họa
Print("Wait 3 seconds before ResourceReadImage()");
Sleep(3000);
//--- đọc hình ảnh từ tài nguyên vào một mảng pixel mới
uint rc_data_copy[];
uint w=0,h=0;
ResetLastError();
if(!ResourceReadImage("::"+rc_name,rc_data_copy,w,h))
{
Print("ResourceReadImage() failed. Error code: ",GetLastError());
return;
}
//--- đặt màu OrangeRed với độ trong suốt 200
clr=ColorToARGB(clrOrangeRed,200);
//--- điền toàn bộ mảng pixel của tài nguyên đồ họa với màu đã đặt và tạo tài nguyên đồ họa mới dựa trên nó
ArrayInitialize(rc_data_copy,clr);
if(!ResourceCreate(rc_name+"Copy",rc_data_copy,rc_width,rc_height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE))
{
Print("New ResourceCreate() failed. Error code: ",GetLastError());
return;
}
Print("Size of created new recource array: ",rc_data_copy.Size());
//--- tạo đối tượng "Nhãn đồ họa" sử dụng tọa độ của giá và thời gian tick cuối cùng
string obj_name2="BitmapLabel";
if(!ObjectCreate(0,obj_name2,OBJ_BITMAP_LABEL,0,0,0))
{
Print("ObjectCreate() failed. Error code: ",GetLastError());
return;
}
//--- lấy tọa độ màn hình bằng cách sử dụng giá và thời gian đã nhận trước đó
int x=0,y=0;
if(!ChartTimePriceToXY(0,0,tick.time,tick.bid,x,y))
{
Print("New ChartTimePriceToXY() failed. Error code: ",GetLastError());
return;
}
//--- đặt chiều rộng và chiều cao của đối tượng nhãn đồ họa đã tạo bằng chiều rộng và chiều cao của tài nguyên đồ họa
//--- đặt điểm neo của đối tượng vào góc trên bên trái
ObjectSetInteger(0,obj_name2,OBJPROP_XSIZE,rc_width);
ObjectSetInteger(0,obj_name2,OBJPROP_YSIZE,rc_height);
ObjectSetInteger(0,obj_name2,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);
ObjectSetInteger(0,obj_name2,OBJPROP_XDISTANCE,x);
ObjectSetInteger(0,obj_name2,OBJPROP_YDISTANCE,y);
//--- đặt tài nguyên đồ họa đã sao chép làm tệp hình ảnh cho đối tượng nhãn đồ họa
//--- trong trường hợp này, để chỉ ra tên của tài nguyên đồ họa được sử dụng, cần thêm "::" trước tên của nó
ObjectSetString(0,obj_name2,OBJPROP_BMPFILE,"::"+rc_name+"Copy");
//--- thay đổi màu của đối tượng nhãn đồ họa mới
Print("Wait 3 seconds before changing color to GreenYellow");
Sleep(3000);
//--- đặt màu GreenYellow với độ trong suốt 200
clr=ColorToARGB(clrGreenYellow,200);
//--- điền toàn bộ mảng pixel của tài nguyên đồ họa mới với màu đã đặt
ArrayInitialize(rc_data_copy,clr);
//--- cập nhật dữ liệu tài nguyên đồ họa
Update(rc_name+"Copy",rc_data_copy,rc_width,rc_height,true);
//--- chờ ba giây và xóa tài nguyên cùng cả hai đối tượng
Print("Wait 3 seconds before deleting both objects");
Sleep(3000);
Print("Deleting Resource and all Bitmap objects");
ResourceFree("::"+rc_name);
ResourceFree("::"+rc_name+"Copy");
ObjectDelete(0,obj_name);
ObjectDelete(0,obj_name2);
}
//+------------------------------------------------------------------+
//| Cập nhật dữ liệu tài nguyên đồ họa |
//+------------------------------------------------------------------+
void Update(const string res_name,const uint &pixel_data[],const uint width,const uint height,const bool redraw)
{
//--- rời khỏi nếu kích thước bằng 0 được truyền vào
if(width==0 || height==0)
return;
//--- cập nhật dữ liệu tài nguyên và vẽ lại biểu đồ
if(ResourceCreate(res_name,pixel_data,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
ChartRedraw();
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
Xem thêm
Resource
, ObjectCreate()
, ObjectSetString()
, OBJPROP_BMPFILE