2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
|
||||||
1 | ||||||
Gdiplus::Bitmap - получить указатель на растровые данные в правильном порядке20.06.2014, 10:55. Показов 3132. Ответов 16
Метки нет (Все метки)
Всем привет!
Есть код работы с Gdiplus::Bitmap:
WholeCurrRastData - char*. В него я пытаюсь получить указатель на растровые данные, чтобы потом с ним отдельно поработать. Так вот, проблема в том, что указатель ссылается на данные но всегда в разном порядке, в зависимости от Gdiplus::BitmapData::Stride. Что означает Stride, выдержка из MSDN: Как с учетом этого преобразовать указатель, чтобы данные всегда были по порядку от верхней строки, первого элемента до последней строки последнего элемента - я не знаю. Помогите, плиз.
0
|
20.06.2014, 10:55 | |
Ответы с готовыми решениями:
16
Деструктор Gdiplus::bitmap Получить данные через указатель из dll на delphi Как получить ссылку на указатель или указатель на указатель в массиве? C выводит инфу не в правильном порядке |
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
||||||
20.06.2014, 11:04 | 2 | |||||
Stride - ширина растра в байтах с учетом выравнивания.
1
|
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
|
||||||
20.06.2014, 11:35 [ТС] | 3 | |||||
Здесь вы в RowData выгружаете по одной строке данных, начиная с какой, не понял?
Мне же нужно весь указатель WholeCurrRastData перетасовать так, чтобы вне зависимости от Stride данные в нем были так, как они видятся на Gdiplus::Bitmap сверху вниз. Добавлено через 3 минуты Коллега, который до меня работал с этим кодом, написал так (с учетом того в используемом Gdiplus::Bitmap, PixelFormat = pf8bit):
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
20.06.2014, 12:07 | 4 |
Я не выгружаю, я считаю адрес начала строки относительно начала растра. Ширина строки в байтах - Stride, растр может быть top-down или bottom-up. Определяется по знаку Stride. Если есть работающий код, разверните условие, в чем проблема-то?
Добавлено через 15 минут UP. Наверное понял. bd.Scan0 - начало растра в памяти. Растр лежит строками, шириной Stride байт. Логическое начало координат определяется по знаку Stride. При положительном Stride - начало строки считается row_no*Stride При отрицательном Stride - начало строки считается (image_height - row_no -1)*abs(Stride)
1
|
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
|
||||||
20.06.2014, 14:29 [ТС] | 5 | |||||
Не все работает. Я сделал так:
Source - 16 битные значения, которые соответствуют картинке Gdiplus::Bitmap из которой взят указатель на Dest. В Source все значения хранятся от первого к последнему в прямом порядке. lutDest - таблица 8 - битных значений, которые соответствуют 16 - битному элементу. Если Stride положительный, - срабатывает без исключений и то не всегда, но отображает тарабарщину. Если отрицательный вроде правильно все показывает, но в определенный момент кричит, что
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
20.06.2014, 14:56 | 6 |
Нельзя так. LockBits создает временный буфер и возвращает указатель на него. UnlockBits его освобождает.
Не совсем понял - какой именно формат пикселя у изображения?
0
|
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
|
||||||
20.06.2014, 15:03 [ТС] | 7 | |||||
Так все прекрасно работает .
Я бы с радостью передавал в поток через параметры указатель на свой Bitmap и оттуда бы получал Scan0. Но изнутри потока почему-то он Scan0 выдает NULL.
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
20.06.2014, 15:08 | 8 |
0
|
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
|
|
20.06.2014, 15:30 [ТС] | 9 |
В потоке необходимо пересчитать значения яркости/контрастности по 16-битным значениям и потом по таблице обновить значения в растре. Изображение 9 Мп, а операция привязана к мыши, поэтому в потоке.
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
20.06.2014, 15:36 | 10 |
Для индексированных серых изображений при регулировке Я/К пересчитывается не яркость каждой точки, а палитра. Само изображение пересчитывается один раз, при сохранении, когда в диалоге Ok нажали.
0
|
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
|
||||||
20.06.2014, 15:44 [ТС] | 11 | |||||
Примерчик в студию
Добавлено через 2 минуты Вот так палитру создаем:
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
||||||
20.06.2014, 16:05 | 12 | |||||
1
|
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
|
||||||
23.06.2014, 11:49 [ТС] | 13 | |||||
Спасибо за пример. Так работает, только нужно так использовать:
НО. Теперь, вне зависимости в каком порядке я ввожу значения в палитру: с 0 до 255 в позитиве, или с 255 до 0 в негативе, картинка, почему-то хоть так, хоть так, отображается в негативе. В чем дело?
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
||||||
23.06.2014, 11:57 | 14 | |||||
Иначе - каким цветом должны отображаться точки с уровнем не кратным 64?
0
|
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
|
|
23.06.2014, 12:05 [ТС] | 15 |
На мониторе больше 255 оттенков все равно не покажешь. Не совсем понимаю, что даст увеличение размера палитры. С этим особых проблем нет. Проблема с негативом/позитивом
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
23.06.2014, 12:21 | 16 |
Ну мне отсюда задачу не видно, проблема с негативом - позитивом однозначно кривая палитра. Сохранить один и тот же растр в файл с дефолтной и поправленой палитрой, и сравнить в стороннем приложении.
Добавлено через 10 минут UP. Кстати да - там случаем при присвоении из lut байт не переполняется?
0
|
2 / 5 / 1
Регистрация: 14.05.2013
Сообщений: 99
|
||||||
27.06.2014, 16:57 [ТС] | 17 | |||||
В негативе так надо формировать палитру, чтобы все нормально отображалось:
0
|
27.06.2014, 16:57 | |
27.06.2014, 16:57 | |
Помогаю со студенческими работами здесь
17
Вывод записей из таблицы в правильном порядке Разнести информацию по столбцам в правильном порядке Расставьте строки программы в правильном порядке Расставьте строки программы в правильном порядке Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |