[SOLVED]Генерация карты высоты. setPixels ()


photo

Recommended Posts

Добрый день.

Из документации понял, что для записи сгенерированных данных в картинку карты высот в классе Image есть методы: set2D () и перегруженный setPixels (). С первым, благодаря примеру, всё более менее понятно. Со вторым возникли трудности.

Создаю файл:

image->create2D(lmapTileResolutionX, lmapTileResolutionY, Image::FORMAT_RGBA8);

Генерирую и заполняю массив чаров:

heightSourceArray = new unsigned char [lmapTileResolutionX * lmapTileResolutionY];

heightSourceArray i = (rand())%255;

Вызываю метод image->setPixels(heightSourceArray);

В режиме дебага вылетает с необработанным исключением 0x00007FFCDCB3DB9E (ucrtbase.dll) .

Так как других ошибок дебагер не выдаёт,  идеи куда смотреть закончились.

С Уважением, Константин.

 

Edited by Vasara
Link to post
5 hours ago, morbid said:

Здравствуйте, Константин.

Я правильно, понял, что вы уже сами разобрались с проблемой?

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

Нашёл более подходящий способ для решения моих задач. setPixels  оставил на разберусь "может быть когда нибудь потом".

myimage.png

Edited by Vasara
Link to post
  • Vasara changed the title to [SOLVED]Генерация карты высоты. setPixels ()
  • 7 months later...
Posted (edited)

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

У меня возникла та же проблема при попытке подсунуть в ImagePtr->setPixels массив из unsigned char *, который сформировала библиотека CImg.

CImg<unsigned char> testImg(2048, 2048, 1, 3);
testImg.fill(0);
unsigned char purple[] = { 255,0,255 };
testImg.draw_text(100,100,"Hello World",purple);

unsigned char * ref = testImg.data();
_testImg->setPixels(ref);
_tiltmeter->setLayerImage(7, _testImg, 1);

_testImd глобален и в нём уже лежит изображение.

Что в итоге надо сделать, чтобы ImagePtr воспринимал другой массив?

UPD: пишет следующую ошибку - Expression: data == NULL && "Image::setPixels(): data is not NULL"

Edited by semenov.anton
Link to post

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

Перед тем как вызвать setPixels, вызывайте clear() для очистки data, а после нужно вызвать create2D с флагом allocate выставленным в 0.
 

ImagePtr img = Image::create();

unsigned char* ref = nullptr;
img->create2D(3, 3, Image::FORMAT_RGBA8);
img->clear();
img->setPixels(ref);
img->create2D(3, 3, Image::FORMAT_RGBA8, 1, 0, 0);

 

Link to post