ResourceReadImage

Читает данные графического ресурса, созданного функцией ResourceCreate() или сохраненного в EX5-файле при компиляции.

bool  ResourceReadImage(
   const string      resource_name,       // имя графического ресурса для чтения
   uint&             data[],              // массив для получения данных из ресурса
   uint&             width,               // для получения ширины картинки в ресурсе
   uint&             height,              // для получения высоты картинки в ресурсе
   );

Параметры

resource_name

[in]  Имя графического ресурса, содержащего изображение. Для доступа к собственным ресурсам указывается в коротком виде "::resourcename". Если же необходимо загрузить ресурс из скомпилированного EX5-файла, то необходимо имя в полном виде с указанием пути относительно папки MQL5, имени файла и имени ресурса – "path\\filename.ex5::resourcename".

data[][]

[in]  Одномерный или двумерный массив для получения данных из графического ресурса.

img_width

[out]  Ширина картинки графического ресурса в пикселях.

img_height

[out]  Высота картинки графического ресурса в пикселях.

Возвращаемое значение

true – в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Если на основании массива data[] в дальнейшем необходимо создать графический ресурс, то следует использовать формат цвета COLOR_FORMAT_ARGB_NORMALIZE или COLOR_FORMAT_XRGB_NOALPHA.

Если массив data[] является двумерным и его вторая размерность меньше размера X(width) графического ресурса, то функция ResourceReadImage() вернет false и чтение не будет произведено. Но при этом, если ресурс существует, то в параметры width и height возвращаются актуальные размеры картинки. Это позволит сделать еще одну попытку получения данных из ресурса.

Пример:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объявляем параметры графического ресурса
   string rc_name="Resource";
   uint   rc_width=100;
   uint   rc_height=100;
   uint   rc_data[];
   uint   rc_size=rc_width*rc_height;
 
   ResetLastError();
//--- устанавливаем размер массива пикселей
   if(ArrayResize(rc_data,rc_size)!=rc_size)
     {
      Print("ArrayResize() failed. Error code: ",GetLastError());
      return;
     }
//--- заполняем массив пикселей прозрачным цветом и на его основе создаём графический ресурс
   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());
 
//--- проверим созданный графический ресурс.
//--- получаем данные времени и цены текущего бара
   MqlTick tick={};
   if(!SymbolInfoTick(Symbol(),tick))
     {
      Print("SymbolInfoTick() failed. Error code: ",GetLastError());
      return;
     }
//--- создаём объект "Рисунок" на координатах цены и времени последнего тика
   string obj_name="Bitmap";
   if(!ObjectCreate(0,obj_name,OBJ_BITMAP,0,tick.time,tick.bid))
     {
      Print("ObjectCreate() failed. Error code: ",GetLastError());
      return;
     }
//--- устанавливаем созданному объекту-рисунку ширину и высоту, равные ширине и высоте графического ресурса.
//--- устанавливаем точку привязки объекта по его центру.
   ObjectSetInteger(0,obj_name,OBJPROP_XSIZE,rc_width);
   ObjectSetInteger(0,obj_name,OBJPROP_YSIZE,rc_height);
   ObjectSetInteger(0,obj_name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- указываем для объекта-рисунка в качестве файла изображения ранее созданный графический ресурс
//--- В этом случае для указания имени используемого графического ресурса нужно перед его именем дописать "::"
   ObjectSetString(0,obj_name,OBJPROP_BMPFILE,"::"+rc_name);
   
//--- установим цвет DodgerBlue с прозрачностью 200
   uint clr=ColorToARGB(clrDodgerBlue,200);
//--- заполним установленным цветом весь массив пикселей графического ресурса
   ArrayInitialize(rc_data,clr);
//--- обновим данные графического ресурса
   Update(rc_name,rc_data,rc_width,rc_height,true);
   
//--- ждём 3 секунды перед чтением данных графического ресурса 
   Print("Wait 3 seconds before ResourceReadImage()");
   Sleep(3000);
//--- читаем изображение из ресурса в новый массив пикселей
   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;
     }
 
//--- установим цвет OrangeRed с прозрачностью 200
   clr=ColorToARGB(clrOrangeRed,200);
//--- заполним установленным цветом весь массив пикселей и на его основе создадим новый графический ресурс
   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());
   
//--- создаём объект "Графическая метка" на координатах цены и времени последнего тика
   string obj_name2="BitmapLabel";
   if(!ObjectCreate(0,obj_name2,OBJ_BITMAP_LABEL,0,0,0))
     {
      Print("ObjectCreate() failed. Error code: ",GetLastError());
      return;
     }
//--- получаем экранные координаты по ранее полученным цене и времени
   int x=0,y=0;
   if(!ChartTimePriceToXY(0,0,tick.time,tick.bid,x,y))
     {
      Print("New ChartTimePriceToXY() failed. Error code: ",GetLastError());
      return;
     }
//--- устанавливаем созданному объекту-графической метке ширину и высоту, равные ширине и высоте графического ресурса.
//--- устанавливаем точку привязки объекта по его центру.
   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);
//--- указываем для объекта-графической метки в качестве файла изображения скопированный графический ресурс
//--- в этом случае для указания имени используемого графического ресурса нужно перед его именем дописать "::"
   ObjectSetString(0,obj_name2,OBJPROP_BMPFILE,"::"+rc_name+"Copy");
   
//--- меняем цвет нового объекта-графической метки
   Print("Wait 3 seconds before changing color to GreenYellow");
   Sleep(3000);
//--- установим цвет GreenYellow с прозрачностью 200
   clr=ColorToARGB(clrGreenYellow,200);
//--- заполним установленным цветом весь массив пикселей нового графического ресурса
   ArrayInitialize(rc_data_copy,clr);
//--- обновим данные графического ресурса 
   Update(rc_name+"Copy",rc_data_copy,rc_width,rc_height,true);
   
//--- ждём три секунды и удаляем ресурсы и оба объекта
   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);
  }
//+------------------------------------------------------------------+
//| Обновляем данные графического ресурса                            |
//+------------------------------------------------------------------+
void Update(const string res_name,const uint &pixel_data[],const uint width,const uint height,const bool redraw)
  {
//--- если переданы нулевые размеры - уходим
   if(width==0 || height==0)
      return;
//--- обновляем ресурсные данные и перерисовываем график
   if(ResourceCreate(res_name,pixel_data,width,height,0,0,0,COLOR_FORMAT_ARGB_NORMALIZE) && redraw)
      ChartRedraw();
  }

Смотри также

Ресурсы, ObjectCreate(), ObjectSetString(), OBJPROP_BMPFILE