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

Отрисовка и сохранение больших изображений в файл

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
Отрисовка и сохранение больших изображений в файл, Использую для отрисовки mapPaintToXImage, необходим алгоритм деления на части изображения и записи в файл
 
Проблема следующая при отрисовки больших изображений требуется большой объем ОЗУ, есть ли какой-нибудь пример по делению области на части, отрисовки и сохранению в файл? Для отрисовки использую mapPaintToXImage с указанием необходимых параметров изображения, далее массив перевожу в QImage. У QImage тоже есть ограничение на ширину и высоту формируемого изображение(MAX_INT). Код для отрисовки использую такой
Код
void SaveAsPicDialog::SaveMap(int cx, int cy, int cw, int ch)
{
  if (!MapHandle)
      return;

  // Область отрисовки карты
  RECT rectDraw;
  rectDraw.left = cx;
  rectDraw.top = cy;
  rectDraw.right = cx + cw;
  rectDraw.bottom = cy + ch;


  if (BitMap)
  {
      memset(BitMap, 0x0, BitMapSize);

      XIMAGEDESC xImageDesc;
      xImageDesc.Point = BitMap;                     // Адрес начала области пикселов
      xImageDesc.Width = cw;                         // Ширина строки в пикселах
      xImageDesc.Height = ch;                        // Число строк
      xImageDesc.Depth = (cbBits->currentIndex()+1)*8;  // Размер элемента в битах (8,16,24,32), задаются из QCOmboBox
      xImageDesc.CellSize = xImageDesc.Depth/8;              // Размер элемента(пиксела) в байтах
      xImageDesc.RowSize = cw * xImageDesc.CellSize; // Ширина строки в байтах

      // Отобразим фрагмент карты на экран
      if (mapPaintToXImage(MapHandle, &xImageDesc, 0, 0, &rectDraw))
      //if (mapPaintByFrameToXImage(MapHandle, &xImageDesc, &Frame, cw, ch, 1))
      {
          // в зависимости от глубины цвета карты выставляем формат картинки
              QImage::Format format;
              switch (xImageDesc.Depth)
              {
                  case  8: format = QImage::Format_Indexed8; break;
                  case 16: format = QImage::Format_RGB16; break;
                  case 24: format = QImage::Format_RGB666; break;
                  case 32: format = QImage::Format_RGB32; break;
                  default: format = QImage::Format_Invalid; break;
              }
          QImage image((uchar *)BitMap, cw, ch, format);
          image.save(pathtofile);

      }
  }

}
 
Если задача слишком сложная, то может быть ее можно заменить на более простую?

Можно сразу рисовать из библиотек ГИС Конструктора на некоторое устройство без сохранения большой картинки.

Можно использовать тайловые структуры для работы с изображениями.
Например: tiff, bir, mbtiles.
Нарезку на тайлы можно выполнить в ImageryCreator.
 
Цитата
Oleg Belenkov написал:
Если задача слишком сложная, то может быть ее можно заменить на более простую?
Спасибо, для задачи оказалось достаточно вызвать LoadMapToPicture из libqdqtmappictr.so. Она еще и в png умеет сохранять, хоть в описании и нет. Кстати, реализации LoadMapToPictureUn нет))).
 
Здравствуйте!

Реализации функций LoadMapToPicture и LoadMapToPictureUn находятся в библиотеке libqdmappicex.so (mappicex.h):

Код
//    Сохранить карту в формате BMP, Tiff, RSW
//    hmap       -  идентификатор открытых данных
//    handle     - диалог сопровождения процесса обработки;
//    dframe     - фрагмент сохраняемой карты(в метрах на местности)
//    bitcount   - кол-во бит на пиксел сохраняемого изображения (16, 24-рекомендуемое значение, 32)
//    scale      - масштаб сохраняемого изображения
//    resolution - разрешающая способность сохраняемого изображения(т/м)
//    filename   - имя файла сохраняемого изображения (*.bmp, *.tif);
//    handleMainWin - должен быть равен нулю
//    При ошибке функция возвращает ноль
//
//    Диалогу визуального сопровождения процесса обработки посылаются
//    сообщения:
//    -  (WM_PROGRESSBAR) Извещение об изменении состония процесса
//       WPARAM - текущее состоние процесса в процентах (0% - 100%)
//       Если функция-отклик возвращает WM_PROGRESSBAR, то процесс завершается.
//
//    -  (WM_ERROR) Извещение об ошибке
//       LPARAM - указатель на структуру ERRORINFORMATION
//       Структура ERRORINFORMATION описана в picexprm.h,
//       WM_PROGRESSBAR и WM_ERROR - в maptype.h

_PICIMP long int _PICAPI LoadMapToPicture(HMAP hmap,HMESSAGE handle,
                                 DFRAME * dframe, long bitcount,
                                 long scale, long resolution,
                                 const char* filename,
                                 HMESSAGE handleMainWin);

_PICIMP long int _PICAPI LoadMapToPictureUn(HMAP map,HMESSAGE handle,
                                 DFRAME * dframe, long bitcount,
                                 long scale, long resolution,
                                 const WCHAR* filename,
                                 HMESSAGE handleMainWin);
Страницы: 1
Читают тему (гостей: 1)



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

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