BitBlt API'si Source DC'i (Device Context) Dest DC ye kopyalamak için kullandığımız bir GDI apisi,
size göstereceğim iki farklı kod örneğim var, göstermiş olacağım iki görüntününü boyutları her ikisi içinde 1920 * 1080 24 bit tir, görüntü kaynağı olarak,
ilk kaynak, GetDC(GetDesktopWindow) dan dönen DC Handle'ı ikinci kaynak ise formda yer alan TImage nesnesine assign edilmiş Bitmap görüntüsünün DC Handle'ı dır.
Buradaki sorun şu, her iki görüntü aynı boyutlara ve bit'e sahip olmasına rağmen GetDC(GetDesktopWindow) dan dönen değeri BitBlt Api'sinin SourceDC parametresine geçtiğim de kopyala işlemi 35..40 ms sürüyor, fakat BitBlt Api'sinin Source DC parametresine geçtiğim DC Handle'ı
Kod: Tümünü seç
Image1.Picture.Bitmap.Canvas.Handle
Burada neden bu kadar bariz zaman farkı var ? tam emin olmamakla birlikte TImage den alınan DC Handle ı bir Memory DC yani CreateCompatibleBitmap API'si tarafından oluşturulan bir DC olduğu için bu kadar hızlı kopyalıyor olabilir mi ? GetDC(GetDesktopWindow) ile dönen DC Handle ise bir Memory DC olmadığı için yani Display DC olduğu için yavaş oluyor olabilir mi ?
Kodlar şu şekilde,
Hızlı Kopyalayan Kod Örneği:
Kod: Tümünü seç
var
DC:HDC;
B:TBitmap;
F,L,FQ:Int64;
begin
try
QueryPerformanceFrequency(FQ);
QueryPerformanceCounter(F);
B := TBitmap.Create;
B.SetSize(1920,1080);
DC := Image1.Picture.Bitmap.Canvas.Handle; //burada görüldüğü gibi Image nesnesinden DC Handle alınıyor ve BitBlt Api'si kopyalamayı 4 ile 7 ms saniye arasında gerçekleştiriyor..
BitBlt(B.Canvas.Handle,0,0,1920,1080,DC,0,0,SRCCOPY);
QueryPerformanceCounter(L);
Caption := FloatToStr((L - F) / FQ * 1000);
finally
FreeAndNil(B);
end;
end;
Yavaş Kopyalayan Kod Örneği:
Kod: Tümünü seç
var
DC:HDC;
B:TBitmap;
F,L,FQ:Int64;
begin
try
QueryPerformanceFrequency(FQ);
QueryPerformanceCounter(F);
B := TBitmap.Create;
B.SetSize(1920,1080);
DC := GetDC(GetDesktopWindow); //burada görüldüğü gibi GetDC ile Desktop'ın DC Handle alınıyor ve BitBlt Api'si kopyalamayı 35 ile 40 ms saniye arasında gerçekleştiriyor..
BitBlt(B.Canvas.Handle,0,0,1920,1080,DC,0,0,SRCCOPY);
QueryPerformanceCounter(L);
Caption := FloatToStr((L - F) / FQ * 1000);
finally
FreeAndNil(B);
end;
end;