Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Bitmap-Ausschnitt einfärben

  Alt 21. Feb 2014, 09:46
Mach das einfach mit Scanline... es ist nicht so kompliziert wie es sich vielleicht anhört.

Ich habs grad einfach mal aus dem Kopf runtergeschrieben, weil es glaub ich länger dauern würde, es mit Worten zu erklären, und dann immer noch unklarer wäre:
Delphi-Quellcode:
function Clamp(Value: Integer; Min, Max: Integer); inline;
begin
  Result := Value;
  if Result < Min then Result := Min;
  if Result > Max then Result := Max;
end;

procedure AdjustLuminance(Bmp: TBitmap; Offset: SmallInt)
  Bmp: TBitmap;
  Pixel: PRGBQuad;
  x,y: integer;
begin
  Bmp.PixelFormat := pf32Bit;
  for y := 0 to Bmp.Height - 1 do
  begin
    // Pointer auf 1. Pixel in der Zeile holen
    Pixel := Bmp.Scanline[y];
    for x := 0 to Bmp.Width - 1 do
    begin
      Pixel^.R := Clamp(Pixel^.R + Offset, 0, 255);
      Pixel^.G := Clamp(Pixel^.G + Offset, 0, 255;
      Pixel^.B := Clamp(Pixel^.B + Offset, 0, 255);

      // ein Pixel nach rechts gehen
      inc(Pixel);
    end;
  end;
end;
Delphi-Quellcode:
AdjustLuminance(Bmp, 50); // Aufhellen
AdjustLuminance(Bmp, -50); // Abdunkeln
Für PRGBQuad musst du irgendeine Unit einbinden, ich hab es grad nicht im Kopf, welche. Oder du deklarierst dir den Record einfach selbst:
Delphi-Quellcode:
type
  PRGBQuad = ^TRGBQuad;
  TRGBQuad = packed record
    B, G, R, A: Byte;
  end;
PS: Kann sein, dass Luminance hier formal gesehen der richtige Begriff ist. Aber für einen Hover-Effekt reicht es allemal, und wenn nicht, kann man die Berechnung in der Schleife ja einfach austauschen.
  Mit Zitat antworten Zitat