Laden...

Point[] aus Byte[] mit Werten für Farben, die sich Schwarz am ehesten annähern

Erstellt von ByteDevil vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.475 Views
ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 5 Jahren
Point[] aus Byte[] mit Werten für Farben, die sich Schwarz am ehesten annähern

Hallo,

Ich habe einen 1 Dimensionalen byte[] welcher die Pixelwerte eines Bildes beinhaltet. Jeder Pixel ist 4 bytes lang und besteht aus je einem Byte für rot, grün, blau und alpha. Das Bild absolut monochom, dh. keine Graustufen sondern entweder ist ein Pixel schwarz (0, 0, 0, 255) oder weiß (255, 255, 255, 255). Nun möchte ich einen Point[] haben, welcher die x und y Koordinaten sämtlicher schwarzen Bildpunkte beinhaltet...aber (und das ist der Teil an dem ich scheitere) ich möchte nur n Punkte haben welche die schwarzen Bereiche im Bild möglichst gut annähern. n ist dabei kleiner als die Anzahl der schwarzen Punkte im Bild.
Ich bin ehrlich gesagt etwas ratlos und meine Versuche sehen immer sehr verzerrt aus weil ich wohl nicht berücksichtigt habe das ich ja auch ganze Zeilen auslassen muss. Komme aber nicht so recht auf die richtige Formel. Kann mir jemand von euch helfen?

So schleife ich sämtliche Pixel des Arrays durch:


int stride = width * 4;
for (int y = 0; y < height; y++)
    for (int x = 0; x < width; x++)
    {
        int index = y * stride + 4 * x;
        // array[index] <- Rot
        // array[index + 1] <- Grün
        // array[index + 2] <- Blau
        // array[index + 3] <- Alpha
     }
T
2.224 Beiträge seit 2008
vor 5 Jahren

Warum verwendest du keine fertige Kapselung wie die Color Klasse oder machst dir selbst eine eine Container Klasse?
Es mit einem Byte Array zu machen ist hier eher umständlich und macht dir jetzt schon Probleme.
Hier könntest du einfach auf die Properties der Color Klasse für R/G/B/A zugreifen und brauchst nur noch eine Liste als Container pro Pixel.
Sinnvoller wäre es aber auch noch eine Pixel Klasse anzulesen mit der entsprechenden Position und Farbe, dies dürfte dann das zeichnen leichter machen.


public class Color
{
    public byte Red{ get; set; }

    public byte Green{ get; set; }

    public byte Blue{ get; set; }

    public byte Alpha{ get; set; }
}

public class Pixel
{
    public uint X { get; set; }

    public uint Y { get; set; }

    public Color Color { get; set; }
}

public void Draw(List<Pixel> pixels)
{
    foreach(Pixel pixel in pixels)
    {
        // ToDo:
        // Pixel zeichnen
    }
}

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 5 Jahren

Hallo T-Virus,

die Farben an sich interessieren mich danach nicht mehr und ich möchte auch nicht direkt neu zeichnen. Ich brauche die Positionen weil ich mehrere kleine Punkte habe (n viele) die durch die Gegend fliegen. Habe ich nun alle Points die ich brauche, möchte ich sie nur noch auf die Fläche Transformieren auf der sich die Punkte bewegen und dann sollen sie dort hin schweben. Das funktioniert auch prima..brauche nur noch den Point[] 😕

Den bytearray kriege ich von BitmapImage.CopyPixels(). Muss auch nicht unbedingt auf alle Farbwerte prüfen...ist rot schon 0, sind es die anderen auch. Ansonsten möchte ich den Pixel nicht in dem Point[] haben.

C
2.121 Beiträge seit 2010
vor 5 Jahren

Ich sehe eine Überschrift, eine Beschreibung und eine Antwort, von denen ich jeweils den Bezug zueinander vermisse 😃
Worum geht es denn letztendlich?

Was bedeutet durchschleifen?
Was soll uns das mit den ausgelassenen Zeilen sagen?
Geht es darum herauszufinden wie du einen größeren schwarzen Bereich im Bild durch einen einzigen Punkt darstellen kannst?

2.207 Beiträge seit 2011
vor 5 Jahren

Hallo ByteDevil,

ich habe den Titel mal geändert, so dass er sprechender ist. Nach bestem Wissen und Gewissen. Falls dir etwas treffenderes einfällt, ändere den Titel bitte entsprechend.

Gruss

Coffeebean

T
2.224 Beiträge seit 2008
vor 5 Jahren

@ByteDevil
Dann ist mir der Zusammenhang deines Codes zu dem Problem niht ganz klar.
Wenn es nur darum geht, deine Pixel zu verschieben, dann passt dein Code nicht.
Und selbst dann wäre eine saubere Kapselung schon ein Fortschritt um deinen Code sauber zu bekommen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

5.658 Beiträge seit 2006
vor 5 Jahren

Hi ByteDevil,

Diese Codezeile solltest du mal überprüfen:

int stride = width * 4;

Die Größe des Strides hängt vom Bildformat ab, und das liest man normalerweise aus der Bilddatei aus.

Weeks of programming can save you hours of planning