Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#20

Re: Bildbearbeitung: Linien verstärken, gibt's sowas?

  Alt 30. Sep 2009, 19:31
ungetestet ... hier werden theoretisch zuerst je die Farben aus Colors genommen und dann das erste gefundene Pixel
Delphi-Quellcode:
procedure LinienFettierer(Image: TBitmap; Background: TColor; Colors: Array of TColor; Size: Integer);
type
  TRGBA = packed Record R, G, B, A: Byte; End;
  TScanArray = packed Array[0..0] of TRGBA;
  PScanArray = ^TScanArray;
var
  x, y, x2, y2, x3, y3, i: Integer;
  C: TRGBA;
  Temp: TBitmap;
  Mask: Array of Array of Boolean;
  Scan: Array of PScanArray;
  Scan2: PScanArray;
label
  break;
begin
  Background := ColorToRGB(Background) and $00FFFFFF;
  for i := 0 to High(Colors) do
    Colors[i] := ColorToRGB(Colors[i]) and $00FFFFFF;
  Temp := TBitmap.Create;
  try
    Image.PixelFormat := pf32bit;
    Temp.PixelFormat := pf32bit;
    Temp.Width := Image.Width + Size - 1;
    Temp.Height := Image.Height + Size - 1;
    Temp.Canvas.Brush.Color := clBlack;
    Temp.Canvas.Ellipse(0, 0, Size, Size);
    Temp.Canvas.Pixels[Size div 2, Size div 2] := clBlack;
    SetLength(Mask, Size, Size);
    for x := 0 to Size - 1 do
      for y := 0 to Size - 1 do
        Mask[x, y] := Temp.Canvas.Pixels[x, y] = clBlack;
    SetLength(Scan, Size);
    for y := 0 to Temp.Height - 1 do
    begin
      for y2 := 0 to Size - 1 do
      begin
        y3 := y - Size + 1 + y2;
        if (y3 >= 0) and (y3 < Image.Height) then
          Scan[y2] := Image.ScanLine[y3] else Scan[y2] := nil;
      end;
      Scan2 := Temp.ScanLine[y];
      for x := 0 to Temp.Width - 1 do
      begin
        for i := 0 to Length(Colors) do
          for y2 := 0 to Size - 1 do
          begin
            y3 := y - Size + 1 + y2;
            if (y3 >= 0) and (y3 < Image.Height) then
              for x2 := 0 to Size - 1 do
              begin
                x3 := x - Size + 1 + x2;
                if (x3 >= 0) and (x3 < Image.Width) and Mask[x2, y2] then
                begin
                  C := Scan[y2][x3];
                  if ((i < Length(Colors)) and (TColor(C) = Colors[i]))
                     or ((i = Length(Colors)) and (TColor(C) <> Background)) then
                  begin
                    Scan2[x] := TRGBA(RGB(C.R, C.G, C.B));
                    goto break;
                  end;
                end;
              end;
          end;
        Scan2[x] := TRGBA(Background);
        break:
      end;
    end;
    Image.Width := Temp.Width;
    Image.Height := Temp.Height;
    Image.Canvas.Draw(0, 0, Temp);
  finally
    Temp.Free;
  end;
end;
[add]
Zitat:
[30.09.2009 19:22] Matze: ich würde den Farben gerne eine Priorität verpassen O
[30.09.2009 19:22] Matze: also dass erst dunkelblau gemalt wird, dann hellblau, dann orange, dann rot etc
...
[30.09.2009 19:32] Matze: danke, aber laut deinem Satz hast du mich falsch verstanden
[30.09.2009 19:33] Matze: ich möchte zuerst auf dem kompletten Bild alle dunkelblauen Linien verdicken. Anschließend alle hellblauen etc
[30.09.2009 19:33] Matze: aktuell geht rot bei mir bissl unter und daher wäre es schön, wenn das am Schluss übermalt werden würde
[30.09.2009 19:33] himitsu: es werden vorrangig nacheinander die Farben des Arrays genommen und wenns nicht im Array drin ist, dann der erste fund
da wohl meine Beschreibung nicht eindeutig war
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat