Άλφα κανάλια: αποθήκευση, επεξεργασία, φόρτωση επιλογών, λογικές λειτουργίες. κανάλια άλφα στο photoshop

Τα κανάλια Alpha είναι ένα άλλο είδος καναλιών που υπάρχουν στο Photoshop. Έχουν σχεδιαστεί για να αποθηκεύουν το επιλεγμένο τμήμα για περαιτέρω χρήση ή επεξεργασία.

Ως αποτέλεσμα της διαδικασίας - σύζευξη άλφα, έλαβαν ένα τέτοιο όνομα. Αυτή είναι η διαδικασία με την οποία μια εικόνα με μερικώς διαφανείς περιοχές μπορεί να συνδυαστεί με μια άλλη εικόνα, η οποία συμβάλλει στην ανάπτυξη ειδικών εφέ, καθώς και ψεύτικο φόντο.

Είναι δυνατό να αποθηκεύσετε τις εκχωρημένες θέσεις για μια τέτοια τεχνολογία. Μπορεί να χρειαστεί πολύς χρόνος και υπομονή για να το σχηματίσετε, ειδικά όταν χρειάζεται να δημιουργήσετε μια περίπλοκη επιλογή, η οποία μπορεί να διαρκέσει μερικές ώρες. Κατά τη διάρκεια της αποθήκευσης του εγγράφου ως αρχείο PSD, το κανάλι άλφα βρίσκεται ανά πάσα στιγμή στη θέση σας.

Η πιο ευρέως χρησιμοποιούμενη μέθοδος χρήσης ενός καναλιού άλφα είναι ο σχηματισμός μιας μάσκας στρώματος, η οποία χρησιμοποιείται ακόμη και όταν δημιουργείται η πιο λεπτομερής επιλογή, η οποία δεν μπορεί να επιτευχθεί με καμία άλλη μέθοδο.

Σημαντικό να θυμάστε
Η εργασία με το βραχυπρόθεσμο κανάλι άλφα πραγματοποιείται όταν χρησιμοποιείτε το εργαλείο Γρήγορης μάσκας.

Τις περισσότερες φορές θεωρείται ως ασπρόμαυρη μεταμόρφωση του τμήματος που αναθέσατε. Εάν δεν αλλάξετε τις ρυθμίσεις του προγράμματος, τότε στην τυπική ρύθμιση, μια απροσδιόριστη περιοχή της εικόνας επισημαίνεται με μαύρο χρώμα, δηλαδή προστατεύεται ή κρύβεται, αλλά θα τονίζεται με λευκό.

Παρόμοια με τη μάσκα στρώσης, οι γκρι τόνοι υποδεικνύουν ακριβώς τις επιλεγμένες, αλλά εν μέρει, θέσεις και γίνονται ημιδιαφανείς.

Για να δημιουργήσετε, ακολουθήστε τα εξής βήματα:

Επιλέγω "Δημιουργία καναλιού - Δημιουργία νέου καναλιού". Αυτό το κουμπί σάς επιτρέπει να βασίσετε το Alpha 1 - ένα καθαρό κανάλι άλφα, το οποίο είναι μαύρο, επειδή είναι εντελώς άδειο.

Για να επιλέξετε μια περιοχή, πρέπει να επιλέξετε μια συσκευή "Βούρτσα"με λευκή μπογιά. Είναι σαν να σχεδιάζετε τρύπες σε μια μάσκα για να μπορείτε να βλέπετε, να τονίζετε επίσης τι κρύβεται από κάτω.


Εάν πρέπει να δημιουργήσετε μια μαύρη επιλογή και να κάνετε το υπόλοιπο πεδίο λευκό, τότε ορίστε τον επιλογέα του πλαισίου διαλόγου σε - "Επισημασμένες περιοχές".

Για να επεξεργαστείτε το κανάλι άλφα ενώ εκτελείται η λειτουργία "Γρήγορη μάσκα"πρέπει να αλλάξετε το χρώμα σε αυτή τη θέση, αλλά και τη διαφάνεια. Μόλις οι ρυθμίσεις είναι σωστές, κάντε κλικ στο Εντάξει.

Μπορείτε να κάνετε μια επιλογή επιλέγοντας μια εντολή στο μενού - Επιλογή - Αποθήκευση επιλογής.
Μπορείτε να κάνετε μια επιλογή κάνοντας κλικ στο - Αποθήκευση επιλογής στο κανάλι

Κανάλια Alpha. Αλλαγή

Μόλις δημιουργηθεί, ένα τέτοιο κανάλι μπορεί να ρυθμιστεί με τον ίδιο τρόπο όπως μια μάσκα στρώματος. Χρήση φωτιστικού "Βούρτσα"ή άλλη συσκευή που χρησιμεύει για να τονίσει ή να αλλάξει, μπορείτε να σχεδιάσετε πάνω της.

Εάν θέλετε να πάρετε μια συσκευή για επιλογή, πρέπει να επιλέξετε την εντολή που στο μενού - Επεξεργασία - Συμπλήρωση.

Η λίστα θα ανοίξει - Χρήση.

Μπορείτε να επιλέξετε μαύρα ή λευκά χρώματα ανάλογα με την εργασία - προσθέστε στο απαιτούμενο μέρος ή αφαιρέστε από αυτό. Στην τελευταία περίπτωση, οι υπογραμμισμένες περιοχές γίνονται λευκές, οι υπόλοιπες γίνονται μαύρες.

Για να εμφανίσετε πληροφορίες στο Photoshop αντίθετα, δηλαδή σε μαύρο χρώμα, πρέπει να κάνετε διπλό κλικ στη μικρογραφία. Θα εμφανιστεί ένα πλαίσιο διαλόγου - Επιλογές και, στη συνέχεια, ρυθμίστε το διακόπτη σε - Επιλεγμένες περιοχές. Μετά από αυτό, τα χρώματα της μάσκας θα αλλάξουν στην εφαρμογή.

Η επεξεργασία του δικού σας καναλιού alpha γίνεται χρησιμοποιώντας τη λειτουργία - Γρήγορη μάσκα. Πρέπει να κάνετε κλικ στο εικονίδιο για την εμφάνιση του σύνθετου καναλιού.

Στη συνέχεια, το πρόγραμμα θα δημιουργήσει μια κόκκινη επικάλυψη στην εικόνα. Αλλά αν επεξεργάζεστε μια εικόνα που είναι κυρίως κόκκινη, τίποτα δεν θα φαίνεται μέσα από τη μάσκα. Στη συνέχεια απλώς αλλάξτε το χρώμα επικάλυψης σε κάτι άλλο.

Μπορείτε να χρησιμοποιήσετε φίλτρα που εφαρμόζονται στο κανάλι άλφα παρόμοια με τη χρήση μάσκας στρώσης.
Το πιο σημαντικό: Γκαουσιανή θολούρα, το οποίο σας επιτρέπει να μαλακώσετε τις άκρες όταν επιλέγετε ένα ελαφρώς ασαφές μέρος. εγκεφαλικά επεισόδια, το οποίο χρησιμοποιείται για τη δημιουργία μοναδικών άκρων στη μάσκα.

