hi@all
ich hab ein Programm geschrieben, welches in regelmäßigen Abständen nen Screenshot macht und daraus die Durchschnitssfarbe berechnet
anschließend wird der eine Farbwert als RBG auf dem
Com Port ausgegeben
am anfang funktioniert es auch wunderbar nur nach einiger Zeit kommt die Fehlermeldugn von Delphi:Für diesen Befehl ist nicht genügend Speicher verfügbar
hier mal mein Quelltext
Delphi-Quellcode:
procedure TForm1.ScreenToLine();
var
Bitmap: TBitmap;
Canvas: TCanvas;
iFor, iFor2: LongInt;
bRed, bGreen, bBlue: Byte;
PixelColor: LongInt;
bXgesRed, bXgesGreen, bXgesBlue: LongInt; //Duchschnittsfarben Horizontal
bYgesRed, bYgesGreen, bYgesBlue: LongInt; //Duchschnittsfarben Vertikal
begin
Canvas := TCanvas.Create;
try
Canvas.Handle := GetWindowDC(0);
try
Bitmap := TBitmap.Create;
try
Bitmap.Width := Screen.DesktopWidth;
Bitmap.Height:= Screen.DesktopHeight;
Bitmap.PixelFormat := pfDevice;
BitBlt(Bitmap.Canvas.Handle, 0, 0, Pred(Screen.DesktopWidth), Pred(
Screen.DesktopHeight), Canvas.Handle, Screen.DesktopLeft,
Screen.DesktopTop, Bitmap.Canvas.CopyMode); //Screenshot machen
bXgesBlue := 0;
bXgesGreen := 0;
bXgesRed := 0;
for iFor := 0 to 20 do
begin
bYgesBlue := 0;
bYgesGreen := 0;
bYgesRed := 0;
for iFor2 := 0 to 16 do
begin
//jeden 64-ten Pixel in der hotizontalen addieren
PixelColor := ColorToRGB(Bitmap.Canvas.Pixels[(iFor * 64), (iFor2 * 64)]);
bBlue := PixelColor;
bGreen := PixelColor shr 8;
bRed := PixelColor shr 16;
bYgesBlue := bYgesBlue + bBlue;
bYgesGreen := bYgesGreen + bGreen;
bYgesRed := bYgesRed + bRed;
end;
bYgesBlue := StrToInt(FloatToStr(Round(bYgesBlue / 16)));
bYgesGreen := StrToInt(FloatToStr(Round(bYgesGreen / 16)));
bYgesRed := StrToInt(FloatToStr(Round(bYgesRed / 16)));
bXgesBlue := bXgesBlue + bYgesBlue;
bXgesGreen := bXgesGreen + bYgesGreen;
bXgesRed := bXgesRed + bYgesRed;
end;
bXgesBlue := StrToInt(FloatToStr(Round(bXgesBlue / 20)));
bXgesGreen := StrToInt(FloatToStr(Round(bXgesGreen / 20)));
bXgesRed := StrToInt(FloatToStr(Round(bXgesRed / 20)));
//Werte ausgeben
TrackBar1.Position := bXgesRed;
TrackBar2.Position := bXgesGreen;
TrackBar3.Position := bXgesBlue;
Application.ProcessMessages;
finally
Bitmap.Free;
iFor := 0;
iFor2 := 0;
bRed := 0;
bGreen := 0;
bBlue := 0;
PixelColor := 0;
bXgesRed := 0;
bXgesGreen := 0;
bXgesBlue := 0;
bYgesRed := 0;
bYgesGreen := 0;
bYgesBlue := 0;
end;
finally
ReleaseDC(0, Canvas.Handle);
end;
finally
Canvas.Free;
end;
end;