Αbominable Δημοσ. 2 Σεπτεμβρίου 2010 Δημοσ. 2 Σεπτεμβρίου 2010 Χαίρετε, Διαβάζω κάποιον κώδικα από ένα Image Processing φίλτρο. > int rgb = inPixels[ioffset+ix]; a += f * ((rgb >> 24) & 0xff); r += f * ((rgb >> 16) & 0xff); g += f * ((rgb >> 8) & 0xff); b += f * (rgb & 0xff); Αλλά δυσκολεύομαι να καταλάβω την πράξη της παράστασης :: >((rgb >> 24) & 0xff) Καταλαβαίνω ότι το >> είναι δεξί shift κατά 24 bit θέσεις και το & είναι πράξη AND bitwise. Αλλά δεν είναι το ίδιο με αυτό ; >(rgb >> 24) Γιατί κάποιος να κάνει και την πράξη AND;
kagelos Δημοσ. 2 Σεπτεμβρίου 2010 Δημοσ. 2 Σεπτεμβρίου 2010 Για το rgb >> 24 δεν έχει νόημα εφόσον το rgb είναι 32 bit Για όλα τα υπόλοιπα έχει : μηδενίζει όλα τα bit που βρίσκονται αριστερά από τα δεξιά 8 (LSB)
taazz Δημοσ. 5 Σεπτεμβρίου 2010 Δημοσ. 5 Σεπτεμβρίου 2010 Για το rgb >> 24 δεν έχει νόημα εφόσον το rgb είναι 32 bitΓια όλα τα υπόλοιπα έχει : μηδενίζει όλα τα bit που βρίσκονται αριστερά από τα δεξιά 8 (LSB) Eχεις μπερδέψει την βουρτσα με την οδοντοπαστα. το RGB είναι μέχρι 24bit, 32bit είναι το RGBA όπου Α είναι το λεγόμενο άλφα κανάλι και κρατάει το πόσο διαφανές είναι το pixel αν και τα περισότερα προγράμματα αντιμετοπίζουν το αλφα κανάλι σαν χρώμα βάθους 1bit η πραγματικότητα είναι ότι υποστηρίζει 255 τιμές διάφανειας. Τώρα για το τι ρώτησε ο φίλος δεν γνωρίζω από C γρι οπότε υποθέτω ότι η κύλιση ΄χρησιμοποιήται για να απομονόσει τον κάθε χρώμα ξεχωριστα και να το πολλαπλασιάσει με f .
kagelos Δημοσ. 5 Σεπτεμβρίου 2010 Δημοσ. 5 Σεπτεμβρίου 2010 Eχεις μπερδέψει την βουρτσα με την οδοντοπαστα. το RGB είναι μέχρι 24bit, 32bit είναι το RGBA όπου Α είναι το λεγόμενο άλφα κανάλι και κρατάει το πόσο διαφανές είναι το pixel αν και τα περισότερα προγράμματα αντιμετοπίζουν το αλφα κανάλι σαν χρώμα βάθους 1bit η πραγματικότητα είναι ότι υποστηρίζει 255 τιμές διάφανειας. Τώρα για το τι ρώτησε ο φίλος δεν γνωρίζω από C γρι οπότε υποθέτω ότι η κύλιση ΄χρησιμοποιήται για να απομονόσει τον κάθε χρώμα ξεχωριστα και να το πολλαπλασιάσει με f . Καταρχάς πρόσεχε πως μιλάς και κατά δεύτερον αν είχες τις ελάχιστες απαραίτητες γνώσεις θα καταλάβαινες και εσύ όπως και ο Αbominable. Κανένας πολλαπλασιασμός δεν γίνεται. Αν το χρώμα είχε την τιμή : argb = AABBCCDD (έστω 32bit με Alpha component) και θέλαμε να πάρουμε το R, ο παραπάνω κώδικας κάνει το εξής : 1) rgb >> 16, άρα η τιμή γίνεται 0000AABB Τώρα πρέπει με κάποιον τρόπο να εξαλείψεις το AA, ώστε να πάρεις μόνο BB που είναι το component Red. Για αυτό κάνει AND με μόνο το LSB(yte) σεταρισμένο, ώστε τα αριστερότερα 24bit να γίνουν and με το 0 και άρα να μηδενιστούν. R = (rgb >> 16) & FF
taazz Δημοσ. 5 Σεπτεμβρίου 2010 Δημοσ. 5 Σεπτεμβρίου 2010 Καταρχάς πρόσεχε πως μιλάς και κατά δεύτερον αν είχες τις ελάχιστες απαραίτητες γνώσεις θα καταλάβαινες και εσύ όπως και ο Αbominable.Κανένας πολλαπλασιασμός δεν γίνεται. Αν το χρώμα είχε την τιμή : argb = AABBCCDD (έστω 32bit με Alpha component) και θέλαμε να πάρουμε το R, ο παραπάνω κώδικας κάνει το εξής : 1) rgb >> 16, άρα η τιμή γίνεται 0000AABB Τώρα πρέπει με κάποιον τρόπο να εξαλείψεις το AA, ώστε να πάρεις μόνο BB που είναι το component Red. Για αυτό κάνει AND με μόνο το LSB(yte) σεταρισμένο, ώστε τα αριστερότερα 24bit να γίνουν and με το 0 και άρα να μηδενιστούν. R = (rgb >> 16) & FF Ουπς. Ζητώ ταπεινα συγνώμη, τώρα να σου παραθέσω τις εντολές που μας έδωσε. a += f * ((rgb >> 24) & 0xff); r += f * ((rgb >> 16) & 0xff); g += f * ((rgb >> 8) & 0xff); b += f * (rgb & 0xff); Από αυτές παίρνω την πρώτη μόνο και διαβάζω A0 = A0 +(F *A1) όπου F φαντάζομαι είναι κάπιος λόγος που παίρνει τιμές απο το 0 μεχρι το 1 ομοίος και τις υπόλοιπες κάνω λάθος?
Evgenios1 Δημοσ. 5 Σεπτεμβρίου 2010 Δημοσ. 5 Σεπτεμβρίου 2010 Eχεις μπερδέψει την βουρτσα με την οδοντοπαστα. το RGB είναι μέχρι 24bit, 32bit είναι το RGBA όπου Α είναι το λεγόμενο άλφα κανάλι και κρατάει το πόσο διαφανές είναι το pixel αν και τα περισότερα προγράμματα αντιμετοπίζουν το αλφα κανάλι σαν χρώμα βάθους 1bit η πραγματικότητα είναι ότι υποστηρίζει 255 τιμές διάφανειας. Τώρα για το τι ρώτησε ο φίλος δεν γνωρίζω από C γρι οπότε υποθέτω ότι η κύλιση ΄χρησιμοποιήται για να απομονόσει τον κάθε χρώμα ξεχωριστα και να το πολλαπλασιάσει με f . RGB - RGBA Ειναι γενικη εικονα ενος pixel, αυτα που λες ειναι σε θεωρητικο επιπεδο και ειναι πολυ μακρια απο το πρακτικο επιπεδο στο οποιο αναφερεται ο TS. πχ οταν μιλαμε για bitmap format τοτε το pixel δεν ειναι rgb-rgba αλλα bgr-bgra και υπαρχουν μερικα αχρηστα byte τα οποια ειναι για padding, χαρης αυτα τα byte το pixel ειναι 4byte (32bit) ειτε εχει alpha ειτε οχι.
taazz Δημοσ. 5 Σεπτεμβρίου 2010 Δημοσ. 5 Σεπτεμβρίου 2010 RGB - RGBA Ειναι γενικη εικονα ενος pixel, αυτα που λες ειναι σε θεωρητικο επιπεδο και ειναι πολυ μακρια απο το πρακτικο επιπεδο στο οποιο αναφερεται ο TS. πχ οταν μιλαμε για bitmap format τοτε το pixel δεν ειναι rgb-rgba αλλα bgr-bgra και υπαρχουν μερικα αχρηστα byte τα οποια ειναι για padding, χαρης αυτα τα byte το pixel ειναι 4byte (32bit) ειτε εχει alpha ειτε οχι. Βασικά διαφονώ. Είναι αποδεκτώ ότι οι περισότερες βιβλιοθήκες διαχειρίζονται τα RGB RGBA με τον ιδιο τρόπο για λόγους ταχύτητας αλλά δεν είναι το ίδιο. Η διαχείριση RGB σε RGBA επίπεδο θα είχε απλά σταθερά τιμή στο A χωρίς πράξεις εάν το Α ήταν μόνο για padding όπως λες, πράγμα που δεν γίνεται στο παραπάνω παράδειγμα. Αυτό που εσύ ονομάζει θεωρεία προέρχεται από την πράξη και αν προσπαθήσεις να διαχειριστείς ένα 24bit bitmap ως 32 θα έχεις πολλαπλά προβλήματα χρώματος. Όσο για την εσωτερική αποικόνιση των χρωμάτων δεν έχει καμιά βασική διαφορά αφού η βασική παλέτα αποικόνησης χρωμάτων είναι η ιδια και η διαφορά όντως υπάρχει για λόγους που δεν ασχολήθηκα να αναλύσω αλλά υποθέτω ότι to big/small endian έχει τον κύριο λόγο για αυτή την αλλαγή και για λόγους ταχύτητας κράτησαν μια τέτια στάση. Αυτά φυσικά είναι τεχνικές λεπτομέρειες και δεν έχουν τπτ να κάνουν με το πρόβλημα που αναφαίρεται και το γεγονός ότι το να αναφέραισε σε ένα RGB bitmap ως 32bit είναι λάθος. Καθώ αποδηκνίεται εκ το γεγονότων το μόνο λάθος τους kagelos ήταν η λέξη RGB αντί για RGBA αφού πραγματικά οι εντολές είναι για 32bit bitmap. Ξεφεύγω όμως από το πρόβλημα όποτε εδω τέλος για εμένα το thread κάντε pm για παιρετέρω συζήτηση εάν θέλετε.
Evgenios1 Δημοσ. 5 Σεπτεμβρίου 2010 Δημοσ. 5 Σεπτεμβρίου 2010 μπλα μπλα Καθώ αποδηκνίεται εκ το γεγονότων το μόνο λάθος τους kagelos ήταν η λέξη RGB αντί για RGBA αφού πραγματικά οι εντολές είναι για 32bit bitmap. Μα δεν κανει λαθος . Εφοσον δεν ξερεις c (εσυ το ειπες) αρα δεν μπορεις να καταλαβεις την ερωτηση του TS ουτε και την απαντηση του kagelos. το rgb που λεει ο kagelos ειναι 32 bit, επειδη ο ts δηλωνει το pixel ως int (μεταβλητη με 32 bits).
taazz Δημοσ. 5 Σεπτεμβρίου 2010 Δημοσ. 5 Σεπτεμβρίου 2010 Μα δεν κανει λαθος . Εφοσον δεν ξερεις c (εσυ το ειπες) αρα δεν μπορεις να καταλαβεις την ερωτηση του TS ουτε και την απαντηση του kagelos.το rgb που λεει ο kagelos ειναι 32 bit, επειδη ο ts δηλωνει το pixel ως int (μεταβλητη με 32 bits). Όρημο πολύ όρημο. Αν έχεις καπια τεχνική λεπτομέρεια σε προκαλώ να την παραθέσης. Το ότι ο προγραματιστής δήλωσε μια μεταβλητή σαν 32bit δεν είναι τεχνική πληροφωρία είναι επιλογή ενος ατόμου. Τώρα που σκατά είναι το bozo bin σε αυτό το forum??
Evgenios1 Δημοσ. 5 Σεπτεμβρίου 2010 Δημοσ. 5 Σεπτεμβρίου 2010 Όρημο πολύ όρημο. Αν έχεις καπια τεχνική λεπτομέρεια σε προκαλώ να την παραθέσης. Το ότι ο προγραματιστής δήλωσε μια μεταβλητή σαν 32bit δεν είναι τεχνική πληροφωρία είναι επιλογή ενος ατόμου. Τώρα που σκατά είναι το bozo bin σε αυτό το forum?? Ok καταλαβα... εισαι για ignore list.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.