Μετακίνηση

Όταν σταματήσετε να το χρησιμοποιείτε ή αποφασίσετε να ξεκινήσετε να εργάζεστε με ένα νέο κανάλι, μπορείτε να διαγράψετε το ανεπιθύμητο κανάλι.
Σύρετε το κανάλι στο παράθυρο - Διαγραφή τρέχοντος καναλιού - Διαγράφω, δηλαδή σε ένα μικροσκοπικό καλάθι αχρήστων. Μπορείτε να κάνετε κλικ στο ίδιο κουμπί και αφού εμφανιστεί η επιβεβαίωση της διαγραφής, κάντε κλικ στο κουμπί Ναί.

Όλα όσα μάθατε για τα κανάλια άλφα σε αυτό το άρθρο θα σας βοηθήσουν να δημιουργήσετε επαγγελματικά έργα τέχνης στο Photoshop.

Αυτή η τεχνική χρησιμοποιείται συχνά για την επεξεργασία εικόνας πολλαπλών περασμάτων και στη συνέχεια για το συνδυασμό αυτών των τμημάτων σε μια ενιαία δισδιάστατη εικόνα που προκύπτει. Έτσι, το κανάλι άλφα αντιπροσωπεύει κενό χώρο ή απλώς διαφάνεια.

Υπολογισμός του προκύπτοντος χρώματος

Ο υπολογισμός της φωτεινότητας του εικονοστοιχείου που προκύπτει μετά την υπέρθεση δύο εικονοστοιχείων το ένα πάνω στο άλλο εκτελείται από τον τύπο

αποτέλεσμα = Ιστορικό * (1 Αλφα ) + Σε πρώτο πλάνο * Αλφα

ή (άλλη σημειογραφία)

αποτέλεσμα = Ιστορικό + (Σε πρώτο πλάνοΙστορικό) * Αλφα Ιστορικό - φωτεινότητα εικονοστοιχείων φόντου, Σε πρώτο πλάνο - φωτεινότητα του υπερτιθέμενου pixel, Αλφα - Αδιαφάνεια του εφαρμοζόμενου pixel.

Το δεύτερο λήμμα που δίνεται δείχνει την ακόλουθη σημασία: νόημα Αλφαδείχνει τη σχετική θέση στο τμήμα [ Ιστορικό..Σε πρώτο πλάνο].

Χρήση στη σχεδίαση ιστοσελίδων, υποστήριξη για PNG και άλλες μορφές

Ένα κανάλι άλφα, γνωστό και ως κανάλι μάσκας, είναι απλώς ένας τρόπος να συνδυαστεί η μεταβατική διαφάνεια με μια εικόνα. Η μορφή GIF υποστηρίζει απλή δυαδική διαφάνεια (όταν οποιοδήποτε pixel μπορεί να είναι είτε εντελώς διαφανές είτε εντελώς αδιαφανές). Η μορφή PNG επιτρέπει 254 ή 65534 επίπεδα μερικής διαφάνειας.

Η χρήση καναλιού άλφα είναι επίσης δυνατή στον Καμβά , για παράδειγμα για να κάνετε ημιδιαφανή σχήματα ή εικόνες.


Τι είναι ένα κανάλι;

Αρχικά, ας μιλήσουμε για τα κανάλια γενικά. Ανάλογα με τη λειτουργία χρώματος που χρησιμοποιείται, η εικόνα έχει είτε 3 είτε 4 κανάλια. Εάν χρησιμοποιείτε τη λειτουργία RGB (η οποία χρησιμοποιείται για οτιδήποτε εμφανίζεται στην οθόνη), η εικόνα έχει 3 κανάλια: κόκκινο, πράσινο και μπλε. Εάν χρησιμοποιείτε τη λειτουργία CMYK (χρησιμοποιείται για εκτύπωση), η εικόνα έχει 4 κανάλια. Οι πληροφορίες σε αυτά τα κανάλια υποδεικνύουν πόσο από κάθε ένα από τα βασικά χρώματα πρέπει να ληφθεί για να δημιουργηθεί το επιθυμητό (λουλακί, πορτοκαλί, ροζ κ.λπ.). Αυτά τα κανάλια είναι στάνταρ για οποιαδήποτε έγχρωμη εικόνα.

Τι είναι ένα κανάλι άλφα;

Ένα κανάλι άλφα είναι ένα πρόσθετο κανάλι που μπορεί να προστεθεί σε ένα σχέδιο. Περιέχει πληροφορίες σχετικά με τη διαφάνεια του σχεδίου και ανάλογα με τον τύπο του άλφα, μπορεί να περιέχει διαφορετικά επίπεδα διαφάνειας. Γενικά, το κανάλι άλφα καθορίζει τη διαφάνεια όλων των άλλων καναλιών. Προσθέτοντας ένα κανάλι άλφα σε ένα σχέδιο, ελέγχετε τη διαφάνεια του κόκκινου καναλιού, του πράσινου και του μπλε καναλιού.

Υπάρχουν δύο τύποι καναλιών άλφα: το προπολλαπλασιασμένο και το άμεσο άλφα. Ο τύπος που χρησιμοποιείται εξαρτάται από το λογισμικό που χρησιμοποιείται:

  • Προπολλαπλασιασμένο (χρησιμοποιείται στο Photoshop)
  • απευθείας άλφα
προπολλαπλασιασμένο άλφα
Σε αυτήν την περίπτωση, το χρώμα της εικόνας αναμιγνύεται με το χρώμα του φόντου. Το άλφα αλλάζει από εντελώς αδιαφανές σε εντελώς διαφανές.

απευθείας άλφα
Σε αυτήν την περίπτωση, τα χρώματα της εικόνας και του φόντου παραμένουν αμετάβλητα, αλλάζει μόνο το κανάλι άλφα.

Τύποι αρχείων που υποστηρίζουν alpha

Οι ακόλουθοι τύποι αρχείων υποστηρίζουν το alpha:

  • PSD (Photoshop)
  • GIF (άλφα 1 bit)
Τα TIFF, TGA, PNG, PSD και GIF υποστηρίζουν alpha, αλλά στην πραγματικότητα, μόνο PNG και GIF χρησιμοποιούνται σε εφαρμογές και ιστότοπους. Το Gif, ωστόσο, χρησιμοποιεί ένα ειδικό είδος άλφα 1 bit. Αντί να περιέχει επίπεδα διαφάνειας, μπορεί μόνο είτε να ενεργοποιήσει είτε να απενεργοποιήσει πλήρως τη διαφάνεια. Αυτό σημαίνει ότι τα pixel σε μια εικόνα GIF μπορεί να είναι είτε εντελώς διαφανή είτε εντελώς αδιαφανή. Το PSD είναι μια μορφή Photoshop που υποστηρίζεται από τις περισσότερες εφαρμογές της Adobe.

Πώς χρησιμοποιείται το κανάλι άλφα;

