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

Проблема с чтением растра

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Проблема с чтением растра
 

Добрый день!

Пишу на C#

Проблема с функцией mapGetRstFrame.

Написал автоматизированную обработку растровых изображения и заметил что местами появляются точки которых не должно быть. Залил с помощью mapPutRstFrame весь растр. Набросал тестовый код:

int bwidth = (int)Math.Round(bframe.width / 8.0);   // ширина фрейма в байтах

int left = 8 * (int)(bframe.left / 8.0);    // выравнивание на границу байта

IntPtr bits = Marshal.AllocHGlobal(bcount);

long n = FMapAPI.mapGetRstFrame(hMap, msrc, bits, left, bframe.top, bframe.width, bframe.height, bwidth);

Marshal.Copy(bits, bsrc, 0, bcount);

//Marshal.FreeHGlobal(bits);

// отправляем в pictureBox

gur.DraweFrom1bitArray(picBox, bsrc, bframe.width, bframe.height, Color.Blue, Color.White);

//bits = Marshal.AllocHGlobal(bsrc.Length);

//Marshal.Copy(bsrc, 0, bits, bsrc.Length);

FMapAPI.mapPutRstFrame(hMap, msrc, bits, left, bframe.top, bframe.width, bframe.height, 1, bwidth);

FMapAPI.mapUpdateRstDuplicates(hMap, msrc);

FMapAPI.mapSaveRst(hMap, msrc);

Marshal.FreeHGlobal(bits);

mvMap.Repaint();

Для проверки отправляем считанное изображение в pictureBox (на картинке слева синяя). Растр 1 бит на элемент.

По изображению идут точки. Что не так?
raster.jpg (9.59 КБ)
 
Цитата
BBV написал:
Добрый день!Пишу на C#Проблема с функцией mapGetRstFrame.
Добрый день!

Просьба уточнить, на какой версии библиотек GTK работаете?
Для проверки в крайней версии нужен растр, на котором проявляется проблема.

Спасибо!
 
Цитата
Елена Кузнецова написал:
Цитата
BBV написал:
Добрый день!Пишу на C#Проблема с функцией mapGetRstFrame.
Добрый день!

Просьба уточнить, на какой версии библиотек GTK работаете?
Для проверки в крайней версии нужен растр, на котором проявляется проблема.

Спасибо!
GIS ToolKit Active Free 14.0.10.0
Для заливки планшета использовал mapPutRstFrame.
 
Цитата
BBV написал:

Добрый день!

Пишу на C#

Проблема с функцией mapGetRstFrame.

Написал автоматизированную обработку растровых изображения и заметил что местами появляются точки которых не должно быть. Залил с помощью mapPutRstFrame весь растр. Набросал тестовый код:

int bwidth = (int)Math.Round(bframe.width / 8.0);   // ширина фрейма в байтах

int left = 8 * (int)(bframe.left / 8.0);    // выравнивание на границу байта

IntPtr bits = Marshal.AllocHGlobal(bcount);

long n = FMapAPI.mapGetRstFrame(hMap, msrc, bits, left, bframe.top, bframe.width, bframe.height, bwidth);

Marshal.Copy(bits, bsrc, 0, bcount);

//Marshal.FreeHGlobal(bits);

// отправляем в pictureBox

gur.DraweFrom1bitArray(picBox, bsrc, bframe.width, bframe.height, Color.Blue, Color.White);

//bits = Marshal.AllocHGlobal(bsrc.Length);

//Marshal.Copy(bsrc, 0, bits, bsrc.Length);

FMapAPI.mapPutRstFrame(hMap, msrc, bits, left, bframe.top, bframe.width, bframe.height, 1, bwidth);

FMapAPI.mapUpdateRstDuplicates(hMap, msrc);

FMapAPI.mapSaveRst(hMap, msrc);

Marshal.FreeHGlobal(bits);

mvMap.Repaint();

Для проверки отправляем считанное изображение в pictureBox (на картинке слева синяя). Растр 1 бит на элемент.

По изображению идут точки. Что не так?

Добрый день!

Алгоритм проверки функции mapGetRstFrame:

1. Создано тестовое приложение на С++ для платформы x64 в XE5.

Исходные тексты приложения в архиве Source_Test.zip.

Код
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner), HMap()
{
 Bits = 0;
 SizeOfBits = 0;
 FlagPaint = 0;
 FlagGetFrame = 0;
}

