[ protech_v2 @ 10.12.2004. 10:04 ] @
Je l' moze neko od gurua da mi kaze kako da napravim da mi se ostatak ekrana osim zeljenog prozora prikazuje grayscale kao recimo kad se pokaze shutdown dijalog u XP-u?

Ne mora da se fade-uje, samo da bude grayscale

Pretpostavljam da ide preko DirectX-a?
[ morlic @ 10.12.2004. 12:31 ] @
Imas srece, ne treba DirectX. Stvar mozes izvesti na sledeci nacin: Uzmes sliku ekrana pre prikazivanja tvog prozora koji cemo nazvati A. Tu sliku pretvoris u grayscale. Prvo kreiras prozor B koji podesis da nema ivice, da je maximized i prikazes ga sa show. U njemu naravno imas preko celog prozora TImage u koji ces staviti onu grayscale sliku. Zatim prikazes prozor A preko njega i to je to. I windows to radi vrlo slicno.

Da malo pomognem evo nekih metoda koji ti trebaju za trik:

Code:

...
type
  PRGBArray = ^TRGBArray;
  TRGBArray = Array[0..2500] of TRGBTriple;
...

procedure TakeScreenShot(Bm : TBitmap);
var
  DC: hDC;
  X, Y: integer;
  ScreenWidth, ScreenHeight: integer;
  r : word;
begin
  ScreenWidth:= GetSystemMetrics(sm_CXScreen);
  ScreenHeight:= GetSystemMetrics(sm_CYScreen);

  Bm.Width:= ScreenWidth;
  Bm.Height:= ScreenHeight;
  Bm.PixelFormat:= pf24bit;

  DC:= GetDC(0);
  try
    BitBlt( Bm.Canvas.Handle, 0, 0,
      ScreenWidth, ScreenHeight, DC, 0, 0, SrcCopy);
  finally
    ReleaseDC(0, DC);
  end;
end;

procedure GrayOutBitmap(Bm : TBitmap);
Var
  Y, X : integer;
  SL: PRGBArray;
begin
  for Y := 0 to Bm.Height - 1 do
    begin
       SL := Bm.ScanLine[Y];
       for X := 0 to Bm.Width - 1 do
       begin
         SL[X].rgbtRed := Round( 0.212671 * SL[X].rgbtRed + 0.715160 * 
           SL[X].rgbtGreen + 0.072169 * SL[X].rgbtBlue );
         SL[X].rgbtGreen := SL[X].rgbtRed;
         SL[X].rgbtBlue := SL[X].rgbtRed;
       end
    end;
end;

[ protech_v2 @ 10.12.2004. 13:11 ] @
wou, svaka cast - ovakvom odgovoru se stvarno nisam nadao, hvala puno!
[ bancika @ 10.12.2004. 13:55 ] @
sta si ti ocekivao? "super smash hit box office monkey movie" sto bi reko Svarceneger :)
onaj fade-olike efekt mozes da dobijes ako mu smanjujes saturation postepeno...onda polako gubi boje i postaje grayscale
[ neor @ 10.12.2004. 16:51 ] @
Code:
SL[X].rgbtRed := Round( 0.212671 * SL[X].rgbtRed + 0.715160 * 
           SL[X].rgbtGreen + 0.072169 * SL[X].rgbtBlue );


Da li mozes da das neki link sa (sto detaljnijim) objasnjenjima za ove koeficijente?
Bas me zanima kako se doslo do njih.
[ sasas @ 10.12.2004. 18:00 ] @
Na ovom linku ima nekoliko razlicitih metoda konverzije y RGB->Gray.

http://astronomy.swin.edu.au/~pbourke/colour/imageprocess/