Το κανάλι άλφα χρησιμοποιείται για διαφορετικούς σκοπούς. Σε πολλές περιπτώσεις, απαιτείται η υπέρθεση μιας εικόνας σε φόντο ή άλλη εικόνα. Μπορείτε να το δείτε συνεχώς σε προγράμματα επεξεργασίας γραφικών όπως το Photoshop. Όταν ανοίγετε μια εικόνα και τοποθετείτε μια άλλη εικόνα πάνω από την πρώτη, το Photoshop χρησιμοποιεί αυτόματα την τιμή άλφα για να αποδώσει σωστά τη ζωγραφική που προκύπτει. Σε άλλες περιπτώσεις, απαιτείται άλφα, ώστε στοιχεία όπως οι σκιές να μπορούν να αποδοθούν σωστά σε διάφορες εικόνες φόντου. Το Photoshop χρησιμοποιεί επίσης κανάλια άλφα για μάσκες και επιλογές. Τα κανάλια άλφα μπορούν επίσης να χρησιμοποιηθούν για την εμφάνιση ημιδιαφανών εικόνων πάνω από φόντο, εικόνες και ακόμη και άλλες ημιδιαφανείς εικόνες.

Ποιο είναι το πλεονέκτημα των καναλιών άλφα;

Το κύριο πλεονέκτημα των καναλιών άλφα είναι η οπτική τους απήχηση. Χωρίς κανάλια άλφα, οι στοιβαγμένες εικόνες δεν μπορούν να αντικατασταθούν και να έχουν οδοντωτές άκρες. Δεν φαίνεται καλό. Ένα άλλο πλεονέκτημα είναι η ταχύτητα. Όταν αποθηκεύετε μια εικόνα με ένα κανάλι άλφα, τα επίπεδα διαφάνειας αποθηκεύονται μαζί του. Στη συνέχεια, μπορείτε να τοποθετήσετε αυτήν την εικόνα πάνω από οποιαδήποτε άλλη και η εμφάνιση της εικόνας θα διατηρηθεί. Αυτό σας εξοικονομεί χρόνο. μπορείτε να τοποθετήσετε την εικόνα ακριβώς πάνω από το φόντο χωρίς να χρειάζεται να την αποθηκεύσετε ακριβώς στο επιθυμητό σημείο πάνω από το επιθυμητό φόντο.

Σημειώστε ότι για να διατηρηθούν οι σκιές στο GIF, πρέπει να αφήσουμε λίγο από το χρώμα της εικόνας ματ, ενώ στο PNG μένουν μόνο ημιδιαφανή pixel.

: άλφα κανάλια. Η αποστολή τους είναι να αποθηκεύουν επιλεγμένες περιοχές, ώστε να μπορείτε να τις χρησιμοποιήσετε ή να τις επεξεργαστείτε αργότερα.

Παίρνουν το όνομά τους από μια διαδικασία που ονομάζεται άλφα σύζευξη, όταν μια μερικώς διαφανής εικόνα (μια με διαφανείς περιοχές) συνδυάζεται με μια άλλη εικόνα - έτσι οι σκηνοθέτες δημιουργούν ειδικά εφέ και ψεύτικα φόντα.

Αυτό είναι ισχυρό πράγμα επειδή η ίδια τεχνολογία το επιτρέπει. Μπορεί να χρειαστεί πολύς χρόνος για να το δημιουργήσετε, μπορεί να μην έχετε αρκετή αντοχή εάν πρόκειται για μια ιδιαίτερα περίπλοκη επιλογή, η οποία μερικές φορές διαρκεί αρκετές ώρες. Όσο αποθηκεύετε το έγγραφο ως αρχείο PSD, το κανάλι άλφα θα είναι πάντα στη θέση του στη διάθεσή σας.

Ο πιο συνηθισμένος τρόπος για να εφαρμόσετε ένα κανάλι άλφα είναι να δημιουργήσετε μια μάσκα επιπέδου. Αυτό συμβαίνει επειδή μπορούν να χρησιμοποιηθούν για τη δημιουργία απίστευτα λεπτομερών επιλογών που δεν μπορούν να ληφθούν με κανέναν άλλο τρόπο.

Δημιουργήστε ένα κανάλι άλφα

Είναι χρήσιμο να το σκεφτείτε ως μια ασπρόμαυρη αναπαράσταση της επιλογής σας. Εάν δεν αλλάξετε τις ρυθμίσεις του προγράμματος, η μαύρη περιοχή θα υποδεικνύει το μη επιλεγμένο τμήμα της εικόνας, που ονομάζεται επίσης προστατευμένο ή κρυφό μέροςκαι λευκό - το επιλεγμένο μέρος. Και, όπως στο , οι κλίμακες του γκρι αντιπροσωπεύουν μερικώς επιλεγμένα μέρη, π.χ. Αυτό σημαίνει ότι είναι μερικώς διαφανή.

Για να δημιουργήσετε, κάντε ένα από τα παρακάτω:

  • Κάνοντας κλικ στο κουμπί Δημιουργία νέου καναλιού. Κάνοντας κλικ σε αυτό το κουμπί δημιουργείται ένα κενό κανάλι άλφα που ονομάζεται Alpha 1. Είναι εντελώς μαύρο επειδή είναι κενό. Για να δημιουργήσετε μια επιλογή, επιλέξτε και ζωγραφίστε πάνω της με λευκό (σκεφτείτε αυτή τη διαδικασία σαν να σχεδιάζετε μια τρύπα στη μάσκα για να μπορείτε να δείτε και επομένως να επιλέξετε τι υπάρχει από κάτω). Εάν κάνετε κλικ σε αυτό το κουμπί ενώ κρατάτε πατημένο το πλήκτρο Alt, μπορείτε να εκχωρήσετε ένα όνομα.
  • Επιλέγοντας την εντολή Νέο κανάλι. Επιλέγοντας αυτήν την εντολή θα ανοίξει ένα παράθυρο διαλόγου όπου μπορείτε να δώσετε ένα όνομα στο πρόγραμμα και να πείτε στο πρόγραμμα πώς να εμφανίζει τις πληροφορίες.

Εάν προτιμάτε η επιλογή να είναι μαύρη και οτιδήποτε άλλο να είναι λευκό, ορίστε το κουμπί επιλογής στο πλαίσιο διαλόγου σε Επιλεγμένες περιοχές. Εάν θέλετε να επεξεργαστείτε το κανάλι άλφα χρησιμοποιώντας τη λειτουργία Γρήγορης μάσκας, το χρώμα και η διαφάνεια μπορούν να αλλάξουν εδώ. Όταν έχετε ορίσει όλες τις ρυθμίσεις όπως απαιτείται, κάντε κλικ στο OK.

  • Δημιουργώντας μια επιλογή και στη συνέχεια επιλέγοντας την εντολή μενού Επιλογή => .
  • Δημιουργώντας μια επιλογή και κάνοντας κλικ στο κουμπί Αποθήκευση επιλογής ως καναλιού. Μοιάζει με κύκλο εγγεγραμμένο σε τετράγωνο.

Αλλαγή καναλιών άλφα

