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

C# Linux, Изображение карты

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 След.
RSS
C# Linux, Изображение карты
 
Цитата
Судя по всему, Вы даже не потрудились посмотреть функции, о которых я писал выше:

Спасибо за подсказку. Я изучаю Ваш SDK меньше недели и конечно еще не ориентируюсь.
Мне кажется, путаницу вносит наименование функции mapCreateImageEx. С русского на английский, первод фразы "Создать изображение" переводится как "Create Image", английская фраза "Paint Image" переводится как "Раскрасить изображение".
 
Согласно описанию:
Код
_MAPIMP long int _MAPAPI mapPaintToDib(HMAP hmap, BITMAPINFOHEADER * dibinfo,                                       char * lpDibBits, RECT * rect);
#ifdef WIN32API // Вывести изображение карты в Image (массив) 
// Данная функция реализована только для платформы Windows !
Мне нужна аналогичная функция под Linux (о чем я Выше и написал Вам). Спасибо.
 
Там же. Функции mapPaintToXImage*


Скрытый текст


В 14 версии функции *XImage реализованы в кросс-платформенном варианте, работают и в Windows, и в Linux.
Как было в той версии, что Вы используете, уже не подскажу. Очень может быть, что Вам придется делать отдельные реализации для Windows и для Linux.
 
Денис, спасибо. Я постараюсь подключить под Linux и Вам напишу)
 
Не получается вызвать указанный Вами метод. Делаю так
Код
[DllImport(_library, CharSet = CharSet.Unicode)]
private static extern int mapPaintToXImage(IntPtr hImage,ref byte[] image, int x, int y, ref Rect rect);

var rec = new Rect() { left = 0, right = 0, bottom = 10, top = 10 };
var image = new byte[]{};
var result = mapPaintToXImage(bitmapHandle,  ref image, 0, 0,  ref rec);
При вызове плучаю:
Last runner error: Process exec:8043 exited with code '0': Not available

По видимому вызов функции не верен. Массив нужно определять заранее? А если нужно, то как определить размерность. Достаточно height * with в пикселях?
Спасибо
 
И еще один вариант)
Код
[DllImport(_library, CharSet = CharSet.Unicode)]
private static extern int mapPaintToXImage(IntPtr hImage,ref XImage image, int x, int y, ref Rect rect);


[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct XImage
{
    [MarshalAs(UnmanagedType.LPWStr)]
    public  String Point;

    public int Width;

    public int Height;

    public int CellSize;

    public int RowSize;

    public int Depth;

    public int Reserve;
}


var imageInfo = new XImage()    { Depth = 32, Width = 512, Height = 512, CellSize = 4 };
imageInfo.RowSize = imageInfo.CellSize * imageInfo.Width;
var rec = new Rect() { left = 0, right = 0, bottom = imageInfo.Height, top =  imageInfo.Width };

var result = mapPaintToXImage(bitmapHandle,  ref imageInfo, 0, 0,  ref rec);



Результат, аналогичный.  
 
Цитата
typedef struct XIMAGEDESC   // Описатель битовой области XImage
{                           // (для применения с XWindow)
 char *    Point;          // Адрес начала области пикселов

 int       Width;          // Ширина строки в пикселах
 int       Height;         // Число строк
 int       CellSize;       // Размер элемента(пиксела) в байтах
 int       RowSize;        // Ширина строки в байтах

 int       Depth;          // Размер элемента в битах (8,15,16,24,32)
 int       Reserve;
}
 XIMAGEDESC;


// Вывести изображение карты в XImage (массив)
// Описание структуры XIMAGEDESC в maptype.h
// hmap - идентификатор открытых данных
// x,y - координаты левого верхнего угла внутри
// битовой области XImage для размещения изображения
// rect - выводимый фрагмент карты
// При ошибке в параметрах возвращает ноль

_MAPIMP long int _MAPAPI mapPaintToXImage(HMAP hmap, XIMAGEDESC *imagedesc, long int x, long int y, RECT *rect);

Адрес начала области пикселов - это указатель на массив.
Массив Вы должны выделить самостоятельно и передать указатель на него в соответствующем параметре структуры, по окончании работы Вы должны освободить эту память.

Пример заполнения:
Цитата

 // Отрисовать карту
 const int cDrawWidth     = 1024;
 const int cDrawHeight    = 1024;
 const int cBytesPerPixel  = 4;

 RECT drawRect;
 drawRect.left      = 0;
 drawRect.top      = 0;
 drawRect.right    = drawRect.left + cDrawWidth;
 drawRect.bottom = drawRect.top  + cDrawHeight;

 char* imageMemory = new char[cDrawWidth * cDrawHeight * cBytesPerPixel];

 XIMAGEDESC imageDesc;
 imageDesc.Point      = imageMemory;
 imageDesc.Width     = cDrawWidth;
 imageDesc.Height    = cDrawHeight;
 imageDesc.CellSize  = cBytesPerPixel;
 imageDesc.Depth     = cBytesPerPixel * 8; // 8-битное изображение
 imageDesc.RowSize  = cDrawWidth * cBytesPerPixel;

На будущее - для понимания.
В API функции (да и не только в API) если передается указатель на что-то, то это "что-то" выделяется в памяти снаружи функции.
Если функция сама что-то выделяет в памяти и должна вернуть наружу эту память, то чтобы получить указатель на выделяемую внутри функции память, в функцию передается параметр - указатель на указатель.
То, что выделяется внутри DLL, - либо освобождается отдельной API-функцией, либо в комментарии к функции будет указано, как освободить память.
 
Спасибо. Так, тоже не получается)
Код
[DllImport(_library, CharSet = CharSet.Unicode)]
private static extern int mapPaintToXImage(IntPtr hImage, ref XImage image, int x, int y, ref Rect rect);

