Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Image zu Array


Sylvus - Mi 14.10.09 11:43
Titel: Image zu Array
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:


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 - 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 - 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: