CImg для данных двоичного изображения

Я создал двоичный файл после создания снимка с помощью X11 xGetImage и сохранил содержимое поля данных в двоичный файл(Файл был заархивирован. Пожалуйста, распакуйте его). Теперь я немного поигрался с CImg и изучил его использование.

Первый вопрос

Итак, я попробовал CImg для этих двоичных данных, используя функцию load_rgba.

CImgDisplay *disp;
CImg <float>img1,img2; //I don't why,it only works with float, with int it gives gray colour and with unsigned int it gives black foreground
img2 = img1.load_rgba("imagedata",1366,768);  //1366 X 768 is the dimension of my image that i got from X11
disp = new CImgDisplay(1024,768,"window");
disp->display(img2);

Теперь я вижу изображение в окне, но есть потеря качества. поэтому я попытался взглянуть на код и обнаружил, что

в строке 34318

assign(dimw,dimh,1,4); // the depth is assigned to 1. which i believe is the culprit, however i would like confirm it

и почему это работает только тогда, когда для шаблона передается число с плавающей запятой??

Второй вопрос Теперь я подумал, использовать CImg, сначала самостоятельно прочитав файл, а затем передав указатель буфера в Cimg, используя этот код.

int main() {
    char *data;
    int size = 1366*768*4;   //1366 X 768 is the dimension of my image that i got from X11 and 4 is number of bits per pixel
    ifstream file ("imagedata", ios::in|ios::binary|ios::ate);
    data = new char[size];
    file.read (data, size);

    CImgDisplay *disp;
    CImg <float>img3(data,1366,768,1,4);
    disp = new CImgDisplay(1024,768,"window");
    disp->display(img3);
    getchar();
    return 0;   
}

Запустив этот код с теми же данными изображения (как и в первом случае), все, что я получаю, это черное окно. Кроме того, установка 4-го параметра (т.е. глубины (z)) приводит к ошибке сегментации.

Что я здесь делаю неправильно?


person Ayush choubey    schedule 22.04.2014    source источник
comment
Что касается Q1 - почему вы читаете двоичный файл как число с плавающей запятой? В зависимости от параметров, переданных в getXImage, у вас должны быть 8-, 16- или 32-битные целые числа без знака.   -  person Andy    schedule 22.04.2014
comment
Хороший звонок, я забыл добавить это в вопрос, на самом деле я начал с int, но это привело к серому изображению, затем где-то во время поиска в Google я нашел этот способ передачи числа с плавающей запятой в шаблоне, и он действительно работал, и я понятия не имею, почему. Я бы посоветовал, если вы можете использовать код и образец изображения, которые я прикрепил к ссылке, чтобы вы могли увидеть, что на самом деле произошло, и, возможно, оценить это более внимательно ..... спасибо   -  person Ayush choubey    schedule 22.04.2014
comment
У меня нет установки CImg, поэтому я просто комментирую здесь. Если вы читаете 32-битное изображение из X и читаете его в 4-байтовый CImg float, вы увидите потерю качества из-за ошибки округления. Использовали ли вы целые числа без знака ранее или целые числа со знаком?   -  person Andy    schedule 22.04.2014
comment
Но это привело к серому окну в CImgDisplay, и после вашего комментария я попытался использовать unsigned int, и это привело к черному изображению.... любая идея   -  person Ayush choubey    schedule 22.04.2014
comment
Да, распечатайте значение пикселя или двух и убедитесь, что значение соответствует ожидаемому. В качестве альтернативы создайте «тестовое изображение», в котором вы устанавливаете определенные значения и типы для определенных мест. Примитивный, но хороший способ понять, с чем вы имеете дело.   -  person Andy    schedule 22.04.2014


Ответы (1)


Второй вопрос Теперь я подумал, использовать CImg, сначала самостоятельно прочитав файл, а затем передав указатель буфера в Cimg, используя этот код.

Формат данных CImg: http://cimg.eu/reference/group__cimg__storage.html

Если вы хотите инициировать объект CImg из буфера вручную, вы должны настроить эти массивы самостоятельно.

Это пример для изображения в формате jpeg, для других форматов вы можете проверить источники (названия функций: _load_png, _load_jpeg и т. д.):

https://github.com/EyalAr/lwip/blob/master/src/decoder/jpeg_decoder.cpp

person Nazar Sakharenko    schedule 26.10.2015