Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

1

13.01.2015, 20:00

LibGdx Pixmap Color Format

Hi,

ich habe drei Byte Arrays, jeweils für Rot, Gelb und Blau, Wertebereich jeweils logischerweise 0-255 pro Pixel und Farbe.
Welches Farbformat bei LibGdx nimmt man da am besten? Ich hab mal RGB888. Aber die Farben wirken sehr komisch, vielleicht weil es ein 32Bit Format ist? Wenn ich die Farbwerte mit vier multipliziere und von 2^32-1 abziehe wirkt es besser, aber immer noch komisch. Was verwendet man da am besten? Transparenz benötige ich nicht.

Hier wäre mal mein bisheriger Code:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Pixmap pixmap = new Pixmap(400, 300, Format.RGB888);
        pixmap.setColor(Color.GREEN);
        int r, g, b;
        for (int y = 0; y < 300; y++)
        {
            String[] verktikal = serverMessage[y].split(";");
            for (int x = 0; x < 400; x++)
            {
                String[] farbwerte = verktikal[x].split(",");
                r = Integer.parseInt(farbwerte[0]);
                g = Integer.parseInt(farbwerte[1]);
                b = Integer.parseInt(farbwerte[2]);
                pixmap.drawPixel(x, y, Color.rgb888(r, g, b));
            }
        }
        screenshot = new Texture(pixmap);
        pixmap.dispose();


Schönen Gruß,
MitgliedXZY

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MitgliedXYZ« (13.01.2015, 20:13)


2

13.01.2015, 20:37

LibGdx verwendet nicht 0 bis 255 sondern 0 bis 1 als float.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

3

13.01.2015, 20:50

Okay, danke für die Information. Also RGB888 kann ich verwenden, aber ich muss float verwenden und die Werte durch 256 teilen, oder?
Das werde ich mal testen, ich finde es nur ärgerlich, dass die Methode Integer Werte annimmt, wenn diese doch dann so gut wie nutzlos sind, wenn es so nur pro Farbkanal zwei Zustände gibt :huh:

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

4

13.01.2015, 20:51

Außerdem will Pixmap.drawPixel die Farbe als RGBA8888.

Die Methode will laut Doku auch floats haben. Ich denke mal dass das einfach ohne Warnung implizit konvertiert wird.

5

13.01.2015, 20:58


Okay, danke für die Information. Also RGB888 kann ich verwenden, aber ich muss float verwenden und die Werte durch 256 teilen, oder?
Das werde ich mal testen, ich finde es nur ärgerlich, dass die Methode Integer Werte annimmt, wenn diese doch dann so gut wie nutzlos sind, wenn es so nur pro Farbkanal zwei Zustände gibt :huh:

Ja das Potential für unbemerkte Fehler und Missverständnise ist hier groß. Das liegt daran, dass Java automatisch Typumwandlungen vornimmt wie hier dargestellt ist. Durch 255 sollte reichen, da ja 255 = 1 sein soll.
Du musst auch darauf achten, dass du nicht einen int durch einen int teilst. System.out.println(100 / 75); würde 1 ausgeben.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

6

13.01.2015, 21:04

Das komische ist, es sieht immer noch falsch aus.
Nur ein kleiner Screenshot streifen, im Hintergrund ist VS geöffnet, das eigentlich weiß sein sollte und nicht hellblau.

C#-Quelltext

1
2
3
4
   float r = (float) Integer.parseInt(farbwerte[0]) / 255f;
             float g = (float) Integer.parseInt(farbwerte[1]) / 255f;
              float b = (float) Integer.parseInt(farbwerte[2]) / 255f;
                pixmap.drawPixel(x, y, Color.rgb888(r, g, b));

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

7

13.01.2015, 21:09

Vielleicht liegt es daran, dass drawPixel einen Alphawert erwartet. Eventuell steht jetzt ein Farbwert dort, wo eigentlich Alpha sein soll.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

13.01.2015, 21:13

Ja, so sieht es aus.
Alle Kanäle sind um eins verschoben und Rot fehlt.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

9

14.01.2015, 15:32

Oh danke. Jetzt hat die Textur die richtigen Farben. ^^
Aber wieso wird bei drei Übergabewerten zwei Farben und der Alphakanal verwendet, dass muss doch zu Verwirrungen führen.

Werbeanzeige