Autor Beitrag
G-McKree
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 178



BeitragVerfasst: So 19.12.04 22:30 
ich suche eine Möglichkeit einzelne Pixel abzufragen. Pixels[] ist zu langsam und mit Scanline muss man immer von neuem die line angeben.

Ich hab mal versucht nen Array von Txy zu nehmen, wobei Txy ein Pointer auf ein Array von RGB-Bytegruppen ist, dem dann per scanline die adresse zugewiesen wird

Also müsste ja dann Array[x,y] das gleiche wie Pixel[x,y] sein, aber ich hab da nur irgenteinen Fehler bekommen
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: So 19.12.04 22:47 
Hast du richtig dereferenziert? Ist ein häufiger Fehler bei Scanline.

AXMD
GSE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 740

Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
BeitragVerfasst: So 19.12.04 23:22 
Zitat:
und mit Scanline muss man immer von neuem die line angeben
und wo ist da das Problem?

mfg
GSE

_________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
Matthias
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 121



BeitragVerfasst: Mo 20.12.04 10:03 
Hy,

wenn Du mit Scanline arbeitest greifst Du direkt auf den Speicher einer DIB zu. Bei Bildern mit einer positiven Höhe liegt der Speicherbereich der Zeile 0 am Ende des Speicherblocks.
Ich vermute, dass Du versuchst ab hier in positiver Richtung zuzugreifen.

Matthias
Phantom1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 390



BeitragVerfasst: Mo 20.12.04 10:37 
Es gibt viele möglichen auf die Pixel zuzugreifen, am besten wäre natürlich direkt per Scanline, aber du kannst es auch mit folgender procedure machen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure SetPixel32(Bitmap: TBitmap; X, Y: Integer; Color: TColor);
begin
  PInteger(Integer(Bitmap.ScanLine[Y]) + X * 4)^:=Color;
end;


ein Beispiel dazu:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  // Bild auf 32bit setzten
  Image1.Picture.Bitmap.PixelFormat:=pf32bit;

  SetPixel32(Image1.Picture.Bitmap, 100, 100, clBlack);
  SetPixel32(Image1.Picture.Bitmap, 90, 33, RGB(123,222,111));
  // ...

  // zum Schluss das Image neu zeichnen
  Image1.Repaint;

MfG
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mo 20.12.04 10:51 
Wie wäre es, wenn du den entsprechenden Quellcode mal postest? Das sagt mehr als tausend Worte und bei Pointeroperationen ist nun mal jede Kleinigkeit wichtig.

Hier aber dennoch ein paar Hinweise im Umgang mit Scanlines.

Ganz wichtig. Immer das Pixelformat überprüfen bzw. von Hand auf einen entsprechenden Wert setzen. Sonst geht es schneller als du denkst und du greifst auf etwas anders zu.

Ich persönlich mache es immer so.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
  X, Y: Integer;
  pPix: PRGBTriple;  // bei 24 Bit
  pPix: PRGBQuad;    // bei 32 Bit
begin
  for Y := 0 to Bmp.Height -1 do begin
    pPix := Bmp.ScanLine[Y];

    for X := 0 to Bmp.Width do begin
      pPix^.rgbtBlue := 255;

      Inc (pPix);
    end;
  end;
end;

Das ist die einfachste und schnellste Methode. Das geht aber nur, wenn du nicht Pixelübergreifend arbeitest. Sonst muss man sich etwas anderes einfallen lassen. Je nachdem wie häufig du auf Scanline (immer wieder auf die selben Zeilen) zugreifst kannst du die Adressen auch ein Mal in ein Array schreiben und sie dann aus dem Array holen. Aber auch nur so lange wie das Bild existiert und du daran nichts (Pixelformat, Größe) geändert hast.

PS: @Phantom1: Das ist meiner Meinung nach keine gute Methode, da es auch wieder wahnsinnig Langsam wird, wenn du das gesammte Bild neu Zeichnen möchtest. Scanline macht in diesem Falle so viel, dass der Geschwindigkeitsvorteil gegenüber Pixels nicht wirklich groß ist.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Phantom1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 390



BeitragVerfasst: Mo 20.12.04 12:50 
@Lossy eX: ja das stimmt schon, mein weg ist auch eher gedacht für zufällige pixelpositionen. Aber auch so ist dieser weg immer noch wesentlich schneller als canvas.pixels[] :wink:
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mo 20.12.04 12:55 
Das ist auf jeden Fall richtig. Es geht ja auch nicht langsamer als Pixels. ;-)

Ich denke aber mal, wenn man 2-20 Pixel setzt, dann hält sich die ganze Zeichnerei noch in Grenzen. So das man die Zeit an der Stelle schon fast vernachlässigen könnte.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.