На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

получение изображения объекта из классификатора

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 3 След.
RSS
получение изображения объекта из классификатора
 
всем привет.
такая проблема. нужно получить уменьшенное изображение знака, например как отображается в редакторе классификатора, список всех объектов (в левой стороне окна). единственный способ получения изображения знака, который я знаю, что через mapPaintExampleObject. подскажите есть ли возможность получения вашими методами или мне с mapPaintExampleObject как то работать надо
 
В классификаторе объекты отображаются с использованием функции mapPaintExampleObject.
 
Может пригодится
Код
QImage MapWindow::getObjectIcon(HSITE hSite, int incode)
{
  HDC hDC;
  XCONTEXT xCont;
  RECT rect;

  QPixmap pixmap(100, 100);
  xCont.xcDisplay = (Display*)(pixmap.x11Info().display());
  xCont.xcWindow = pixmap.handle();
  xCont.xcContext =XCreateGC(xCont.xcDisplay, xCont.xcWindow, 0, NULL);
  xCont.xcPoint.X = 0;
  xCont.xcPoint.Y = 0;

  hDC = HDC(&xCont);
  rect.left = 0;
  rect.top = 0;
  rect.right = 100;
  rect.bottom = 100;

  mapPaintExampleSiteObject(m_hMap, hSite, hDC, &rect, incode);

  QImage image(pixmap.size(), QImage::Format_ARGB32);
  image = pixmap.toImage().copy(0, 0, pixmap.width(), pixmap.height());
  //Подключаем альфа канал
  QImage alpha(QSize(image.size()), QImage::Format_ARGB32);
  alpha.fill(0xffffff);
  image.setAlphaChannel(alpha);

  int w = image.width();
  int h = image.height();
  for(int y = 0; y < h; ++y){
    for(int x = 0; x < w; ++x){
      QRgb rgb = image.pixel(x, y);
      int red = qRed(rgb);
      int green = qGreen(rgb);
      int blue = qBlue(rgb);
      //в if прописываем цвет фона
      if(red == 206 && green == 206 && blue == 206){
        image.setPixel( x, y, qRgba(red, green, blue, 0));
      } else {
        image.setPixel(x, y, qRgba(red, green, blue, 255));
      }
    }
  }
  return image;
}
 
Здравствуйте, вывела по приведенному выше коду знаки классификатора получила черные квадраты. Без шаманства с альфа каналами получаю знаки с неправильными цветами: зеленый вместо красного, серый вместо белого, красный вместо желтого...
Как решить проблему?  
 
Здравствуйте!

Для отрисовки образца объекта из классификатора можно использовать следующий пример:
Код
#include <assert.h>
#include <iostream>
 
#include <QImage>
 
#include "mapapi.h"
 