ss
[ neor @ 10.12.2004. 20:51 ] @
Hvala za link.
Mislio sam malo detaljnije objasnjene razloge za te koeficijente i kako se doslo do njih, eksperimentalno ili nekim drugim metodom.
U svakom slucaju sad bar znam bolje sta treba da trazim.
[ morlic @ 10.12.2004. 21:52 ] @
Postoji nekoliko nacina kojima se od kolor slike pravi gray varijanta, ja sam ovu izabrao zato sto mi najlepse izgleda. Kod "sive" slike stos je da Red, Green i Blue komponente imaju istu vrednost (izmedju 0 i 255).
Nula daje crnu boju: R:0 G:0 B:0 dok R:255 G:255 B:255 daje belu boju, sve izmedju su nijanse. Onaj kod koji sam ti gore postovao koristi malu varijaciju.

Evo jednog linka vezanog za sve i svasta koji ce biti interesantan sirem auditorijumu:

http://www.efg2.com/Lab/index.html
[ protech_v2 @ 13.12.2004. 11:16 ] @
Radi odlicno!
Ovo mi bas koristi (nisam ga stavljao za sminku) jer je inace interfejs dosta slozen, pa je ovako puno preglednije i omogucava bolji fokus na detalje u novoj formi...

Jedino sto me zanima koliko to otprilike trosi memorije?
Znam da zavisi od velicine ekrana, a s obzirom da je bitmap, najvise 1-2MB, je l' tako?

Moram da razmisljam i o ovim klijentima sa 32MB RAM-a (jad i beda) pa cu verovatno uraditi neku proveru kolicine RAM-a, pa u zavisnosti od toga ukljuciti/iskljuciti ovu opciju

[ bancika @ 13.12.2004. 11:39 ] @
mozes da ga u letu kompresujes u JPG, odmah posle konverzije u Grayscale, to ti moze osloboditi malo memorije...
ovako sam ja radio to
Code:

procedure TForm1.CompressJPG;
var
   aJPEGImage : TJPEGImage;
   aPicture : TPicture;
begin
   aPicture   := TPicture.Create;
   aJPEGImage := TJPEGImage.Create;
   try
     aPicture.LoadFromFile(temp.bmp');
     DeleteFile(temp.bmp');
     aJPEGImage.CompressionQuality:=45;
     aJPEGImage.Assign(aPicture.Graphic);
     aJPEGImage.Compress;
     aJPEGImage.SaveToFile(temp.jpg');
    finally
     aPicture.Free;
     aJPEGImage.Free;
   end
end;
[ sasas @ 13.12.2004. 11:46 ] @
Mislim da kompresija nema veze s tim. Da bi se bitmapa prikazala na ekranu, mora biti u nekom prikladnom formatu (bmp). Ne vidim sta tu kompresija radi?

ss.
[ protech_v2 @ 13.12.2004. 13:30 ] @
Pa da, ni ja ne vidim smisao - u prinicipu taj jpg se i dalje u pozadini dekompresuje da bi se slika pokazala na ekranu - jeste se lossy kompresijom kao sto je JPEG gube podaci sa slike, pa kao zauzima manje mesta, ali bitmap odredjenih dimenzija i dubine boja ce uvek zauzimati jednako memorije bez obzira sta sadrzi (da li jednu ili drugu sliku). Barem koliko ja znam, mozda i gresim
[ morlic @ 13.12.2004. 16:49 ] @
Samo ti to drzi kao bitmap-u (jpg ne donosi pozitivnu razliku da ne ulazim sada u detalje). Trosi se vise memorije tako da nije lose da razmislis o toj slici kao opciji na slabijim masinama. Mozda da opciju automatski podesava program. Kada se prvi put pokrene neka prikaze sliku, posle toga na osnovu fizickog RAM-a i brzine procesora mozes staviti i da program automatski iskljucujuje opciju, kako korisnik o tome ne bi razmisljao, a imas i opciju manje u podesavanjima. Balans izmedju lepog i brzog...
[ protech_v2 @ 14.12.2004. 12:41 ] @
Da, tako bi bilo najbolje - tako cu i uraditi, jedino sto cu jos mozda promeniti je da jos malo potamnim sliku da bi bilo kontrastnije, ali to su vec sitnice.

Jos jednom hvala na kodu i pomoci!