» Программирование>Как быстро скопировать из массива в Image->Canvas->Pixels ??
Eвгений 22:15 14.04.2015
Есть двумерный массив unisigned char.
И есть Image1.
Зарисовать попиксельно - это понятно, но боюсь что скорость будет мала, к тому же я получаю картинку по USB, процесс непрерывный.
В свое время я заменил попиксельное копирование на CopyRect из соображений быстродействия, но это касалось копирования из одной области в другую.
А как мне максимально быстро скопировать из двумерного массива char в canvas ?
Ну что-то типа
unsigned char m[640][480];
memcpy(Image1->Canvas->Pixels,m,sizeof(m));
Быстродействие очень важно, хотелось бы на все (307 000 байт) тратить не более 0.3 сек.
[Ответ]
SetDIBits => переведет из массива в Bitmap, Bitmap уже в канве отобразить не проблема.
[Ответ]
Eвгений 09:35 15.04.2015
Spectator, Сделал немножко не так, мне показалось, что StretchDIBits больше подходит.
Вот кусок кода - который принимает данные и выводит их попиксельно - это работает.
Сообщение от :
unsigned char DataIn[307200];
unsigned char* pDataIn; //буфер
BITMAPINFO bmp;
........................
pDataIn=DataIn;
void __fastcall TForm1::VaComm1RxBuf(TObject *Sender, PVaData Data, int Count)
{
unsigned int i;
HDC hDC;
VaBuffer1->Peek(DataIn+Total,Count);
VaBuffer1->Clear();
Total+=Count;
if (Total==307200) // когда получили весь кадр
{
Memo1->Lines->Add(IntToStr(Count) + ", " + IntToStr((__int64)Total));
Form1->Image1->Canvas->Brush->Color=clWhite;
Form1->Image1->Canvas->FillRect(Form1->Image1->ClientRect); // Очищаем канву
for (i=0; i < Total; i++) // заполняем попиксельно
{
при правильном заполнении ты получишь тот же результат, что и попиксельное чтение, но работать будет наверняка намного быстрее.
[Ответ]
Eвгений 11:39 15.04.2015
Spectator,
Я почитаю, но прежде хочу возмутиться - неужели нет функции, которая может заполнить BITMAPINFO взяв за основу существующую картинку?
Ну что-то типа
BITMAPINFO = GetBITMAPINFO_FROM_IMAGE(Image1->Canvas) ?
[Ответ]
Spectator 11:55 15.04.2015
Сообщение от Eвгений: Spectator,
Я почитаю, но прежде хочу возмутиться - неужели нет функции, которая может заполнить BITMAPINFO взяв за основу существующую картинку?
Ну что-то типа
BITMAPINFO = GetBITMAPINFO_FROM_IMAGE(Image1->Canvas) ?
Быстродействие - мгновенное появление картинки....Так что уж помогите добить этот код...
Но вот только какие-то проблемы с цветами..... Если скажем не заполнять картинку белым цветом перед перерисовкой - то цвета из буфера будут другими...
Ладно, прикручу камеру, получу нативную картинку, тогда буду копать..
[Ответ]
Eвгений 19:15 27.04.2015
Все-таки что-то не так.
Картинка отображается так, как будто она имеет формат RGB555. А у меня RGB565
Как я это понял?
Вот сайт http://rawpixels.net/
Выкладываю бинарник (дамп памяти). Если в настройках на сайте выставить RGB565 (исходный формат) то получится нормальная картинка, черно белая. А если поставить RGB555 - то получится то, что у меня в программе.
В свойствах Image1 я не нашел ничего подходящего.
Как настроить правильный вывод картинки?
Изображения
Да действительно...
Настроил источник в режим RGB555, получил в программе правильную картинку. То есть Image1 c дефольтными настройками, функция SetDIBits выводят картинку в формате RGB555.
Как это побороть?
[Ответ]