Send a PR on GitHub

progintro @ dit


Πρόγραμμα Περιστροφής Εικόνας

Το πρόγραμμα δέχεται το ωμό περιεχόμενο μιας bitmap εικόνας και στέλνει στο standard output μια εκδοχή της που έχει περιστραφεί δεξιόστροφα, κατά 90 μοίρες. Αρχικά διαβάζω την τιμή pixel_array_offset για να αποθηκεύσω το πλήθος των bytes που απαιτούνται για την αποθήκευση του header και του other data. Αμέσως μετά δημιουργώ ένα αντίγραφο των δεδομένων, διαβάζω τις χρήσιμες πληροφορίες χρησιμοποιώντας casting σε uint32_t pointer, και κάνω malloc μια δισδιάστατη λίστα για να αποθηκεύσω και να τροποποιήσω τα περιεχόμενα των pixels. Υπολογίζω το νέο padding έτσι ώστε κάθε στήλη να έχει μέγεθος πολλαπλάσιο του τέσσερα και στέλνω τις αλλαγές μου στο standard output.

Για να καταλάβω πως θα υλοποιήσω το transformation, περιέγραψα σε χαρτί την διαδικασία περιστροφής μιας οποιοασδήποτε εικόνας και μετέφερα το σκεπτικό στο πρόγραμμα δίνοντας ιδιαίτερη προσοχή στον τρόπο με τον οποίο κάνω iterate τις στήλες και τις γραμμές. Ουσιαστικά μετατρέπω κάθε στήλη σε γραμμή, αφού πρώτα αντιστρέψω την σειρά των pixels της.

Αφού τελειώσω με την επεξεργασία των δεδομένων κάνω free() για να αποφύγω τα πιθανά μαίμωρει λειξ. Αρχικά είχα προσπαθήσει να κάνω χρήση της fseek(stdin, padding, SEEK_SET) για να αποφύγω την ανάγνωση των κενών, αλλά η συγκεκριμένη συνάρτηση δεν λειτουργούσε για pipes αλλά μόνο σε απλές περιπτώσεις ανακατεύθυνσης.

Χρησιμοποίησα τον preprocessor (#define) για να μην περιλάβω magic numbers στο πρόγραμμά μου. Επιπλέον, αν ποτέ χρειαστεί να διορθώσω οποιοδήποτε offset αρκεί μονάχα να αλλάξω την γραμμή του declaration του, και όχι όλες τις περιπτώσεις που αυτή χρησιμοποιείται!