Einzelnen Beitrag anzeigen

grizzly

Registriert seit: 10. Dez 2004
150 Beiträge
 
Delphi XE4 Professional
 
#4

Re: Bild: Umwandlung in Blaustufen (nicht Graustufen)

  Alt 2. Mai 2007, 14:21
Hab's mal eben so versucht (Nur für 32bit Bilder):

Delphi-Quellcode:
procedure ConvertBitmap32(BM: TBitmap; NewCol: TColor);
var
  x, y : Integer;
  p : pintegerarray;
  Gray : Integer;
  r,g,b: integer;
begin
  if BM.PixelFormat <> pf32bit
    then Exit;

  // Separate desired color into RGB
  b := (NewCol and $FF0000) shr 16;
  g := (NewCol and $FF00 ) shr 8;
  r := (NewCol and $FF );

  // Change color for each pixel
  for y := BM.Height-1 downto 0 do
    begin
      p := BM.ScanLine[y];
      for x := 0 TO BM.Width-1 do
        begin
          // Determine gray value (Gray = 0.11*B + 0.50*G + 0.30*R)
          Gray := (((p^[x] and $FF) ) * 28 + // about 11% blue
                   ((p^[x] and $FF00) shr 8) * 128 + // about 50% green
                   ((p^[x] and $FF0000) shr 16) * 100) shr 8; // about 39% red
          // Gray now is between 0 and 255
          // Adjust color
          p^[x] := (((r * Gray) shr 8) shl 16 ) or
                   (((g * Gray) shr 8) shl 8 ) or
                   (((b * Gray) shr 8));
        end;
    end;
END;
NewCol bestimmt den Farbton, den das umgewandelte Bild haben soll. Für ein reines Graustufenbild muß also $00FFFFFF verwendet werden, für ein Blaustufenbild $00FF0000.
Die Bestimmung des Grauwertes folgt nur grob der von Khabarakh angesprochenen Umwandlung, aber solche Feinheiten sehen wir auf unseren unkalibrierten Monitoren eh nicht
Allerdings ergibt sich durch diese Verwendung folgender Effekt: Ein helles blau wirkt im Blaustufenbild dunkler als im Original.

Gruß
Michael
  Mit Zitat antworten Zitat