Μόλις δημιουργηθεί, μπορείτε να το προσαρμόσετε με τον ίδιο τρόπο όπως μια μάσκα επιπέδου. Μπορείτε να σχεδιάσετε πάνω του με το εργαλείο Brush ή να χρησιμοποιήσετε οποιοδήποτε από τα εργαλεία επιλογής για να το τροποποιήσετε. Εάν θέλετε να χρησιμοποιήσετε το εργαλείο επιλογής, επιλέξτε την εντολή μενού Επεξεργασία => Συμπλήρωσηκαι επιλέξτε μαύρο ή λευκό από την αναπτυσσόμενη λίστα Χρήση ανάλογα με το τι θέλετε να κάνετε, προσθέστε ή αφαιρέστε από την επιλογή (οι επιλεγμένες περιοχές είναι λευκές και όλα τα άλλα είναι μαύρα).

Εάν πρέπει να κάνετε το Photoshop να εμφανίζει πληροφορίες αντίστροφα, όπως να τις εμφανίζετε σε μαύρο αντί για λευκό, κάντε διπλό κλικ στη μικρογραφία. Στο πλαίσιο διαλόγου Επιλογές που εμφανίζεται, ορίστε το κουμπί επιλογής σε Επιλεγμένες περιοχές. Όταν το κάνετε αυτό, το πρόγραμμα θα αλλάξει τα χρώματα της μάσκας.

Μπορείτε επίσης να επεξεργαστείτε το κανάλι άλφα σας με τη λειτουργία Γρήγορης μάσκας. Για να το κάνετε αυτό, κάντε κλικ στο εικονίδιο ορατότητας του σύνθετου καναλιού. Όταν το κάνετε αυτό, το πρόγραμμα θα τοποθετήσει μια κόκκινη επικάλυψη πάνω από την εικόνα. Εάν επεξεργάζεστε μια εικόνα που περιέχει πολύ κόκκινο, δεν θα δείτε τίποτα μέσα από τη μάσκα. Σε αυτήν την περίπτωση, πρέπει να αλλάξετε το χρώμα της επικάλυψης.

Επίσης, μπορείτε να εφαρμόσετε φίλτρα στο κανάλι άλφα ακριβώς όπως θα κάνατε σε μια μάσκα επιπέδου. Από τα πιο χρήσιμα φίλτρα θα αναφέρω Gaussian Blurγια να μαλακώσετε την άκρη (χρήσιμο αν προσπαθείτε να επισημάνετε μια ελαφρώς θολή περιοχή) και ορίστε Εγκεφαλικά επεισόδια (Πινέλο)(για να δώσετε στη μάσκα πρωτότυπες άκρες).

Μετακίνηση

Όταν τελειώσετε με τη χρήση του (ή αποφασίσετε να ξεκινήσετε από την αρχή με ένα νέο), μπορείτε να το διαγράψετε σύροντάς το στο κουμπί Διαγραφή τρέχοντος καναλιού (μοιάζει με μικρό κάδο απορριμμάτων). Ή κάντε κλικ σε αυτό το κουμπί και κάντε κλικ στο Ναι όταν σας ζητηθεί να διαγράψετε.

Παρατηρήσατε ένα σφάλμα στο κείμενο - επιλέξτε το και πατήστε Ctrl + Enter . Ευχαριστώ!

Ένα bitmap αποτελείται από έναν ακέραιο αριθμό σειρών και στηλών. Για οποιοδήποτε παράδειγμα μιας κλάσης που προέρχεται από το BitmapSource, αυτές οι διαστάσεις μπορούν να ληφθούν από τις ιδιότητες Pixel HeightΚαι Πλάτος pixel.

Εννοιολογικά, τα bit pixel αποθηκεύονται σε έναν δισδιάστατο πίνακα των οποίων οι διαστάσεις είναι PixelHeight και PixelWidth. Στην πραγματικότητα, ο πίνακας έχει μόνο μία διάσταση, αλλά τα κύρια προβλήματα προκύπτουν με την αναπαράσταση μεμονωμένων pixel. Αυτή η αναπαράσταση, που μερικές φορές αναφέρεται ως "μορφή χρώματος" ενός bitmap, μπορεί να χρησιμοποιηθεί από ένα bit ανά pixel (για εικόνες που αποτελούνται μόνο από ασπρόμαυρο) έως ένα byte ανά pixel (για εικόνες που αποτελούνται από κλίμακα του γκρι ή bitmaps από 256- παλέτα χρωμάτων), 3 ή 4 byte ανά pixel (για έγχρωμες εικόνες με ή χωρίς διαφάνεια) και ακόμη περισσότερα για υψηλότερες χρωματικές αναλύσεις.

Ωστόσο, έχει δημιουργηθεί μια μορφή ενός χρώματος για να λειτουργεί με το WriteableBitmap. Σε οποιοδήποτε αντικείμενο WriteableBitmap, κάθε pixel αποτελείται από τέσσερα byte. Έτσι, ο συνολικός αριθμός των byte στον πίνακα pixel του bitmap είναι:

Pixel Height * Pixel Width * 4

Η εικόνα ξεκινά από την επάνω γραμμή και ακολουθεί από αριστερά προς τα δεξιά. Λείπει η ευθυγράμμιση γραμμής. Για κάθε pixel, τα byte ακολουθούν με μια συγκεκριμένη σειρά:

Μπλε, Πράσινο, Κόκκινο, Άλφα

Οι τιμές byte κυμαίνονται από 0 έως 255, όπως στις τιμές χρώματος. Οι τιμές χρώματος WriteableBitmap θεωρείται ότι συμμορφώνονται με το σχήμα sRGB ("RGB standard") και επομένως είναι συμβατές με τις τιμές χρώματος χρόνου εκτέλεσης των Windows (εκτός από την τιμή Colors.Transparent - βλέπε παρακάτω).

Τα εικονοστοιχεία WriteableBitmap αποθηκεύονται σε προπολλαπλασιασμένο κανάλι άλφα. Θα σας πω σύντομα τι σημαίνει αυτό.

Η σειρά μπλε-πράσινου-κόκκινου-άλφα είναι εκ πρώτης όψεως το αντίθετο από αυτό που χρησιμοποιείται συνήθως για τον προσδιορισμό των χρωματικών byte (και τη σειρά τους στη μέθοδο Color.FromArgb), αλλά είναι λογικό αν σκεφτείς ότι ένα εικονοστοιχείο WriteableBitmap είναι στην πραγματικότητα 32 -bit ανυπόγραφο ακέραιος αριθμός του οποίου το υψηλό byte αποθηκεύει το κανάλι άλφα και το χαμηλό byte περιέχει το μπλε στοιχείο. Σε λειτουργικά συστήματα που βασίζονται σε μικροεπεξεργαστές Intel, αυτός ο ακέραιος αριθμός αποθηκεύεται με σειρά λίγων byte.

Ας φτιάξουμε ένα bitmap. Για να γίνει αυτό, θα δημιουργήσουμε ένα αντικείμενο WriteableBitmap και θα το γεμίσουμε με pixel. Για να απλοποιηθούν οι υπολογισμοί, το WriteableBitmap θα έχει 256 σειρές και 256 στήλες. Το επάνω αριστερό μέρος θα είναι μαύρο, το πάνω δεξιά θα είναι μπλε, το κάτω αριστερό θα είναι κόκκινο και το κάτω δεξιά θα είναι μωβ (συνδυασμός κόκκινου και μπλε). Ο χρωματισμός είναι μια παραλλαγή της διαβάθμισης, αλλά διαφέρει από τις διαβαθμίσεις που είναι διαθέσιμες στο χρόνο εκτέλεσης των Windows.