int main()
{
  // Открыть карту
  HMAP mapHandle = mapOpenData("/usr/Operator12/Data/RedExample/battalion\ red/BattalionRed.sitx");
  assert(mapHandle);
 
  // Создать объект в памяти
  HOBJ objectHandle = mapCreateObject(mapHandle);
  assert(objectHandle);
 
  // Прочитать объект с карты
  int listNumber = 1;
  int objectNumber = 101; // разграничительная линия между батальонами
  HOBJ readObject = mapReadObjectByKey(mapHandle, mapHandle, objectHandle, listNumber, objectNumber);
  assert(readObject);
 
  // Получить номер объекта в классификаторе
  long rscObjectNumber = mapObjectCode(objectHandle);
  assert(rscObjectNumber);
  std::cerr << "rsc object number: " << rscObjectNumber << std::endl;
 
  // Получить внешний код объекта в классификаторе
  long objectCode = mapObjectExcode(objectHandle);
  assert(objectCode);
  std::cerr << "object code: " << objectCode << std::endl;
 
  // Получить классификатор
  HRSC rscHandle = mapGetRscIdent(mapHandle, mapHandle);
  assert(rscHandle);
 
  // Получить номер функции отображения и параметры из классификатора
  long rscObjectFunctionNumber = mapGetRscObjectFunction(rscHandle, rscObjectNumber);
  assert(rscObjectFunctionNumber);
  std::cerr << "rsc object function number: " << rscObjectFunctionNumber << std::endl;
 
  const char* rscObjectParameters = mapGetRscObjectParameters(rscHandle, rscObjectNumber);
  assert(rscObjectParameters);
 
  // Запросить параметры палитры карты (для отображения объекта)
  COLORREF palette[256];
  long colorCount = mapGetSiteColorsCount(mapHandle, mapHandle);
  mapGetSitePalette(mapHandle, mapHandle, palette, colorCount);
 
  // Выделить память для отрисовки объекта
  const int ICON_SIZE = 32;
  XIMAGEDESC ximageDesc;
  ximageDesc.Width = ICON_SIZE;
  ximageDesc.Height = ICON_SIZE;
  ximageDesc.Depth = 32;
  ximageDesc.CellSize = ximageDesc.Depth / 8;
  ximageDesc.RowSize = ximageDesc.Width * ximageDesc.CellSize;
 
  char *paintMemory = new char[ximageDesc.Width * ximageDesc.Height * ximageDesc.CellSize];
  ximageDesc.Point = paintMemory;
  assert(paintMemory);
 
  // Отрисовать образец объекта
  RECT rectDraw;
  rectDraw.left = 0;
  rectDraw.top = 0;
  rectDraw.right = ICON_SIZE;
  rectDraw.bottom = ICON_SIZE;
 
  const char *objectText = NULL;
  long objectLocal = mapObjectLocal(objectHandle);
  long isPainted = mapPaintExampleObjectByFuncToXImage(mapHandle, &ximageDesc, &rectDraw, rscObjectFunctionNumber,
  rscObjectParameters, colorCount, palette, objectText, objectLocal);
  assert(isPainted);
 
  // Вывести картинку в файл
  QImage image((uchar*)(ximageDesc.Point), ximageDesc.Width, ximageDesc.Height, QImage::Format_ARGB32);
  image.save("/tmp/out.png");
 
  mapFreeObject(objectHandle);
  mapCloseData(mapHandle);
  mapCloseMapAccess();
 
  return 0;
}
 
Цитата
Александр Савелов написал:
Здравствуйте!

Для отрисовки образца объекта из классификатора можно использовать следующий пример

Здравствуйте.

Пытаюсь нарисовать значки из классификатора используя приведенный пример кода. На выходе получаю прозрачные квадраты. Использую Конструктор 12.0.2.1 в AstraLinux 1.5.
Нужно ли вообще создавать рисуемый объект на карте? Или можно просто по коду и набору др. параметром рисовать
его образец? Пробовал и так и этак, результат один и тот же.

Карта открыта, пользовательский слой открыт, в parent->hRsc - идентификатор классификатора пользовательского слоя.
Код
//icon
    //пробовал создавать объект на карте
//    HOBJ hObj = mapCreateSiteObject( mapview_GD->h_gd, parent->hSite );
//    mapRegisterObject(hObj, desc.Code, desc.Local);
//    mapCommit(hObj);

    //номер функции отображения
    long rscObjFuncNumber = mapGetRscObjectFunction( parent->hRsc , desc.Incode );

    //параметры отображения
    const char* rscObjectParameters = mapGetRscObjectParameters( parent->hRsc, desc.Incode );

    // Запросить параметры палитры карты (для отображения объекта)
    COLORREF palette[256];
    long colorCount = mapGetSiteColorsCount( mapview_GD->h_gd, parent->hSite );
    mapGetSitePalette(mapview_GD->h_gd, parent->hSite, palette, colorCount);

