Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Graustufen.... (https://www.delphipraxis.net/12691-graustufen.html)

Corelgott 2. Dez 2003 14:41


Graustufen....
 
Hi @all,

ich versuche gerade einem Bild etwas nach und nach zu Rauben... Seine Farbe! Ich will so einen Effekt bauen, wie er beim beenden von windows XP zu sehen ist. Alles wir langsam grau...

Das bedeutet: Die berechnung des "Grauen" muss einigermaßen finck von statten gehen...

Der Code den ich mir bisher so zusammen gesammelt habe sieht so aus:

Code:
procedure Gray();
var i, j : integer;
    R, G, B, h, Alpha : Byte;
    p: ^PixArray;

begin
  Alpha := 220;
  bmp.PixelFormat := pf24bit;
  for i:=0 to bmp.height - 1 do begin
    p := bmp.ScanLine[i];
    for j:=0 to bmp.width - 1 do begin
      R := p^[2] + 255  Alpha;
      B := p^[1] + 255 * Alpha;
      G := p^[0] 255 * Alpha;

      //h := (r+b+g) div 3;
      h:= HiByte(r*77+g*151+b*28);

      p^[2] := h;
      p^[1] := h;
      p^[0] := h;

      inc(p);
    end;
  end;
  ReDraw();
end;
bmp ist ein TBitMap

Der Code ist auch recht flink (Ich vermute mal wegen der Pointer ?!?) aber er macht Grau! Ich hätte aber gerne ein paar zwischenstufen...

So zu sagen mochte ich die Farben langsam verblassen lassen und dann zum schluss das Bild in Grau haben.

Ne idee wie ich das anpasse bzw. hat wer nen besseren Code?

THX Corelgott

sakura 2. Dez 2003 14:52

Re: Graustufen....
 
Imho wäre es das beste, das Bild auf pf8Bit umzuwandeln und die enstandene Farb-Palette (256 Farben) auszulesen. Anschließend solltest Du die Zielpalette (256 Graustufen) berechnen und die Original-Version schrittweise angleichen...

Soviel zu Theorie.

...:cat:...

Wormid 2. Dez 2003 15:09

Re: Graustufen....
 
Hier mal ein paar kleine Routinchen, die dich der Lösung vielleicht näher bringen. Die Prozedur "DrawFrostedGlass" macht im Grunde das was du suchst, glaube ich... Zumindestens liesse sich das daraus ableiten - in "Milk" könnte nämlich der Grauwert drinstehen, der dir so vorschwebt.

Delphi-Quellcode:
// Einen TColor-Wert in die einzelnen RGB-Anteile umrechnen
procedure SplitColorToRGB(const Color: TColor; var r, g, b: Byte);
begin
  r := ColorToRGB(Color) and $0000FF;
  g := (ColorToRGB(Color) and $00FF00) shr 8;
  b := (ColorToRGB(Color) and $FF0000) shr 16;
end;

// Einzelne RGB-Anteile in einen TColor-Wert umrechnen
function RGBToColor(const r, g, b: Byte): TColor;
begin
  Result := TColor(r + (g shl 8) + (b shl 16));
end;

// Alphablending...
function CalcBlending(const Source, Back, Alpha: Byte): Byte;
begin
  Result := Back + ((Source - Back) * Alpha div 255);
end;

// "Milchglasscheibe" mit einem 1-Pixel-Rahmen auf ein Bitmap zeichnen...
procedure DrawFrostedGlass(var Bitmap: TBitmap; GlassRect: TRect; const Milk: TColor = clWhite; Alpha: Byte = 128);
var r, g, b: Byte;
    x, y: Integer;
    P: PByteArray;
begin
  // Den Rahmen malen
  with Bitmap.Canvas, Bitmap.Canvas.Pen do begin
    Color := Milk;
    Style := psSolid;
    Width := 1;
    Brush.Style := bsClear;
    Rectangle(GlassRect);
  end;

  // Vorbereitungen für das AlphaBlending
  Bitmap.PixelFormat := pf24Bit;
  GlassRect.Left := (GlassRect.Left * 3) + 3;
  GlassRect.Right := (GlassRect.Right * 3) - 3;
  SplitColorToRGB(Milk, r, g, b);

  // Zeilen einzeln auslesen und Pixel einzeln verwursten...
  for y := GlassRect.Top + 1 to GlassRect.Bottom - 1 do
  begin
    P := Bitmap.ScanLine[y];
    x := GlassRect.Left;
    repeat
      P[x+0] := CalcBlending(P[x+0], r, Alpha);
      P[x+1] := CalcBlending(P[x+1], g, Alpha);
      P[x+2] := CalcBlending(P[x+2], b, Alpha);
      Inc(x, 3);
    until x >= GlassRect.Right;
  end;
end;

Corelgott 3. Dez 2003 21:58

Re: Graustufen....
 
Hi,

erst mal, bevor ich das vergesse vielen herzlichen Dank für euren zahlreichen Antworten!!

ich habe mitlerweile das Problem, dank eurer Denkanstöße, lösen können.

Nochmals thx

Corelgott


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz