Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Image Map generator (https://www.delphipraxis.net/139200-image-map-generator.html)

franktron 25. Aug 2009 13:56


Image Map generator
 
Ich möchte mir eine Imagemap Generator bauen.

Es gibt zwar welche aber keine mit einem Zauberstab.

Jetzt zu meiner Frage wie kann ich einen Zauberstab Programmieren,
also ich Klicke auf einen z.b. Blauen Bereich und er markiert alles in diesem Bereich.

patti 25. Aug 2009 14:16

Re: Image Map generator
 
Kuck mal hier, hab ich über die Suche gefunden: Thread in der DP. Vor allem der Pseudocode aus Beitrag #2 scheint interessant, du müsstest ihn lediglich in "richtigen" Delphi-Quellcode übersetzen.

Vielleicht hilft dir das ja schonmal weiter oder gibt dir zumindest einen kleinen Denkanstoß.

mfG
Patti

franktron 26. Aug 2009 11:48

Re: Image Map generator
 
Also ich kann jetzt meine Markierung machen aber nur den ganzen Bereich, ich möchte aber nur den Rand haben wie kann ich das machen

Blup 27. Aug 2009 12:09

Re: Image Map generator
 
Entferne alles aus der Menge der markierten Objekte/Pixel/was auch immer, was nicht Teil des Randes ist.

franktron 27. Aug 2009 12:32

Re: Image Map generator
 
Ich was gemacht ist aber nicht besonders schnell

Delphi-Quellcode:
procedure TDataList.PaintRand(C: TCanvas);
Var
  i    : Longint;
  Item : TData;

  Function IsRand1(Const X,Y : Longint;Const IsX : Boolean): Boolean;
  Var
    i  : Longint;
    item: TData;
  Begin
    i:=0;
    Result:=False;
    While i<FList.Count do
    Begin
      Item:=Get(i);
      If (item.X=X) AND (item.Y=Y) then Result:=True;
      If Result then i:=FList.Count;
      Inc(i);
    End;
  End;

  Function IsRand(Const X,Y : Longint): Boolean;
  Var
    i  : Byte;
  Begin
    i:=0;
    If IsRand1(X-1,Y,True) then Inc(i);
    If IsRand1(X+1,Y,True) then Inc(i);

    If IsRand1(X,Y-1,False) then Inc(i);
    If IsRand1(X,Y+1,False) then Inc(i);

    Result:=i<4;
  End;
 
begin
  For i:=0 To FList.Count-1 do
  Begin
    Item:=Get(i);
    If IsRand(Item.X,Item.Y) then
      C.Pixels[Item.X-FMinX,Item.Y-FMinY]:=clRed;
  End;
end;

Blup 28. Aug 2009 08:16

Re: Image Map generator
 
Wenn mit einer Liste gearbeitet wird, so würde ich diese sortieren.
Delphi-Quellcode:
function CompareData(AItem1, AItem2: Pointer): Integer;
begin
  Result := TData(AItem1^).y - TData(AItem2^).y;
  if Result = 0 then
    Result := TData(AItem1^).x - TData(AItem2^).x;
end;

FList.Sort(CompareData);
Dadurch lässt sich die Anzahl der Zugriffe auf die Elemente drastisch reduzieren.
Delphi-Quellcode:
function ComparePoint(AItem: TData; X, Y: Integer): Integer;
begin
  Result := AItem.Y - Y;
  if Result = 0 then
    Result := AItem.X - X;
end;

function FindPointDown(idx: Integer; X, Y: Integer): Boolean;
var
  iComp: Integer;
begin
  for i := idx - 1 downto 0 do
  begin
    iComp := ComparePoint(Get(idx), x, y);
    if iComp = 0 then
    begin
      Result := True;
      Exit;
    end;
    if iComp < 0 then
    begin
      Result := False;
      Exit;  
    end;
  end;
  Result := False;
end;

function FindPointUp(idx: Integer; X, Y: Integer): Boolean;
var
  iComp: Integer;
begin
  for i := idx + 1 to FList.COunt - 1 do
  begin
    iComp := ComparePoint(Get(idx), x, y);
    if iComp = 0 then
    begin
      Result := True;
      Exit;
    end;
    if iComp > 0 then
    begin
      Result := False;
      Exit;  
    end;
  end;
  Result := False;
end;

Function IsRand(idx: Integer): Boolean;
var
  Item: TData;
begin
  with Get(idx) do
  begin
    Result := FindPointDown(idx, x - 1, Y) and
              FindPointUp(idx, x + 1, Y) and
              FindPointDown(idx, x, Y - 1) and
              FindPointUp(idx, x, Y + 1);
  end;
end;
Zugriffe auf Pixels sind so ziemlich das langsamste was es gibt bei Bitmaps.
Wenn das Speicherformat bekannt ist, kann man die Bitmap direkt über Scannline ändern.

Hier noch ein Link zum Thema allgemein:
http://www.codeproject.com/KB/GDI/Qu...select=1306625


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 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