evg
Все программисты C++Builder сталкиваются с недостаточной скоростью вывода графики в Canvas из массива.
Для переноса изображения из массива в Canvas обычно применяется свойство Canvas->Pixels[x][y].
Но это очень медленный метод. Для ускорения мы создаем объект TBitmap и для доступа к пикселям изображения используем его свойство TBitmap->ScanLine, которое определяет линии изображения. Это уже намного быстрее чем запись в Pixels[x][y].
Получившийся битмап копируем в Canvas при помощи winapi функции BitBlt.

TForm1 *Form1;
TCanvas * gc;
Graphics::TBitmap * bmp;
TCanvas * bmp_c;
unsigned long * buf;
//---------------------------------------------------------------------------	
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	gc = Form1->Canvas;            // получаем ссылку на Canvas формы
	bmp = new Graphics::TBitmap(); // создаем TBitmap
	bmp->PixelFormat = pf32bit;    // формат цвета
	bmp->SetSize(640,400);         // размер изображения     
	bmp_c = bmp->Canvas;           // ссылка на Canvas Bitmap
	//здесь у нас будет тот массив в который мы будем помещать изображение
	buf = (unsigned long * )malloc(640 * 400 * sizeof(unsigned long));  
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
	delete bmp;
	free(buf);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{  
	/*
		Какие-то действия по получению изображения в массиве buf
	*/
	unsigned long * a;
	for(int y = 0;y < 400;y++){
		a =(unsigned long *)bmp->ScanLine[y]; // получим ссылку на текущую линию изображения
		for(int x = 0;x < 640;x++)
		{
			a[x] = buf[x + y * 640];  // копируем значение цвета пикселя из буфера
		}
	}
	BitBlt(gc->Handle,0,0,640,400,bmp_c->Handle,0,0,SRCCOPY);
}
	

Коментарии