Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
Как быстро скопировать из массива в Image->Canvas->Pixels ?? |
Философия, технологии, алгоритмы! |
|
Опции темы |
14.04.2015, 22:15 | #1 |
Форумец
Сообщений: 6,692
Регистрация: 26.04.2006
Возраст: 44
Не в сети |
Как быстро скопировать из массива в Image->Canvas->Pixels ??
Есть двумерный массив unisigned char.
И есть Image1. Зарисовать попиксельно - это понятно, но боюсь что скорость будет мала, к тому же я получаю картинку по USB, процесс непрерывный. В свое время я заменил попиксельное копирование на CopyRect из соображений быстродействия, но это касалось копирования из одной области в другую. А как мне максимально быстро скопировать из двумерного массива char в canvas ? Ну что-то типа unsigned char m[640][480]; memcpy(Image1->Canvas->Pixels,m,sizeof(m)); Быстродействие очень важно, хотелось бы на все (307 000 байт) тратить не более 0.3 сек. |
14.04.2015, 22:39 | #2 |
Форумец
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx HDC = Canvas->Handle SetDIBits => переведет из массива в Bitmap, Bitmap уже в канве отобразить не проблема. |
15.04.2015, 09:35 | #3 | ||
Форумец
Сообщений: 6,692
Регистрация: 26.04.2006
Возраст: 44
Не в сети |
Spectator, Сделал немножко не так, мне показалось, что StretchDIBits больше подходит.
Вот кусок кода - который принимает данные и выводит их попиксельно - это работает. Цитата:
Цитата:
Что я делаю не так? Мне в частности непонятно, какую роль играет здесь BITMAPINFO bmp; |
||
15.04.2015, 10:45 | #4 | |
Форумец
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Цитата:
http://stackoverflow.com/questions/3...xels-using-x-y при правильном заполнении ты получишь тот же результат, что и попиксельное чтение, но работать будет наверняка намного быстрее. |
|
15.04.2015, 11:39 | #5 |
Форумец
Сообщений: 6,692
Регистрация: 26.04.2006
Возраст: 44
Не в сети |
Spectator,
Я почитаю, но прежде хочу возмутиться - неужели нет функции, которая может заполнить BITMAPINFO взяв за основу существующую картинку? Ну что-то типа BITMAPINFO = GetBITMAPINFO_FROM_IMAGE(Image1->Canvas) ? |
15.04.2015, 11:55 | #6 | |
Форумец
Сообщений: 39,863
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Цитата:
GetObject http://stackoverflow.com/questions/2...-load-a-bitmap |
|
15.04.2015, 18:13 | #7 | |
Форумец
Сообщений: 6,692
Регистрация: 26.04.2006
Возраст: 44
Не в сети |
Почти получилось вот так
Цитата:
Но вот только какие-то проблемы с цветами..... Если скажем не заполнять картинку белым цветом перед перерисовкой - то цвета из буфера будут другими... Ладно, прикручу камеру, получу нативную картинку, тогда буду копать.. Последний раз редактировалось Eвгений; 27.04.2015 в 19:16. |
|
27.04.2015, 19:15 | #8 |
Форумец
Сообщений: 6,692
Регистрация: 26.04.2006
Возраст: 44
Не в сети |
Все-таки что-то не так.
Картинка отображается так, как будто она имеет формат RGB555. А у меня RGB565 Как я это понял? Вот сайт http://rawpixels.net/ Выкладываю бинарник (дамп памяти). Если в настройках на сайте выставить RGB565 (исходный формат) то получится нормальная картинка, черно белая. А если поставить RGB555 - то получится то, что у меня в программе. В свойствах Image1 я не нашел ничего подходящего. Как настроить правильный вывод картинки? |
27.04.2015, 19:25 | #9 |
Форумец
Сообщений: 6,692
Регистрация: 26.04.2006
Возраст: 44
Не в сети |
Да действительно...
Настроил источник в режим RGB555, получил в программе правильную картинку. То есть Image1 c дефольтными настройками, функция SetDIBits выводят картинку в формате RGB555. Как это побороть? |