Bilder mit Farbpalette, aber ohne Farbpalette

  • Hallo!

    Hätte eine Frage an die R-Basic-Programmierer.
    Habe eine Grafik aus GeoDraw per Zwischenablage in eine Bitmap eingefügt. Nun möchte ich die Farben in dieser Bitmap bestimmen. Allerdings funktioniert der Aufruf getPaletteEntry() nicht. Es kommt die Meldung, es gäbe keine Palette.
    Im Handbuch (Objekt-HB 9) steht dazu:

    Zitat

    Wenn die Bitmap keine eigene Palette hat, nutzt das System die GEOS-Standard-Palette. Dann kann R-BASIC die Farben nicht ändern.


    Aber das ist doch unbefriedigend! Denn:

    • Wie erfahre ich denn nun die Farben? Ist irgendwo die Geos-Standard-Palette definiert?
    • Ich will ja die Farben nicht ändern, sondern nur abfragen! Der Funktionsname beginnt ja auch mit get.


    Hat jemand dafür eine Lösung?
    Herzlichen Dank!

  • Mir fällt nur die „Kleindöfchen-Variante“ ein, über alle Pixel zu iterieren und deren RGB-Farbwerte einzusammeln. Oder Du vertraust auf die Doku und nimmst die Geos-Farbpalette als (vollständig) benutzt an.

    There are two rules in life:
    1. Never give out all of the information.

  • Ohne jetzt noch mal in den Code geschaut zu haben: Wenn Das Bild keine Palette hat, dann nutzt es die GEOS Farbpalette, weil GEOS nur die 8-Bit Werte für jedes Pixel zu sehen bekommt. Natürlich ist die Palette "irgendwo" definiert, konkret in der Datei color.h. Das sind die 16 Standardfarben, Grauwerte, ein kleiner unbenutzer Bereich und ein 6x6x6-RGB-Farbwürfel. Daraus habe ich mir für R-BASIC die Standard-Farben gebastelt, und den Funktionen RedOf() usw. spendiert.

    Wenn du wissen, willst, welche davon wirklich vorkommen, bleibt dir nur Jörgs Variante.

    Gruß
    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Dank Euch erstmal.

    Hat vielleicht jemand die ominöse color.h griffbereit und könnte sie mir bitte schicken? Danke schön :) .

    Ich wollte ja das Bild durchgehen, mit der einzigen Variante, die ich (gerade) kenne:
    1) Jede Bildzeile ins VRAM holen
    2) VRAM durchlaufen. Jedes Byte ist ein Pixel. Byte-Wert ist der Index auf die Farbpalette, auf die ich keinen Zugriff habe ...

    Salute!

  • Jedes Byte ist ein Pixel. Byte-Wert ist der Index auf die Farbpalette, auf die ich keinen Zugriff habe ...


    Doch: RedOf() GreenOf(), BlueOf() - ist allerdings nicht so elegant oder gar flink.
    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.


  • Doch: RedOf() GreenOf(), BlueOf() - ist allerdings nicht so elegant oder gar flink.
    Rainer

    Das klappt wirklich! Und ist auch, wie versprochen, langsam.

    Wie funktioniert das? Hast du in RB die Geos-Farbpalette hinterlegt? Oder greifst du auf eine SDK-Funktion zu, die den entsprechenden Wert zurückliefert?


    PS: Und danke, Konstantin, für die color.h – mal sehen, was ich damit noch machen kann ...

  • In GPixed mache ich es so: Ist keine Palette zum Bild verfügbar, so gehe ich automatisch von der Geos-Standardpalette aus. Ich erstelle dafür in einer Prozedur ein neues Bitmap-Objekt mit Palettenflag und lese dort die PaletteEntries einfach in mein globales Palettenarray aus.

    Mario

  • In GPixed mache ich es so: Ist keine Palette zum Bild verfügbar, so gehe ich automatisch von der Geos-Standardpalette aus. Ich erstelle dafür in einer Prozedur ein neues Bitmap-Objekt mit Palettenflag und lese dort die PaletteEntries einfach in mein globales Palettenarray aus.
    Mario

    Hallo Mario!
    Danke für Deine Anmerkung. So ähnlich hatte ich mir das auch schon überlegt. Aber dann hatte ich keine Lust, dafür extra ein eigenes Bitmap-Objekt im UI-Code anzulegen. Vielleicht kann man das aber auch mit RB-Code dynamisch erzeugen? Das habe ich aber noch nie probiert und wüßte spontan nicht aus dem Kopf, wie das ginge. Wie machst Du das? Auch Beispiel-Code ist willkommen ;) .

    Sebastian

  • Hallo Sebastian,

    BmWork ist hier ein statisches BitmapContent aus dem UI-Code - hier kannst du aber ein beliebiges Objekt aus dem UI-Code nehmen. Macht die Funktion aber leider nicht ganz unabhängig. Evtl. gibt es eine elegantere Lösung.


    Mario

  • Hallo,
    sebi: Ja, ich hab ein R-BASIC eine Palette hinterlegt. Das ist auch nicht kompliziert, weil die Standardpalette sehr systematisch aufgebaut ist, siehe oben. Eine SDK-Funktion, die Standard-Palette auszulesen kenne ich nicht.
    Mario: Es gibt die Routinen CreatObjBlock() und DestroyObjBlock().

    Die Varinate von Mario finde ich sehr clever und sie wird wahrscheinlich die schnellste sein. Allerdings schaftt es Sebi bestimmt, eine Funktion zu schreiben, die die Palettenwerte ausrechnet. DATA-Zeilen wären jetzt meine letzte Wahl.

    Gruß
    Rainer

    P.S. Das Forum meint: "Die Datei StdPalette.goh hat eine ungültige Dateiendung." Deswegen als Text :(

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Habe mich nun mit der Geos-Systemfarbpalette beschäftigt und mich entschieden, die Palette fix zu definieren.
    Ich verwende ja bereits eine LIbrary, wo ich eine Vielzahl von Farbpaletten definiert habe. Da habe die Geos-Palette hinzugefügt.
    So kann ich die Geos-Palette wie alle anderen Paletten mit einem Funktionsaufruf einfach erstellen.

    Danke und Grüße!