//    Выделить память для отрисовки объекта
    const int ICON_SIZE = 32;
    XIMAGEDESC ximageDesc;
    ximageDesc.Width = ICON_SIZE;
    ximageDesc.Height = ICON_SIZE;
    ximageDesc.Depth = 32;
    ximageDesc.CellSize = ximageDesc.Depth / 8;
    ximageDesc.RowSize = ximageDesc.Width * ximageDesc.CellSize;

    char *paintMemory = new char[ximageDesc.Width * ximageDesc.Height * ximageDesc.CellSize];
    ximageDesc.Point = paintMemory;

    // Отрисовать образец объекта
    RECT rectDraw;
    rectDraw.left = 0;
    rectDraw.top = 0;
    rectDraw.right = ICON_SIZE;
    rectDraw.bottom = ICON_SIZE;

    const char *objectText = NULL;
    long isPainted = mapPaintExampleObjectByFuncToXImage( mapview_GD->h_gd, &ximageDesc, &rectDraw, rscObjFuncNumber,
    rscObjectParameters, colorCount, palette, objectText, desc.Local);


    // Вывести картинку в файл
    if( isPainted )
    {
        QImage image((uchar*)(ximageDesc.Point), ximageDesc.Width, ximageDesc.Height, QImage::Format_ARGB32);
        image.save( QString("./tmp/%1.png").arg( desc.Incode ) );
    }
 
Здравствуйте!

Уточните, пожалуйста, каким способом получается значение поля desc.Incode?
 
Цитата
Александр Савелов написал:
каким способом получается значение поля desc.Incode?
Копированием из структуры, которая заполняется mapGetRscObject( ... ). По этому же desc осуществляется рисование выбранных знаков на карте.
 
Вы не могли бы привести код заполнения значения desc.Incode - просто такое поле отсутствует в структуре RSCOBJECT, заполняемой функцией mapGetRscObject:
 
Код
  // Заполнить структуру описания объекта
  // RSCOBJECT -  структура входных данных  (см. maptype.h)
  // hRsc - идентификатор классификатора карты
  // incode - порядковый номер объекта (с 1)
  // При ошибке возвращает ноль , иначе порядковый номер объекта

_MAPIMP  long int  _MAPAPI mapGetRscObject(HRSC hRsc,long int incode,
                                    RSCOBJECT * object);
Код
typedef struct RSCOBJECT
{
  unsigned long Length   ; // РАЗМЕР СТРУКТУРЫ
  unsigned long Code     ; // КЛАССИФИКАЦИОННЫЙ КОД
  unsigned long Local    ; // ХАРАКТЕР ЛОКАЛИЗАЦИИ  (OBJECT_LOCAL)
  unsigned long Segment  ; // НОМЕР СЛОЯ ( НЕ БОЛЕЕ 255)
  unsigned long Scale    ; // 1 - ОБ'ЕКТ МАСШТАБИРУЕТСЯ
                           // 0 - ОБ'ЕКТ НЕ МАСШТАБИРУЕТСЯ
  unsigned long Direct   ; // НАПРАВЛЕНИЕ ЦИФРОВАНИЯ ОБ'ЕКТА (OBJECT_DIRECT)
  unsigned long Bot      ; // НИЖНЯЯ ГРАНИЦА ВИДИМОСТИ (ЗНАМЕНАТЕЛЬ МАСШТАБА)
  unsigned long Top      ; // ВЕРХНЯЯ ГРАНИЦА ВИДИМОСТИ (ЗНАМЕНАТЕЛЬ МАСШТАБА)
           char Name[32] ; // НАЗВАНИЕ ( НЕ БОЛЕЕ 30)
}
  RSCOBJECT;
 
Абсолютно верно, такого поля нет в RCSOBJECT, прошу прощения, отвечал без исходников перед глазами. Incode формируется примитивно: с помощью mapGetRscObjectCount() получаем количество объектов классификатора, и в цикле проходим их от 1 до последнего. В моем тестовом классификаторе от 1 до 56. Код заполнения desc.

Код
    int count = mapGetRscObjectCount( hRsc );

    int i(0),j(0);
    for( i = 0; (i*colCount + j) <= count; i++ )
    {
        for( j = 1; j <= colCount && (i*colCount + j) <= count ; j++ )
        {
            RSCOBJECT rscObject;

            if( !mapGetRscObject( hRsc, i*colCount + j, &rscObject ) )   continue;

            desc.Incode = i*colCount + j;
            desc.Code = rscObject.Code;
            desc.Local = rscObject.Local;
            desc.Segment = rscObject.Segment;
            desc.name = QString( rscObject.Name );

            RscObjItem *item = new RscObjItem(this, desc, size);
        }
    }
Изменено: Илья Аникин - 09.12.2019 16:41:52 (дополнил)
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности