![]() |
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:
bmp ist ein TBitMap
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; 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 |
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:... |
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; |
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 18:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz