Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

point(x,y) in rgb-werte aufsplitten?
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Bimi



Anmeldungsdatum: 03.12.2007
Beiträge: 66

BeitragVerfasst am: 19.12.2007, 16:33    Titel: Antworten mit Zitat

dreael hat Folgendes geschrieben:
Aus gutem Grund sollte man, wenn man zwischen 24 bpp und 32 bpp in Windows unter "Systemsteuerung"/"Anzeige", "Einstellungen" wählen kann, der Variante 32 bpp den Vorzug geben, weil dort ein Pixel in einem Rutsch und Speicheradresse verarbeitet werden kann.

Sonst zum Titelthema und Performance: An und für sich wäre dies ein Stück weit auch ein Fall für Typ-Casting (in C/C++ mit dem bekannten Cast-Operator "(typ *)Ausdruck" abgedeckt, in QB die gesamte MKx$()/CVx()-Funktionenfamilie), d.h. man bildet den RGB-TYPE-Record genau so ab, dass die Byte-Farbkomponenten korrekt im Speicher liegen. Falls FreeBasic über C/C++-ähnliche Pointer verfügt, müsste Typen-Casting problemlos möglich sein.

Typencasting ist aber generell kein schöner Programmierstil, wenn das Ganze möglich portierbar auf unterschiedlichen Plattformen sein soll, weil man dort doch sehr stark plattformspezifische Implementationseigenschaften ausnutzt. An dieser Stelle sind die FreeBasic-Gurus sämtlicher Plattformen nun gefragt, ob sich POINT() 100% identisch auf jeder Plattform (Winodws, Linux, UNIX, Mac usw.) verhält und nicht etwa, dass auf der einen der Rot-Anteil das niederwertigste Byte belegt, während auf einer anderen Plattform der Blauanteil oder gar Alpha-Kanal dort liegt.


In C bietet sich die Verwendung einer UNION an:

Code:

#define RED 0x03
#define GREEN 0x02
#define BLUE 0x01
#deinfe ALPHA 0x00

typedef union _rgbvalue {
  unsigned integer intrgb;
  unsigned char brgb[4];
} RGBValue;

...

RGBValue pixel;

pixel.intrgb = <irgendein 32 Bit Integer>
pixel.brgb[RED] // rotanteil


...damit ist auch gewährleistet das die Bytes hintereinander im Speicher liegen und ich brauche nicht casten.

Die böse Falle dabei ist nur das viele Compiler auf einer 64 Bit Plattform für int nicht mehr 32, sondern 64 Bit vorsehen und damit diese Union kippen (hatte ich erst das Problem bei einer Portierung).

Solange FreeBasic nur unter DOS, Windows und Linux x86 läuft, existiert das Byteorderproblem nicht.

Des weiteren ist die Reihenfolge eines BP32 als RGBA fest gelegt.

Windows kennt intern kein 24bpp Modus, sondern nur 32bpp. 24 Bit wurden eingestellt um die Datenmenge für die Übertragung zur Graphikhardware um 25% zu reduzieren. Damals wurde der Alphakanal nicht verwendet und konnte einfach abgeschnitten werden. Das passiet auch nicht in Windows, sondern dem Treiber der Grafikkarte.
_________________
Rechtbehelf:

Rechschreibverfehlungen, Vergehen an der Deutschen Sprache sowie Stabwechselverbuchselungen unterliegen dem Urheberrecht, sind voll beabsichtigt und fördern das aufmerksame Lesen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 07.01.2008, 17:02    Titel: Antworten mit Zitat

Hmm.. ist wahrscheinlich nur ziemlich amateurhaft gedacht... aber ich stells mal als frage in den raum:

Ein Pixel hat bei 32bit farbtiefe 4byte.
in der Reihenfolge Rot, Grün, Blau, Alpha... Das haben wir ja alle schon mit der muttermilch gelernt happy

Wenn ich nun eine Addresse im Speicher zu einem Pixel kenne, dann kann ich diese Addresse per pointer auslesen. D.h. ich bekomme per pointer die startadresse im speicher wo ich mit der länge von 4byte den Farbwert wiederfinde.
Kann ich dann nicht mittels pointer hingehen und die einzelnen bytes aus dem speicher lesen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 07.01.2008, 17:14    Titel: Antworten mit Zitat

ja...
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz