AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Fehlermeldung:Für diesen Befehl ist nicht genügend Speicher
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von meg91 · begonnen am 5. Sep 2006 · letzter Beitrag vom 5. Sep 2006
 
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#8

Re: Fehlermeldung:Für diesen Befehl ist nicht genügend Speic

  Alt 5. Sep 2006, 19:46
Hallo,

verwende mal folgende Routine. Hier wird kein Bitmap verwendet, sondern direkt vom Desktop gelesen. Außerdem habe ich diesen Blödsinn mit der Umwandlung in String und wieder zurück rausgeschmissen.
Delphi-Quellcode:
procedure TForm1.ScreenToLine;
var
  Handle: THandle;
  iFor, iFor2: Integer;
  bRed, bGreen, bBlue: Byte;
  PixelColor: Integer;
  bXgesRed, bXgesGreen, bXgesBlue: Integer; //Duchschnittsfarben Horizontal
  bYgesRed, bYgesGreen, bYgesBlue: Integer; //Duchschnittsfarben Vertikal
begin
  Handle := GetDC(0);
  try
    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 Horizontalen addieren
        PixelColor := GetPixel(Handle, (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 := Round(bYgesBlue / 16);
      bYgesGreen := Round(bYgesGreen / 16);
      bYgesRed := Round(bYgesRed / 16);

      bXgesBlue := bXgesBlue + bYgesBlue;
      bXgesGreen := bXgesGreen + bYgesGreen;
      bXgesRed := bXgesRed + bYgesRed;
    end;

    bXgesBlue := Round(bXgesBlue / 20);
    bXgesGreen := Round(bXgesGreen / 20);
    bXgesRed := Round(bXgesRed / 20);

    //Werte ausgeben
    TrackBar1.Position := bXgesRed;
    TrackBar2.Position := bXgesGreen;
    TrackBar3.Position := bXgesBlue;

    Application.ProcessMessages;
  finally
    ReleaseDC(0, Handle);
  end;
end;
Das läuft bei mir ohne die geringsten Ressourcenlecks.

Übrigens: Mit Deinen Berechnungen (jeden 64. Pixel nehmen und daraus den Durchschnitt berechnen) bekommst Du keine wirkliche Durchschnittsfarbe des Desktops, sondern nur eine sehr grobe Näherung, die auch komplett falsch sein kann. Außerdem funktioniert Deine Methode nur bei der Auflösung von 1280x1024 (20 * 64 x 16 * 64).

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz