Autor Beitrag
Sylvus
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: Mi 14.10.09 11:43 
Hay Leute, ich hab ein Bild und möchte das gerne in ein Array packen um dann schneller Berechnungen, wie z.B. Suchen von Flächen durchführen zu können. Ich hoffe die Idee ist erstmal sinnvoll!
Jetzt habe ich folgenden Code, der mir das Bild in das Array speichert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  for J := 0 to Form1.Anzeige.Picture.Bitmap.Height - 1 do
  begin
    Row := Form1.Anzeige.Picture.Bitmap.ScanLine[J];
    for I := 0 to Form1.Anzeige.Picture.Bitmap.Width - 1 do
    begin
      bild[I, J]:= Row^.rgbtRed;
      Inc(Row);
    end;
  end;


Um das gleich zu klären, das Bild ist grau - jeder Farbwert egal ob blau grün oder rot ist also gleich!
Ich kann jetzt natürlich das ganze runternehmen auf ein Array of Integer, aber ich möchte eigentlich mit den einzelnen Farbwerten arbeiten.
Dieser Algorithmus braucht 7 sekunden - und das ist zu lange! Darum die Frage, wie man ihn optimieren könnte.
Stichwort "Scanline"? :)

Vielen Dank

//so schon etwas verbessert - trotzdem noch Ideen?
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Fr 16.10.09 21:56 
Hallo,

ich benutze meistens

Bitmap.Canvas.Pixels[actx, acty]

ich habe nie eine lästige Wartezeit für 1200 x 800 Bilder gefunden. Bitmapformat könnte aber ein Problem sein. Einige BMP-Formate packen die heute üblichen 3 Bytes je Farbe, so dass bei jedem Zugriff erste eine Umsortierung in das 4-Byte Integer erfolgen muss.

Insofern lohnt eigentlich das Umspeichern nicht, Du kannst ja auf die Pixel in der Bitmap direkt wie in einem ARRAY zugreifen.

Bei einer BMP, die 32-Bit je Pixel speichert, wäre auch ein Blockmove in an Array of Integer (32 Bit) eine Alternative, aber vergiss Portierbarkeit/langlebigkeit des Codes.

Gruß
Guenther
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 17.10.09 09:45 
user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
ich benutze meistens

Bitmap.Canvas.Pixels[actx, acty]
Das wäre extrem langsam. Langsamer geht es kaum noch...

@user profile iconSylvus:
Du hast von ScanLine doch bereits quasi ein Array. Warum kopierst du danach einzeln? :gruebel: