AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Graustufen....

Ein Thema von Corelgott · begonnen am 2. Dez 2003 · letzter Beitrag vom 3. Dez 2003
Antwort Antwort
Benutzerbild von Corelgott
Corelgott

Registriert seit: 11. Apr 2003
Ort: Lübeck
213 Beiträge
 
Delphi 2006 Enterprise
 
#1

Graustufen....

  Alt 2. Dez 2003, 14:41
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
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Graustufen....

  Alt 2. Dez 2003, 14:52
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.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Wormid
Wormid

Registriert seit: 26. Aug 2003
Ort: Steinfurt
292 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Graustufen....

  Alt 2. Dez 2003, 15:09
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;
Debuggers don't remove Bugs, they only show them in Slow-Motion.
  Mit Zitat antworten Zitat
Benutzerbild von Corelgott
Corelgott

Registriert seit: 11. Apr 2003
Ort: Lübeck
213 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: Graustufen....

  Alt 3. Dez 2003, 21:58
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:20 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