// Создаем пустое изображение
var height = 100;
var width = 100;

var bitmapHandle = mapCreateImageEx(width, height).WithException();

var imageInfo = new XImage()
    { Depth = 32, Width = width, Height = height, CellSize = 4 };
imageInfo.RowSize = imageInfo.CellSize * imageInfo.Width;

// Создаем массив
var size = imageInfo.Width * imageInfo.Height * imageInfo.CellSize;
var points = new Byte[size];

// Копируем его в IntPtr
var ptr =  Marshal.AllocHGlobal(Marshal.SizeOf(points[0]) * points.Length);
Marshal.Copy(points,0, ptr,  points.Length);

// Связываем
imageInfo.Point = ptr;

var rec = new Rect() { left = 0, right = imageInfo.Width,  bottom = imageInfo.Height, top =  0};
var result = mapPaintToXImage(bitmapHandle,   ref imageInfo, 0, 0,   ref rec);

Результат:
Код
Exit code is 139

Last runner error: Process /usr/share/dotnet/dotnet:737519 exited with code '139'.

Такое впечатление, что идет обращение к элементу массива, которого нет. Может быть как то по другому массив нужно сбросить? Или его обнулить предварительно.
Изменено: Alexander Volovikov - 14.06.2022 11:41:49
 
Я не силен в C#, но у Вас два раза выделяется память зачем-то, потом зачем-то копируется...

Судя по описанию метода Marshal.AllocHGlobal, в нем как раз и выделяется память.

Думаю, должно быть так:
Цитата

// Создаем массив
imageInfo.Point = Marshal.AllocHGlobal(imageInfo.Width * imageInfo.Height * imageInfo.CellSize);

var rec = new Rect() { left = 0, right = imageInfo.Width,  bottom = imageInfo.Height, top =  0};
var result = mapPaintToXImage(bitmapHandle, ref imageInfo, 0, 0, ref rec);

// Тут забираем изображение из imageInfo.Point
.....

// Освободить память
Marshal.FreeHGlobal(imageInfo.Point);

Exit code: 139 соответствует SIGSEGV, что говорит о том, что идет попытка записи в недоступную память.
 
Спасибо. И так не работает)
Код
[DllImport(_library, CharSet = CharSet.Unicode)]
private static extern int mapPaintToXImage(IntPtr hImage, ref XImage image, int x, int y, ref Rect rect);

var bitmapHandle = mapCreateImageEx(width, height).WithException();

var imageInfo = new XImage()
    { Depth = 32, Width = width, Height = height, CellSize = 4 };
imageInfo.RowSize = imageInfo.CellSize * imageInfo.Width;

// Создаем массив
var size = imageInfo.Width * imageInfo.Height * imageInfo.CellSize;

// Связываем
imageInfo.Point = Marshal.AllocHGlobal(size);

var rec = new Rect() { left = 0, right = imageInfo.Width,  bottom = imageInfo.Height, top =  0};
var result = mapPaintToXImage(bitmapHandle,   ref imageInfo, 0, 0,   ref rec);
Код
Exit code is 139

Last runner error: Process /usr/share/dotnet/dotnet:743546 exited with code '139'.

А есть ли пример на Паскале, например, использование функции mapPaintToXImage ?
Страницы: Пред. 1 2 3 След.
Читают тему (гостей: 1)



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

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