Кадрирование (вывод части) изображения

Для графических объектов с рисунками (OBJ_BITMAP_LABEL и OBJ_BITMAP) MQL5 позволяет настроить показ лишь части изображения, заданного свойством OBJPROP_BMPFILE. Для этого необходимо установить размер объекта (OBJPROP_XSIZE и OBJPROP_YSIZE) меньше размера изображения, а координаты верхнего левого угла видимого прямоугольного фрагмента задать с помощью целочисленных свойств OBJPROP_XOFFSET и OBJPROP_YOFFSET. Данные два свойства задают, соответственно, отступ по X и по Y в пикселях от левой и верхней границы исходного изображения.

Вывод части изображения в объект

Вывод части изображения в объект

Обычно подобный прием с использованием части большого изображения применяется для иконок инструментальных панелей (наборов кнопок, меню и т.п.): единый файл со всеми иконками обеспечивает более эффективное ресурсопотребление, чем множество мелких файлов с отдельными иконками.

Тестовый скрипт ObjectBitmapOffset.mq5 создает несколько панелей с картинками (OBJ_BITMAP_LABEL), причем для всех них указан один и тот же графический файл в свойстве OBJPROP_BMPFILE. Однако за счет свойств OBJPROP_XOFFSET и OBJPROP_YOFFSET все объекты отображают разные участки изображения.

void SetupBitmap(const int iconst int xconst int yconst int size,
   const string imageOnconst string imageOff = NULL)
{
   // создаем объект
   const string name = ObjNamePrefix + "Tool-" + (string)i;
   ObjectCreate(0nameOBJ_BITMAP_LABEL000);
   ObjectSetInteger(0nameOBJPROP_CORNERCORNER_RIGHT_UPPER);
   ObjectSetInteger(0nameOBJPROP_ANCHORANCHOR_RIGHT_UPPER);
   // позиция и размер
   ObjectSetInteger(0nameOBJPROP_XDISTANCEx);
   ObjectSetInteger(0nameOBJPROP_YDISTANCEy);
   ObjectSetInteger(0nameOBJPROP_XSIZEsize);
   ObjectSetInteger(0nameOBJPROP_YSIZEsize);
   // смещение в исходной картинке, по которому читается i-й фрагмент
   ObjectSetInteger(0nameOBJPROP_XOFFSETi * size);
   ObjectSetInteger(0nameOBJPROP_YOFFSET0);
   // общее изображение (файл)
   ObjectSetString(0nameOBJPROP_BMPFILEimageOn);
}
   
void OnStart()
{
   const int icon = 46// размер одной иконки
   for(int i = 0i < 7; ++i// цикл по иконкам в файле
   {
      SetupBitmap(i1010 + i * iconicon,
         "\\Files\\MQL5Book\\icons-322-46.bmp");
   }
}

В исходном изображении находится несколько мелких значков размером 46 на 46 пикселей. Скрипт "вырезает" их по одному и располагает по вертикали у правого края окна.

Ниже показан общий файл (/Files/MQL5Book/icons-322-46.bmp), и что получилось на графике.

BMP-файл с иконками

BMP-файл с иконками

 

Объекты-кнопки с иконками на графике

Объекты-кнопки с иконками на графике