Einzelnen Beitrag anzeigen

Benutzerbild von meg91
meg91

Registriert seit: 25. Apr 2006
131 Beiträge
 
Turbo Delphi für Win32
 
#1

Fehlermeldung:Für diesen Befehl ist nicht genügend Speicher

  Alt 5. Sep 2006, 19:10
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;
  Mit Zitat antworten Zitat