//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
  DELETE_ARR(Bits);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button_OpenFileClick(TObject *Sender)
{
  if (OpenDialog1->Execute())
  {
   InputName = OpenDialog1->FileName;
   Edit1->Text = InputName;
  }

  HMap = mapOpenDataUn(InputName.c_str());
  if (!HMap)
   {
    mapErrorMessageUn(IDS_OPEN, InputName.c_str());
   }

  FlagGetFrame = 0;
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button_GetFtameClick(TObject *Sender)
{
  if (InputName.IsEmpty())
  {
   mapErrorMessageUn(IDS_OPEN, L"*.RSW");
   return;
  }

  if (!HMap)
    {
     mapErrorMessageUn(IDS_OPEN, InputName.c_str());
     return;
    }

  // Размеры отображаемой части тестового растра
  int width = 1024;
  // Установить ширину кратно байту
  width = (width + 7) & ~7;

  int height = 1024;
  int widthInByte = (width * 1) >> 3;
  SizeOfBits = widthInByte*height;

  DELETE_ARR(Bits);
  NEW_ARR(Bits, char, SizeOfBits);
  if (Bits == 0)
   {
    mapErrorMessageUn(IDS_MEMORY, InputName.c_str());
    return;
   }

  int left = 0;
  int top = 0;

  // Чтение прямоугольного участка растра
  //  hMap       - идентификатор открытой векторной карты
  //  number     - номер файла в цепочке
  //  bits    - указатель на начало изображения битовой области
  //  left    - смещение слева в элементах (выравнено на границу байта)
  //  top     - смещение сверху в элементах
  //  width   - ширина в элементах (выравнено на границу байта)
  //  height  - высота в элементах
  //  widthinbyte    - ширину прямоугольного участка растра в байтах
  // Принцип выравнивания:
  //  при ElementSize() == 1 (бит) - left,width кратны 8,
  //                    == 4 (бит) - left,width кратны 2
  // При ошибке возвращает 0

  int ret = mapGetRstFrame(HMap, 1, Bits, left, top, width, height);
  if (ret == 0)
   {
    mapErrorMessageUn(IDS_READ, InputName.c_str());
    return;
   }

  PaintImage(width, height, Bits, SizeOfBits);
}
//---------------------------------------------------------------------------

int __fastcall TForm1::PaintImage(int width, int height, char* bits, int sizeOfBits)
{
  if (width == 0 || height == 0 || bits == 0 || sizeOfBits == 0)
     return 0;

  // Очистить область рисования
  TRect rect;
  rect.Left   = 0;
  rect.Top    = 0;
  rect.Right  = Image1->Width;
  rect.Bottom = Image1->Height;
  Image1->Canvas->FillRect(rect);

  PiantFrame(width, height, bits, sizeOfBits);
  return 1;
}

//---------------------------------------------------------------------------
int __fastcall TForm1::PiantFrame(int width, int height, char* bits, int sizeOfBits)
{
  if (FlagPaint)
     return 0;

  if (width == 0 || height == 0 || bits == 0 || sizeOfBits == 0)
     return 0;

  int widthInByte = (width * 1) >> 3;

  TColor redColor = TColor(RGB(255, 0, 0));
  TColor blueColor = TColor(RGB(0, 0, 255));
  TColor currentColor;

  for (int j = 0; j < min(Image1->Height, height); j++)
     {
      char* str = (bits + widthInByte*j);
      for (int i = 0; i < min(Image1->Width, width); i++)
         {
          char* pix = str;
          int offset = i;
          pix += offset>>3;

          int value = (unsigned char)(*pix >> (7-offset%8)) & 0x01L;
          if (value == 0)
             currentColor = redColor;
            else
             currentColor = blueColor;
          Image1->Canvas->Pixels[i][j] = currentColor;
         }
     }

  return 1;
}

2. Для выполнения приложения библиотеки GTK x64 изъяты из дистрибутива

"Инструментарий разработчика ГИС-приложений GIS ToolKit (версия 14.5.2.0, для платформ "x32" и "x64")", размещенного на страничке "Скачать" нашего сайта.

https://www.gisinfo.ru/products/gistool_win.htm

Версия библиотек GTK x64 на скриншоте "Свойства: gis64acces.dll".

3. В редакторе Paint создан одноцветный (1 бит на пиксель) файл BMP Line_1024х1024.bmp размером 1024 на 1024 пикселей. По диагонали проведена черная линия.

4. Средствами ГИС Панорама файл Line_1024х1024.bmp конвертирован в растровую карту Line_1024х1024.rsw. Растр размещен в архиве Line_1024х1024.zip.

5. В тестовом приложении открыт файл Line_1024х1024.rsw и по нажатию на кнопку "GetFrame" выполнена функция mapGetRstFrame, далее содержимое буфера отображается на форме Test. Пиксели растра со значение 0 отображаются красным цветом, единички - синим. Отображение содержимого буфера реализовано в функции TForm1::PiantFrame().

При отображении на форме содержимого буфера, полученного вызовом функции mapGetRstFrame, изображение полностью соответствует исходному растру RSW.

Функция mapGetRstFrame работает корректно.

4.png (16.45 КБ)
2.png (62.75 КБ)
3.png (33.01 КБ)
1.png (45.83 КБ)
 
Не могу сказать что помогли, скорее напрягли.
Вашу версию как она есть проверить не могу Embarcadero не используем.
Несколько раз написал, что делал полную заливку растра цветом, не линию рисовал, на линии точек не видно.
Появлялись точки при чтении mapGetRstFrame в массив, далее этот массив уже с точками вернул в растр mapPutRstFrame.
К mapPutRstFrame претензий нет т. к. первоначальную заливку делал этой функцией, точек не было.
 
Цитата
BBV написал:
Не могу сказать что помогли, скорее напрягли.
Вашу версию как она есть проверить не могу Embarcadero не используем.
Несколько раз написал, что делал полную заливку растра цветом, не линию рисовал, на линии точек не видно.
Появлялись точки при чтении mapGetRstFrame в массив, далее этот массив уже с точками вернул в растр mapPutRstFrame.
К mapPutRstFrame претензий нет т. к. первоначальную заливку делал этой функцией, точек не было.
В моем примере отображение данных из буфера, запрошенных вызовом функции mapGetRstFrame, реализовано в виде элементарных циклов по строкам и столбцам изображения.
Отображение данных буфера в функции TForm1::PiantFrame.
В примере намеренно не применялись посторонние функции, чтобы исключить возможных ошибок.
Функция mapGetRstFrame отработала нормально, мусор не добавляется.
Проверьте работу с памятью. Достаточный ли размер памяти для буфера выделяете.
 
Дмитрий спасибо за участие.
Т. к. использую C# при работе с API панорамы требуется маршалирование данных, ошибки не исключаю.
Попробуйте прочитать не линию, а полностью залитый фрагмент растра.
 
Цитата
BBV написал:
Попробуйте прочитать не линию, а полностью залитый фрагмент растра.
Приведенный тестовый пример читает и отображает прямоугольную область растра.

Вызовом функции mapGetRstFrame запрашивается прямоугольная (в данном случае квадратная) область раста.
Ширина и высота области 1024 пиксель растра.
Код
  int width = 1024;
  // Установить ширину кратно байту
  width = (width + 7) & ~7;

  int height = 1024;
В функции TForm1::PiantFrame выполняется по пиксельная отрисовка прямоугольной области растра из буфера.
Прямоугольная область растра в буфере представляет собой двумерный массив ноликов и единичек.
В одном бите содержится нолик или единичка для одного пикселя растра.
Цитата
содержимое буфера отображается на форме Test. Пиксели растра со значение 0 отображаются красным цветом, единички - синим.
При выполнении теста на форме корректно отобразилось содержимое растра (1024x1024) - диагональная линия.
В буфере диагональная линия описана единичками, а фон изображения - нулями.
Код
Схематичное содержимое буфера:
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
Если нарисуем в исходном растре звездочку, то тест на форме отобразит звезду.

В вашем случае сначала растр чистится нулями, затем вызывается функция mapGetRstFrame.
Вместо отображения растра предлагаю пробежаться по буферу и поискать в нем единички, которых быть не должно.
Как перебирать содержимое буфера можно глянуть в функции TForm1::PiantFrame теста.
Если найдете единичку, выдавайте сообщение MessageBox.
Таким образом, мы выясним, есть ли в буфере грязь.  
 
Дмитрий, спасибо за помощь. Мусор убрал.
Страницы: 1
Читают тему (гостей: 1)



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

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