Το αρχείο XAML ορίζει ένα στοιχείο Image, στο οποίο δίνεται μια παρουσία μιας κλάσης που προέρχεται από το ImageSource:

Δεν είναι δυνατό να δημιουργήσετε ένα WriteableBitmap στο XAML επειδή αυτή η κλάση δεν έχει κατασκευαστή χωρίς παραμέτρους. Το αρχείο κώδικα πίσω δημιουργεί και δημιουργεί ένα WriteableBitmap στο πρόγραμμα χειρισμού συμβάντων Loaded. Παρακάτω είναι το πλήρες αρχείο μαζί με τις απαιτούμενες οδηγίες χρήσης. Η ίδια η κλάση WriteableBitmap ορίζεται στον χώρο ονομάτων Windows.UI.Xaml.Media.Imaging:

Χρήση System.IO; χρησιμοποιώντας Windows.UI.Xaml; χρησιμοποιώντας Windows.UI.Xaml.Media.Imaging; χρησιμοποιώντας Windows.UI.Xaml.Controls. χρησιμοποιώντας System.Runtime.InteropServices.WindowsRuntime; namespace WinRTTestApp ( δημόσια σφραγισμένη μερική κλάση MainPage: Σελίδα ( public MainPage() ( this.InitializeComponent(); Loaded += MainPage_Loaded; ) private async void MainPage_Loaded(object sender, RoutedEventArgs e) ( WriteableEventArgs e) ( WriteableBitma ; εικονοστοιχεία byte = νέο byte; για (int y = 0; y< bitmap.PixelHeight; y++) for (int x = 0; x < bitmap.PixelWidth; x++) { int index = 4 * (y * bitmap.PixelWidth + x); pixels = (byte)x; // Blue pixels = 0; // Green pixels = (byte)y; // Red pixels = 255; // Alpha } using (Stream pixelStream = bitmap.PixelBuffer.AsStream()) { await pixelStream.WriteAsync(pixels, 0, pixels.Length); } bitmap.Invalidate(); image.Source = bitmap; } } }

Η κατασκευή WriteableBitmap πρέπει να περάσει το πλάτος και το ύψος της εικόνας σε pixel. Με βάση αυτά τα μεγέθη, το πρόγραμμα εκχωρεί μνήμη για μια σειρά byte:

byte pixels = νέο byte;

Το μέγεθος του πίνακα για ένα WriteableBitmap υπολογίζεται πάντα χρησιμοποιώντας αυτόν τον τύπο.

Οι βρόχοι γραμμής και στήλης επαναλαμβάνονται σε όλα τα εικονοστοιχεία της εικόνας. Ο δείκτης που αναφέρεται σε ένα συγκεκριμένο pixel στον πίνακα υπολογίζεται ως εξής:

Int index = 4 * (y * bitmap.PixelWidth + x);

Στο συγκεκριμένο παράδειγμα, δύο βρόχοι έχουν πρόσβαση στα εικονοστοιχεία με τη σειρά με την οποία είναι αποθηκευμένα στον πίνακα, έτσι ώστε ο δείκτης να μην χρειάζεται να υπολογιστεί εκ νέου για κάθε εικονοστοιχείο. Μπορεί να αρχικοποιηθεί στο μηδέν και στη συνέχεια να αυξηθεί ως εξής:

δείκτης int = 0; για (int y = 0; y< bitmap.PixelHeight; y++) for (int x = 0; x < bitmap.PixelWidth; x++) { int index = 4 * (y * bitmap.PixelWidth + x); pixels = (byte)x; // Blue pixels = 0; // Green pixels = (byte)y; // Red pixels = 255; // Alpha }

Αυτή η λύση είναι σχεδόν βέβαιο ότι θα τρέξει πιο γρήγορα από τη δική μου, αλλά είναι γενικά λιγότερο ευέλικτη.

Είναι επίσης δυνατό να οριστεί ένας βρόχος πάνω από τον δείκτη, υπολογίζοντας τα x και y με βάση την τρέχουσα τιμή της μεταβλητής. Δεν είναι η συγκεκριμένη υλοποίηση που είναι σημαντικό, αλλά το γεγονός ότι όλα τα pixel υποβάλλονται σε επεξεργασία ως αποτέλεσμα της απαρίθμησης (όχι πάντα, φυσικά, αλλά στις περισσότερες περιπτώσεις).

Αφού γεμίσει ο πίνακας byte, τα pixel πρέπει να μεταφερθούν σε ένα αντικείμενο WriteableBitmap. Αυτή η διαδικασία με την πρώτη ματιά φαίνεται μάλλον περίεργη. Η ιδιότητα PixelBuffer που ορίζεται από το WriteableBitmap είναι του τύπου IBuffer, το οποίο ορίζει μόνο δύο ιδιότητες: Χωρητικότητα και Μήκος. Όπως σημειώθηκε νωρίτερα, ένα αντικείμενο IBuffer τυπικά αντιπροσωπεύει μια περιοχή μνήμης που διαχειρίζεται ένα λειτουργικό σύστημα μέτρησης αναφοράς. όταν η μνήμη καθίσταται περιττή, το αντικείμενο καταστρέφεται αυτόματα. Τα byte πρέπει να μεταφερθούν σε ένα τέτοιο buffer.

Ευτυχώς, υπάρχει Μέθοδος επέκτασης AsStream, επιτρέποντας στο αντικείμενο IBuffer να ερμηνευτεί ως αντικείμενο .NET Stream:

Ροή pixelStream = bitmap.PixelBuffer.AsStream()

Για να χρησιμοποιήσετε αυτήν τη μέθοδο επέκτασης, πρέπει να συμπεριλάβετε μια οδηγία χρήσης για τον χώρο ονομάτων System.Runtime.InteropServices.WindowsRuntime στο πρόγραμμά σας. Χωρίς αυτήν την οδηγία, η InlelliSense δεν θα γνωρίζει την ύπαρξη αυτής της μεθόδου.

Στη συνέχεια, η κανονική μέθοδος Write που ορίζεται από την κλάση Stream χρησιμοποιείται για την εγγραφή ενός πίνακα byte σε ένα αντικείμενο Stream. μπορείτε επίσης να χρησιμοποιήσετε τη μέθοδο WriteAsync, όπως έκανα εγώ. Επειδή η εικόνα είναι μικρή και η κλήση απλώς περνά έναν πίνακα byte μέσω του API, η μέθοδος Write θα εκτελεστεί αρκετά γρήγορα ώστε να εκτελέσει τη λειτουργία στο νήμα της διεπαφής χρήστη. Στη συνέχεια, το αντικείμενο Stream καταστρέφεται "χειροκίνητα" ή αυτόματα ή η λογική ροής τοποθετείται στην οδηγία χρήσης, όπως έκανα:

Χρήση (Ροή pixelStream = bitmap.PixelBuffer.AsStream()) ( αναμονή pixelStream.WriteAsync(pixels, 0, pixels.Length); )

Συνηθίστε το γεγονός ότι κάθε φορά που αλλάζουν τα εικονοστοιχεία, το WriteableBitmap θα πρέπει να καλεί Invalidate στην εικόνα:

Bitmap.Invalidate();

Αυτή η κλήση απαιτεί επανασχεδιασμό του bitmap. Στο συγκεκριμένο πλαίσιο, η παρουσία του δεν είναι απαραίτητη, αλλά σε άλλες περιπτώσεις είναι σημαντική. Απομένει να εμφανιστεί η κατασκευασμένη εικόνα. Το πρόγραμμα απλώς ορίζει την ιδιότητα Source του στοιχείου Image στο αρχείο XAML:

Image.Source = bitmap;

Αποτέλεσμα:

Εάν αποθηκεύετε ένα αντικείμενο Stream και μια σειρά pixel σε ένα πεδίο για περαιτέρω χειρισμό του bitmap (για παράδειγμα, αλλάζοντας το με την πάροδο του χρόνου), θα πρέπει να εισαγάγετε μια κλήση Αναζήτησης πριν καλέσετε το WriteAsync για να επιστρέψετε την τρέχουσα θέση στην αρχή:

PixelStream.Seek(0, SeekOrigin.Begin);

Σημειώστε ότι μόνο μέρος του πίνακα byte μπορεί να γραφτεί σε ένα αντικείμενο bitmap. Ας υποθέσουμε ότι έχετε αλλάξει τα pixel από (x1, y1) σε (x2, y2) (χωρίς να συμπεριλαμβάνεται το τελευταίο σημείο). Προσδιορίστε πρώτα τους δείκτες των bytes που αντιστοιχούν σε αυτές τις δύο συντεταγμένες:

int index1 = 4 * (y1 * bitmap.PixelWidth + x1); int index2 = 4 * (y2 * bitmap.PixelWidth + x2);

Στη συνέχεια, καθορίστε ότι πρόκειται να ενημερώσετε τα pixel από το index1 στο index2:

PixelStream.Seek(ευρετήριο, SeekOrigin.Begin); pixelStream.Write(pixels, index1, index2 - index1); bitmap.Invalidate();

Ας προσπαθήσουμε να εφαρμόσουμε ένα άλλο είδος προσαρμοσμένης κλίσης. Το ακόλουθο πρόγραμμα CircularGradient υπολογίζει τη διαβάθμιση με βάση τη γωνία ενός συγκεκριμένου pixel από το κέντρο της εικόνας (οι υπολογισμοί είναι απλούστεροι από ό,τι θα περίμενε κανείς).

Το αρχείο XAML ορίζει ένα Ellipse με παχύ περίγραμμα και ένα αντικείμενο ImageBrush για την ιδιότητα Stroke. Το κινούμενο σχέδιο περιστρέφει το Ellipse γύρω από το κέντρο:

Το πρόγραμμα χειρισμού Loaded στο αρχείο κώδικα πίσω είναι σχεδόν το ίδιο με το προηγούμενο πρόγραμμα. Δύο βρόχοι περνούν από τις σειρές και τις στήλες της εικόνας, κάθε pixel βρίσκεται στη θέση (x,y) σε σχέση με την επάνω αριστερή γωνία. Το pixel στο κέντρο έχει συντεταγμένες (bitmap.PixelWidth/2, bitmap.PixelHeight/2). Αφαιρώντας τις κεντρικές συντεταγμένες από τις συντεταγμένες ενός συγκεκριμένου εικονοστοιχείου και διαιρώντας με το πλάτος και το ύψος της εικόνας, οι συντεταγμένες των εικονοστοιχείων μετατρέπονται σε τιμές στην περιοχή από -1/2 έως 1/2, οι οποίες στη συνέχεια μπορούν να περάσουν στη μέθοδο Math.Atan2 για να αποκτήσετε την επιθυμητή γωνία:

Χρήση System.IO; χρησιμοποιώντας Windows.UI.Xaml; χρησιμοποιώντας Windows.UI.Xaml.Media.Imaging; χρησιμοποιώντας Windows.UI.Xaml.Controls. χρησιμοποιώντας System.Runtime.InteropServices.WindowsRuntime; χρησιμοποιώντας το σύστημα. namespace WinRTTestApp ( δημόσια σφραγισμένη μερική κλάση MainPage: Σελίδα ( public MainPage() ( this.InitializeComponent(); Loaded += MainPage_Loaded; ) private async void MainPage_Loaded(object sender, RoutedEventArgs e) ( WriteableEventArgs e) ( WriteableBitma ; byte pixel = νέο byte; int index = 0; int centerX = bitmap.PixelWidth / 2; int centerY = bitmap.PixelHeight / 2; for (int y = 0; y< bitmap.PixelHeight; y++) for (int x = 0; x < bitmap.PixelWidth; x++) { double angle = Math.Atan2(((double)y - centerY) / bitmap.PixelHeight, ((double)x - centerX) / bitmap.PixelWidth); double fraction = angle / (2 * Math.PI); pixels = (byte)(fraction * 255); // Blue pixels = 0; // Green pixels = (byte)(255 * (1 - fraction)); // Red pixels = 255; // Alpha } using (Stream pixelStream = bitmap.PixelBuffer.AsStream()) { await pixelStream.WriteAsync(pixels, 0, pixels.Length); } bitmap.Invalidate(); imageBrush.ImageSource = bitmap; } } }

Αυτή η γωνία μετατρέπεται σε μια κλασματική τιμή μεταξύ 0 και 1 για τον υπολογισμό της κλίσης. Δείτε πώς φαίνεται το πλήρες bitmap όπως χρησιμοποιείται από το αντικείμενο ImageBrush που έχει οριστεί στην ιδιότητα Fill του αντικειμένου Ellipse:

Όπως φαίνεται νωρίτερα, τα πινέλα στο χρόνο εκτέλεσης των Windows συνήθως εκτείνονται πάνω από το στοιχείο στο οποίο εφαρμόζονται. Είναι το ίδιο με το ImageBrush, οπότε κατά κάποιο τρόπο το μέγεθος της βασικής εικόνας δεν έχει μεγάλη σημασία... Σε κάποιο βαθμό, σίγουρα - μια εικόνα που είναι πολύ μικρή δεν έχει αρκετές λεπτομέρειες και μια εικόνα πολύ μεγάλη είναι σπατάλη pixel.

Όταν ένα bitmap εμφανίζεται σε μια επιφάνεια (ας πούμε, μια οθόνη οθόνης), τα εικονοστοιχεία του δεν μεταφέρονται πάντα απλά στην επιφάνεια. Εάν το bitmap υποστηρίζει διαφάνεια, κάθε pixel πρέπει να συγχωνευθεί με το χρώμα μιας υπάρχουσας επιφάνειας στο αντίστοιχο σημείο με βάση το κανάλι άλφα αυτού του pixel. Εάν το κανάλι άλφα είναι 255 (πλήρης αδιαφάνεια), το εικονοστοιχείο της εικόνας απλώς αντιγράφεται στην επιφάνεια. Εάν το κανάλι άλφα είναι 0 (διαφάνεια), το pixel δεν αντιγράφεται καθόλου. Εάν το κανάλι άλφα είναι 128, το αποτέλεσμα είναι ο μέσος όρος του χρώματος των εικονοστοιχείων της εικόνας και του χρώματος της επιφάνειας πριν από την έξοδο.

Οι ακόλουθοι τύποι δείχνουν τους αντίστοιχους υπολογισμούς για ένα μόνο pixel. Στην πραγματικότητα, οι τιμές των A, R, G και B κυμαίνονται από 0 έως 255, αλλά οι ακόλουθοι απλοποιημένοι τύποι υποθέτουν ότι έχουν κανονικοποιηθεί σε ένα εύρος από 0 έως 1. Οι δείκτες δείχνουν το "αποτέλεσμα" της εμφάνισης ένα μερικώς διαφανές εικονοστοιχείο "εικόνας" σε υπάρχουσες "επιφάνειες":

Παρατηρήστε τον δεύτερο πολλαπλασιασμό σε κάθε γραμμή. Περιλαμβάνει μόνο το ίδιο το εικονοστοιχείο της εικόνας, όχι την επιφάνεια. Ως εκ τούτου, ολόκληρη η διαδικασία εμφάνισης μιας εικόνας ράστερ στην επιφάνεια μπορεί να επιταχυνθεί προ-πολλαπλασιάζοντας τις τιμές R, G και B του pixel με την τιμή A:

Ας υποθέσουμε ότι ένα bitmap χωρίς προπολλαπλασιασμό άλφα περιέχει ένα pixel με τιμή ARGB (192,40,60,255). Ένα κανάλι άλφα 192 υποδεικνύει 75 τοις εκατό αδιαφάνεια (192 διαιρούμενο με 255). Το ισοδύναμο άλφα προπολλαπλασιασμένο pixel είναι (192, 30, 45, 192): το κόκκινο, το πράσινο και το μπλε έχουν πολλαπλασιαστεί κατά 75%.

Κατά την εμφάνιση ενός WriteableBitmap, το λειτουργικό σύστημα υποθέτει ότι το εικονοστοιχείο είναι σε άλφα προπολλαπλασιασμένη μορφή. Για ένα αυθαίρετο pixel, καμία από τις τιμές R, G και B δεν μπορεί να υπερβεί την τιμή A. Εάν δεν πληρούται αυτή η συνθήκη, δεν θα συμβεί τίποτα τρομερό, αλλά δεν θα έχετε τα επιθυμητά χρώματα και επίπεδα διαφάνειας.

Ας δούμε μερικά παραδείγματα. Το άρθρο "Scaling Elements in WinRT" έδειξε πώς να αναστρέψετε μια εικόνα και να τη "διαλύσετε" έτσι ώστε να μοιάζει με αντανάκλαση. Αλλά επειδή ο χρόνος εκτέλεσης των Windows δεν υποστηρίζει μάσκες διαφάνειας, έπρεπε να καλύψω την εικόνα με ένα ημιδιαφανές ορθογώνιο για να επιτύχω το εφέ διαφάνειας.

Το έργο ReflectedAlphaImage χρησιμοποίησε μια διαφορετική λύση. Το αρχείο XAML περιέχει δύο στοιχεία εικόνας που καταλαμβάνουν ένα κελί ενός πίνακα Πλέγματος δύο γραμμών. Το δεύτερο στοιχείο εικόνας έχει οριστεί με τις ιδιότητες RenderTransformOrigin και ScaleTransform ώστε να "αντανακλάται" σε σχέση με την κάτω πλευρά, αλλά η εικόνα δεν καθορίζεται:

.jpg" HorizontalAlignment="Center" />

Το bitmap που αναφέρεται από το πρώτο στοιχείο Εικόνας πρέπει να φορτωθεί ανεξάρτητα σε ένα αρχείο κώδικα πίσω. (Μπορεί να αναρωτιέστε αν είναι δυνατό να αποκτήσετε ένα αντικείμενο WriteableBitmap με βάση το αντικείμενο που καθορίζεται στην ιδιότητα Source του πρώτου αντικειμένου Image; Αλλά αυτό το αντικείμενο είναι τύπου BitmapSource και δεν μπορείτε να δημιουργήσετε ένα WriteableBitmap από ένα BitmapSource.) Εάν δεν θέλετε να αλλάξετε τη φορτωμένη εικόνα, ο κατασκευαστής μπορεί να μοιάζει με αυτό:

Loaded += async (αποστολέας, e) =>.jpg"); RandomAccessStreamReference refStream = RandomAccessStreamReference.CreateFromUri(uri); IRandomAccessStreamWithContentType fileStream = αναμονή refStreamsy. map(1, 1); bitmap.SetSource (fileStream);reflectedImage.Source = bitmap; );

Αυτός ο κώδικας πρέπει να τοποθετηθεί στο πρόγραμμα χειρισμού Loaded επειδή χρησιμοποιεί ασύγχρονη εκτέλεση. Δώστε προσοχή στη δυνατότητα δημιουργίας ενός WriteableBitmap με πραγματικά "άγνωστο" μέγεθος όταν τα δεδομένα προέρχονται από τη μέθοδο SetSource. Διαβάζοντας μια ροή JPEG, ένα αντικείμενο WriteableBitmap μπορεί να καθορίσει τις πραγματικές διαστάσεις σε pixel.

Ωστόσο, όταν ένα αντικείμενο FileStream μεταβιβάζεται στη μέθοδο SetSource του αντικειμένου WriteableBitmap και όταν έχει οριστεί στην ιδιότητα Source του στοιχείου Image, το bitmap δεν έχει ακόμη φορτωθεί. Η φόρτωση γίνεται ασύγχρονα στον κώδικα WriteableBitmap. Αυτό σημαίνει ότι δεν μπορείτε να αρχίσετε να αλλάζετε ακόμα τα pixel, επειδή τα δεδομένα δεν έχουν ληφθεί ακόμα! Φυσικά, θα ήταν ωραίο αν η κλάση WriteableBitmap όριζε ένα συμβάν που θα ενεργοποιείται όταν το bitmap φορτώνεται στο SetSource, αλλά δεν υπάρχει τέτοιο συμβάν. Το συμβάν ImageOpened του ImageElement αποτυγχάνει επίσης να παρέχει αυτές τις πληροφορίες στο WriteableBitmap.

Άρα, μένει να φορτώσουμε μόνοι μας το αρχείο bitmap και μετά να κάνουμε αλλαγές σε αυτό. Ο κώδικας που πρόκειται να δείξω μπορεί να απλοποιηθεί λίγο με τις βοηθητικές κλάσεις που αναφέρθηκαν προηγουμένως, αλλά ας δούμε πρώτα πώς γίνεται χωρίς τάξεις. Η διαδικασία μοιάζει με αυτό:

Χρήση System.IO; χρησιμοποιώντας Windows.UI.Xaml; χρησιμοποιώντας Windows.UI.Xaml.Media.Imaging; χρησιμοποιώντας Windows.UI.Xaml.Controls. χρησιμοποιώντας System.Runtime.InteropServices.WindowsRuntime; χρησιμοποιώντας το σύστημα. χρησιμοποιώντας Windows.Storage.Streams. namespace WinRTTestApp ( δημόσια σφραγισμένη μερική κλάση MainPage: Σελίδα ( public MainPage() ( this.InitializeComponent(); Loaded += MainPage_Loaded; ) private async void MainPage_Loaded(object sender, RoutedEventArgs e).jpg"); ateFromUri (uri); // Δημιουργία buffer για την ανάγνωση μιας ροής Windows.Storage.Streams.Buffer buffer = null; // Διαβάστε ολόκληρο το αρχείο χρησιμοποιώντας (IRandomAccessStreamWithContentType fileStream = await refStream.OpenReadAsync()) ( buffer = νέο Windows.Storage. Streams.Buffer ((uint)fileStream.Size); await fileStream.ReadAsync(buffer, (uint)fileStream.Size, InputStreamOptions.None); ) // Δημιουργία αντικειμένου WriteableBitmap με άγνωστο μέγεθος WriteableBitmap bitmap(new Write1Bit) ); // Δημιουργία ροής μνήμης για μεταφορά δεδομένων χρησιμοποιώντας (InMemoryRandomAccessStream memoryStream = νέο InMemoryRandomAccessStream()) ( await memoryStream.WriteAsync(buffer); memoryStream.Seek(0); // Χρήση ροής μνήμης ως πηγή δεδομένων BitmapSourmap.(bitmapSourmap. memoryStream); ) // Λήψη pixel από ένα bitmap byte pixels = νέο byte. δείκτης int = 0; χρησιμοποιώντας (Ροή pixelStream = bitmap.PixelBuffer.AsStream()) ( αναμονή pixelStream.ReadAsync(pixels, 0, pixels.Length); // Εφαρμογή διαφάνειας σε pixel για (int y = 0; y< bitmap.PixelHeight; y++) { double opacity = (double)y / bitmap.PixelHeight; for (int x = 0; x < bitmap.PixelWidth; x++) for (int i = 0; i < 4; i++) { pixels = (byte)(opacity * pixels); index++; } } // Пикселы помещаются обратно в изображение pixelStream.Seek(0, SeekOrigin.Begin); await pixelStream.WriteAsync(pixels, 0, pixels.Length); } bitmap.Invalidate(); reflectedImage.Source = bitmap; } } }

Το όνομα της κλάσης Buffer πρέπει να είναι πλήρως πιστοποιημένο για να περιλαμβάνει τον χώρο ονομάτων Windows.Storage.Streams, επειδή ο χώρος ονομάτων System έχει επίσης μια κλάση με το όνομα Buffer.

Ένας από τους στόχους μας είναι να περάσουμε ένα αντικείμενο τύπου IRandomAccessStreamτη μέθοδο SetSource του αντικειμένου WriteableBitmap. Ωστόσο, θέλουμε να αρχίσουμε αμέσως να εργαζόμαστε με τα pixel της εικόνας που προκύπτει, και αυτό δεν είναι δυνατό μέχρι να διαβαστεί πλήρως το αρχείο.

Αυτό εξηγεί τη δημιουργία ενός αντικειμένου buffer για την ανάγνωση του αντικειμένου fileStream και στη συνέχεια τη χρήση του ίδιου αντικειμένου buffer για την ανάγνωση των περιεχομένων στο InMemoryRandomAccessStream. Όπως υποδηλώνει το όνομα, η κλάση InMemoryRandomAccessStream υλοποιεί τη διεπαφή IRandomAccessStream έτσι ώστε οι παρουσίες της να μπορούν να περάσουν στη μέθοδο SetSource της κλάσης WriteableBitmap (σημειώστε την ανάγκη να ορίσετε πρώτα τη θέση στη ροή στο μηδέν).

Είναι σημαντικό να κατανοήσουμε ότι εδώ εργαζόμαστε με δύο διαφορετικά μπλοκ δεδομένων. Το αντικείμενο fileStream αντιστοιχεί σε ένα αρχείο PNG, το οποίο σε αυτή την περίπτωση είναι ένα μπλοκ 82.824 byte συμπιεσμένων δεδομένων γραφικών. Το αντικείμενο InMemoryRandomAccessStream περιέχει το ίδιο μπλοκ δεδομένων. Αφού η ροή περάσει στη μέθοδο SetSource της κλάσης WriteableBitmap, αποκωδικοποιείται σε σειρές και στήλες pixel. Το μέγεθος του πίνακα εικονοστοιχείων είναι 512.000 byte και το αντικείμενο pixelStream λειτουργεί σε αυτά τα μη συσκευασμένα pixel. Το αντικείμενο pixelStream χρησιμοποιείται πρώτα για την ανάγνωση εικονοστοιχείων στον πίνακα εικονοστοιχείων και στη συνέχεια για την εγγραφή τους πίσω στην εικόνα.

Εάν θέλετε να δείτε τι συμβαίνει όταν αλλάζει μόνο το άλφα byte, αντικαταστήστε τον ακόλουθο κώδικα εσωτερικού βρόχου:

Αν (i == 3) ( εικονοστοιχεία = (byte) (αδιαφάνεια * εικονοστοιχεία); ευρετήριο++; )

Μεταξύ των δύο κλήσεων, η διαφάνεια της κλίσης εφαρμόζεται άμεσα. Εάν ο χρόνος εκτέλεσης των Windows δεν υπέθετε ότι τα εικονοστοιχεία WriteableBitmap αποθηκεύονται σε μορφή άλφα προπολλαπλασιασμένη, τότε θα αρκούσε να τροποποιήσετε μόνο το άλφα byte. Με τον προπολλαπλασιασμό του καναλιού άλφα, τα δεδομένα χρώματος πρέπει επίσης να τροποποιηθούν. Το αποτέλεσμα μοιάζει με αυτό:

Το επιθυμητό επίπεδο διαφάνειας επιτυγχάνεται, αλλά μόνο όταν χρησιμοποιείται λευκό φόντο. Αν το φόντο είναι μαύρο, δεν θα υπάρχει καθόλου διαφάνεια! Ρίξτε μια ματιά στις φόρμουλες και όλα θα σας ξεκαθαρίσουν.

Ας υποθέσουμε ότι θέλετε να τροποποιήσετε το έργο CircularGradient για να χρησιμοποιήσετε μια διαβάθμιση από μονόχρωμη σε πλήρη διαφάνεια. Ο τροποποιημένος κώδικας για τη ρύθμιση τεσσάρων byte μοιάζει με αυτό:

Pixel = (byte) (κλάσμα * 255); // μπλε εικονοστοιχεία = 0; // πράσινα pixel = 0; // Κόκκινα εικονοστοιχεία = (byte)(κλάσμα * 255); // άλφα

Τα στοιχεία μπλε και άλφα έχουν τις ίδιες τιμές. Στη μορφή χωρίς προπολλαπλασιασμό άλφα, το μπλε στοιχείο θα είναι πάντα 255. Αποτέλεσμα: