AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Was geht schneller bei zufälligen zugriff auf Farbwerte?
Thema durchsuchen
Ansicht
Themen-Optionen

Was geht schneller bei zufälligen zugriff auf Farbwerte?

Ein Thema von griever · begonnen am 27. Apr 2008 · letzter Beitrag vom 27. Apr 2008
Antwort Antwort
griever

Registriert seit: 27. Apr 2008
19 Beiträge
 
#1

Was geht schneller bei zufälligen zugriff auf Farbwerte?

  Alt 27. Apr 2008, 11:50
Hallo,
also ich will in ein bild die farbewerte von zufällig ausgewählten pixeln ändern was geht da am schnellsten?
wenn ich auf die pixel per canvas.pixels[x,y] zugreife, wenn ich mit bitmap und scanline daran geh oder wenn ich das ganze in ein 2d array scheib und danach mit scanline das array ins bild übertrage?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: WAs geht schneller?

  Alt 27. Apr 2008, 11:59
würdest du bitte deinem Thread einen aussagekräftigen Titel geben, in dem du deinen ersten Beitrag entsprechend editierts.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Was geht schneller bei zufälligen zugriff auf Farbwerte?

  Alt 27. Apr 2008, 12:19
eindeutig scanline. Dies musst du nur ein einziges mal aufrufen um einen Pointer auf den Bildspeicher zu bekommen (also nicht für jedes pixel). Die Variante mit dem Array ist logischer Weise langsamer weil du ja selbst schreibst das du dann noch zusätzlich scanline verwendest.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
griever

Registriert seit: 27. Apr 2008
19 Beiträge
 
#4

Re: Was geht schneller bei zufälligen zugriff auf Farbwerte?

  Alt 27. Apr 2008, 12:31
naja ich dachte
man kann nur eine zeile mit scanline auslesen, weshalb man ja bei zufälligen zugriff(als0 mal zeile 1 mal 356
und dort jeweils auch nur ein pixel) man mehr aufwand hat.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Was geht schneller bei zufälligen zugriff auf Farbwerte?

  Alt 27. Apr 2008, 12:34
mit Scanline bekommst du einen Pointer auf den Bildspeicher der Zeile X zurück. Die Zeilen liegen aber zusammenhängend im Speicher.

Wenn du bei einem Bild mit 100 Höhe dir mit Scanline die Zeile 50 holst und dort auf der X-Achse drüber hinaus malst wirst du sehen das die eine der anliegenden Zeilen veränderst.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
griever

Registriert seit: 27. Apr 2008
19 Beiträge
 
#6

Re: Was geht schneller bei zufälligen zugriff auf Farbwerte?

  Alt 27. Apr 2008, 12:51
heist das ich brauch nur einmal scanline machen und das resultat dann um eins erhöhen um in die nächste zeile zu kommen?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Was geht schneller bei zufälligen zugriff auf Farbwerte?

  Alt 27. Apr 2008, 12:53
nein. Scanline zeigt auf den Anfang einer Zeile. In der Zeile sind dann deine ganze pixel enthalten. Wenn du nur um 1 erhöhst landest du ja maximal beim 2ten pixel (eher aber beim nächsten Farbwert des ersten pixels der Zeile). Du musst wenn schon bis ans ende der zeile um in die nächste zu kommen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#8

Re: Was geht schneller bei zufälligen zugriff auf Farbwerte?

  Alt 27. Apr 2008, 13:00
Hallo,

Zitat von griever:
heist das ich brauch nur einmal scanline machen und das resultat dann um eins erhöhen um in die nächste zeile zu kommen?
fast. Du musst natürlich sämtliche Pixel der aktuellen Zeile überspringen, um in die nächste Zeile zu kommen.
Du musst aber zwei Dinge beachten:
Erstens stehen Bitmaps normalerweise auf dem Kopf, d. h. Der Pointer auf die letzte Zeile ist der Startpunkt der Bilddaten.
Zweitens ist eine Bildschirmzeile immer durch vier teilbar. Hat Dein Bild also drei Pixel und eine Farbtiefe von 24Bit, dann hat jede Zeile 9 Byte Pixeldaten und am Ende drei Byte Fülldaten. Wenn Du mit 32Bit arbeitest, hast Du natürlich keine Probleme.

Ein Beispiel (32 Bit):
Delphi-Quellcode:
Bit := TBitmap.Create;
Bit.Width := 30;
Bit.Height := 20;

P := Bit.ScanLine[Bit.Height - 1];

// Pixel an 10, 5 holen:
R := P[10 * 4 + (5 * 30 * 4)];
G := P[10 * 4 + (5 * 30 * 4) + 1];
B := P[10 * 4 + (5 * 30 * 4) + 2];

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
griever

Registriert seit: 27. Apr 2008
19 Beiträge
 
#9

Re: Was geht schneller bei zufälligen zugriff auf Farbwerte?

  Alt 27. Apr 2008, 13:26
Delphi-Quellcode:
try
  legn:=integer(pic.scanline[1])-integer(pic.scanline[0]);
except
  raise Exception.Create('Error');
  end;
p:=pic.scanline[0];
v:= pic.Height*(legn-1);
for h:= 0 to v do
  begin
    p^[v] := Random(256);
  end;

try
  legn := Abs(Integer(pic.ScanLine[1]) -Integer(pic.ScanLine[0]));
except
  raise Exception.Create('Error');
  end;
for h := 0 to pic.Height - 1 do
  begin
  P := pic.ScanLine[h];
  for v := 0 to legn - 1 do
    P^[v] := Random(256);
  end;
das obere is langsamer als das untere wenn ich ales pixel des bildes bearbeite
könnte sich das ändern, wenn ich nur ein pixel pro zeile bearbeite?
und wenn ja gibts ne möglichkeit einen punkt, denn ich ändern will schnell im array zu finden? nicht das der vorsprung den das obere dann evtl.hat durch das suchen wieder aufgefressen wird.
P is ja ein bytearraay, wenn ich das umändere in ein zb 4byte array(wenns sowas gibt) kann ich dann den farbwert mit einmal auslesen?(also alle farben bei pf32bit)
dann wär ja auch theoritsch jeder punkt im array durch ein punkt auf dem bild uind müsste berechnet werden durch
P[x+("länge der zeile" * y))

beim oberen teil fang ich ja bei scanline[0] an und zähl dann raufwärst mach ich da was falsch weil mein bild wird trotzdem gefüllt?

ok ich weis jetzt warum der obere teil langsamer war
bei p^[v] := Random(256); is das v falsch da müsste ein h hin jetzt ist das schonmal beim kompletten schreiben schneller

kann es sein das scanline nur zum schreiben da ist?
irgendwie bekomm ich zugriffsfehler, wenn ich nach art des oberen beispiels den inhalt des pointer in einen integer lesen will
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz