Laden...

[HELP!] Pointerschritte???

Erstellt von digi333 vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.584 Views
D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 16 Jahren
[HELP!] Pointerschritte???

Ich zeichne ein Bild in ein Frame (720x576). Und zwar sollen nur die Ecken weiße Blöcke haben. Die erste Ecke oben links ist ja einfach aber die anderen 3 werden schwierig für mich, da ich mit der schrittweite nicht klar komme.


for (int y = 0; y < frameHeight; y++)
                    {
                        for (int x = 0; x < frameWidth; x++)
                        {
                            // OuputBild zeichnen
                            if (x < areaSizeX && y < areaSizeY)
                                pRGB[0] = pRGB[1] = pRGB[2] = (byte)previousY_TL[x, y];

                            else if (x > frame.Width - areaSizeX && y < areaSizeY)
                                pRGB[(x + y)*3] = pRGB[(x + y)*3 + 1] =
                                    pRGB[(x + y)*3 + 2] = (byte) previousY_TR[x + areaSizeX - 1 - frame.Width, y];
                                
                           
                             
                            // Bild zeichnen
                            pRGB[0] = pRGB[1] = pRGB[2] = frameInt[x, y];*/
                            
                            // Pointerschritte
                            pRGB += 3;

                        }
                    }

Das Problem liegt also in der Else-Schleife und pRGB[(x + y)*3] = pRGB[(x + y)*3 + 1] = pRGB[(x + y)*3 + 2].

Das Bild sieht so aus...

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo digi333,

warum verwendest du nicht Graphics.FillRectangle?

herbivore

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 16 Jahren

es ist nicht nur ein Rechteck sondern es werden bestimmte Int-Arrays an den Ecken dargestellt. Was würdest du sonst so zu meinem eigentlichen Problem sagen?

Help!

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo digi333,

pRGB[(x + y)*3] ist auf jeden Fall schon mal falsch geklammert.

herbivore

183 Beiträge seit 2006
vor 16 Jahren

Original von digi333... Else-Schleife ...

bah! Pfui deibel!

Warum hilft Dir nicht das AddRectangle, oder auch AddLines von GraphicsPath? Damit kannst Du ebenfalls Vierecke zeichnen in dem Du einfach nur Point-Obkjekte(bei AddLines) oder ein Rectangle-Objekt(bei AddRectangle) übergibst.


Graphics g = new Graphics();
GraphicsPath path = new GraphicsPath();
// w/ Rectangle
path.AddRectangle(new Rectangle( 0, 0, 200, 100 ));
g.FillPath( Brushes.Blue, path );

// w/ Points
path.AddLines( new Point[] { new Point(0, 0), new Point(0, 10), new Point(5, 10), new Point(5, 0) } );
g.FillPath( Brushes.Blue, path );

Vielleicht hilft es ja? Somit brauchst Du nicht wie wild mit den pointern um Dich schießen.

Gut Schuß
VuuRWerK 😉

P.S.: Bitte gewöhne Dir eine ordentliche Bezeichnung der Programmier-Konstrukte an, Danke 🙂

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 16 Jahren

Erstmal Danke, aber wie gesagt reichen mir Graphic-Objecte nicht aus, da ich Arrays erzeuge mit Grauwerten. Diese Werte ändern sich ständig. Ich möchte auch nicht mit SetPixel arbeiten, da diese sehr langsam sind. Ich wäre sehr dankbar wenn ich endlich mal Pointer händeln könnte. Ich möchte mich damit etwas weiter entwickel... auch wenn jeder Pointer hasst.

@herbivore: Was meinst du mit falsch geklammert?

Gruss
Digi333

183 Beiträge seit 2006
vor 16 Jahren

Also ich persönlich hasse keine Pointer, ich find sie nur deplatziert im .NET-Enviroment, aber in C/C++ Code sind sie durchaus angebracht und sollten auch verwendet werden. Also wenn es nur eine Übung sein soll in der Du mit Pointern umgehen lernst nimm C oder C++, meine Empfehlung.

Gut Schuß
VuuRWerK 😉

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo digi333,

ok, nicht falsch geklammert, sondern der Multiplikator für den y-Wert fehlt.

Es ist doch so, dass x=1 und y=2 nicht das gleiche Pixel liefern soll, wie x=2 und y=1, was aber offensichtlich momentan der Fall ist.

herbivore

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 16 Jahren

Oh... da hast du Recht. Aber wie dann? Hab eben mehrmals versucht das Problem mathematisch mir klar zu machen... komm aber auf nichts gescheites.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo digi333,

der fehlende Multiplikator ist Bitmap.Stride.

Ansonsten verstehe ich echt dein Problem nicht, weil ja bei Bildern im Prinzip die Pixelwerte einfach nur hintereinander geschrieben werden, quasi so wie alle Zeichen einer Textdatei hintereinander stehen, wenn man sie in einen String einliest.

Am Zeilenende einer Textdatei gibt es die Besonderheit des Zeilentrenners. Denn braucht man bei den Pixeldaten nicht, weil alle Zeilen die gleiche Pixelanzahl haben und man so automatisch weiß, wann die Zeile zu Ende ist. Stattdessen gibt es bei Bildern die Besonderheit, dass die Zeilen mit 0-Bit aufgefüllt werden, bis die Länge einer Zeile ein Vielfaches von 4 Byte beträgt (Alignment). Diese Länge in Bytes wird durch Bitmap.Stride angegeben.

Die Anzahl der Pixel pro Bytes (genaugenommen die Anzahl von Bits pro Pixel) ist durch die Farbtiefe des Bildes festgelegt. Quasi so, wie bei Textdateien meist 8Bit pro Zeichen verwendet werden, bei ("echtem") Unicocode jedoch 16Bit.

Mehr ist es ja nicht. Und im Prinzip alles so wie bei Textdateien.

herbivore

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 16 Jahren

okay... das wußte ich nicht. Ich hab zwar immer mal wieder was gesehen von Stride, aber jetzt versteh ich was das sein soll. Ich muß aber zugeben, dass ich nicht damit umgehen kann. Ich hab gerade hier was darüber gelesen... jetzt bräuchte ich aber noch Praxis. Wie, wann und wo bau ich stride ein? Verändern sich damit nur die Schleifen oder muss ich Stride an die Schrittbreite anheften.

Danke für die Verbildlichung!

Gruss
Digi333

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo digi333,

das solltest du jetzt wirklich selbst hinbekommen.

herbivore

F
101 Beiträge seit 2007
vor 16 Jahren

ka, obs prob scho gelöst ist (zu faul gerade durchzulesen) aber.. warum probierst du das alles dynamisch zu zeichnen, wenn du die größe des Frames hast???

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 16 Jahren

Jetzt muß ich zugeben, dass ich wiederum nicht weiß was du meinst. Also die Größen des Frames können sich je nach Auflösung ändern. Wenn du aber eine andere Idee haben solltest... ich glaube nicht, dass es verboten ist andere Idee der Community zu verraten. =) Da ich Elektrotechniker auf Abwegen bin, hab ich leider nicht den Umblick für Alternativen.

Gruss
Digi333

F
101 Beiträge seit 2007
vor 16 Jahren

(wie gesagt.. hab mir den thread net ganz durchgelesen...)

Ich zeichne ein Bild in ein Frame (720x576). Und zwar sollen nur die Ecken weiße Blöcke haben.

so... dann wär das doch nich einfacher als

Rectangle rect = new Rectangle(new Point(0,0), new Size(720,576));

Rect mit (wie hier) schwarz füllen...

Rectangle leftTop = new Rectangle(new Point(0,0), new Size(50,50));
Rectangle rightTop = new Rectangle(new Point(670,526), new Size(50,50)); //670,526 == 720-50, 576-50
...

oder was versteh ich hier falsch???

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo fadass,

Rect mit (wie hier) schwarz füllen...

ja, du hast es falsch verstanden. Er hat schon oben geschrieben, dass er nicht FillRectangle verwenden kann und auch warum.

herbivore