• 13 odgovora
  • 3.377 pregleda
Izazov - grayscale efekt 10.12.2004. u 10:04 · pre 266 meseci #1
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?
Re: Izazov - grayscale efekt 10.12.2004. u 12:31 · pre 266 meseci #2
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;

Re: Izazov - grayscale efekt 10.12.2004. u 13:11 · pre 266 meseci #3
wou, svaka cast - ovakvom odgovoru se stvarno nisam nadao, hvala puno!
Re: Izazov - grayscale efekt 10.12.2004. u 13:55 · pre 266 meseci #4
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
Potpis
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
Re: Izazov - grayscale efekt 10.12.2004. u 16:51 · pre 266 meseci #5
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.
Re: Izazov - grayscale efekt 10.12.2004. u 20:51 · pre 266 meseci #7
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.
Re: Izazov - grayscale efekt 10.12.2004. u 21:52 · pre 266 meseci #8
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
Re: Izazov - grayscale efekt 13.12.2004. u 11:16 · pre 266 meseci #9
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

Re: Izazov - grayscale efekt 13.12.2004. u 11:39 · pre 266 meseci #10
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;
Potpis
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
Re: Izazov - grayscale efekt 13.12.2004. u 11:46 · pre 266 meseci #11
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.
Potpis
When something is hard to do, then it's not worth doing.
Re: Izazov - grayscale efekt 13.12.2004. u 13:30 · pre 266 meseci #12
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
Re: Izazov - grayscale efekt 13.12.2004. u 16:49 · pre 266 meseci #13
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...
Re: Izazov - grayscale efekt 14.12.2004. u 12:41 · pre 266 meseci #14
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!
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme