Ambilight i pobieranie koloru pixela z ekranu...

0

Witam!

Robie swoją wersje ambilight'a znanego z telewizorów Philips. Mój problem polega na pobieraniu koloru danego pixela z ekranu. Ta funkcja:

Form1.Color:=GetPixel(GetWindowDC(GetDesktopWindow),p.x,p.y);

działa w porządku dla pulpitu, okienek itp. Problem pojawia się w najprostszym filmie, grze (które pewnie korzystaja z overlay). Moje pytanie, jak pobrać kolor pixela niezależnie od tego za pomocą jakiego mechanizmu jest ten obraz tworzony. System to XP, ale miło by było, jakby to było uniwersalne tzn XP, Vista, 7. Any ideas?

PS. Ewnetualnie może to być C++, w razie czego po prostu przerzucę się na Buildera...

1

Spróbuj tej funkcji:

function GetPixelFromScreen(Position: TPoint):TColor;
  var
    BM: TBitmap;
    CV: TCanvas;
    Ekran: TRect;
  begin
    BM := TBitmap.Create;
    CV := TCanvas.Create;
    CV.Handle := GetWindowDC(GetDesktopWindow);
    Ekran := Rect(0, 0, Screen.Width, Screen.Height);
    BM.Width := Ekran.Right;
    BM.Height := Ekran.Bottom;
    BM.Canvas.CopyRect(Ekran, CV, Ekran);
    Result := BM.Canvas.Pixels[Position.X, Position.Y];
    BM.Free;
    CV.Free;
  end;
1

*.Pixels[X, Y] - feeee....
*.ScanLine[Y] - gooood !

0

Powyzsza funkcja nie działa... pobiera kolor z okienek, z pulpitu, ale np jak odpale WIndows Media Player, to pixela z filmu już nie pokaże (cały czas czarny kolor). Do tego samego doszedłem za pomocą linijki która jest w temacie.

0

spróbuj (ja nie mam teraz jak):

uses
  DirectDraw;

{...}

procedure ScreenShot(ABitmap: TBitmap);
var
  DDSCaps: TDDSCaps;
  DesktopDC: HDC;
  DirectDraw: IDirectDraw;
  Surface: IDirectDrawSurface;
  SurfaceDesc: TDDSurfaceDesc;
begin
  if DirectDrawCreate(nil, DirectDraw, nil) = DD_OK then
    if DirectDraw.SetCooperativeLevel(GetDesktopWindow, DDSCL_EXCLUSIVE or
       DDSCL_FULLSCREEN or DDSCL_ALLOWREBOOT) = DD_OK then
    begin
      FillChar(SurfaceDesc, SizeOf(SurfaceDesc), 0);
      SurfaceDesc.dwSize := Sizeof(SurfaceDesc);
      SurfaceDesc.dwFlags := DDSD_CAPS;
      SurfaceDesc.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE;
      SurfaceDesc.dwBackBufferCount := 0;
      if DirectDraw.CreateSurface(SurfaceDesc, Surface, nil) = DD_OK then
      begin
        if Surface.GetDC(DesktopDC) = DD_OK then
        try
          ABitmap.Width := Screen.Width;
          ABitmap.Height := Screen.Height;
          BitBlt(ABitmap.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DesktopDC, 0, 0, SRCCOPY);
        finally
          Surface.ReleaseDC(DesktopDC);
        end;
      end;
  end;
end;
0

Cimak - Twoja procedura po uruchomieniu (win7x64) powoduje na pare sekund czarny ekran, po czym wszystko wraca i pojawia sie screen (hurra), ale czy dałoby się wyeliminować to znikanie obrazu? Jutro jeszcze lookne jak to się zachowuje na WinXP. Spory krok w dobrą stronę, tylko czy dałoby to się jeszcze jakoś przyspieszyć?

Wielkie dzieki:)

0

ja tylko przekleilem to, co znalazlem w necie;]
teraz sprawdzilem ten kod u siebie. i niestety nie dziala;/ xp i classic media player.

1 użytkowników online, w tym zalogowanych: 0, gości: 1