Τι σημαίνει bmp; Τι είναι η επέκταση αρχείου BMP; Ποιο πρόγραμμα να ανοίξετε την επέκταση bmp

BMP(από τα αγγλικά Εικόνα Bitmap) είναι μια μορφή αποθήκευσης εικόνων ράστερ που αναπτύχθηκε από τη Microsoft.

Ένας τεράστιος αριθμός προγραμμάτων λειτουργεί με τη μορφή BMP, καθώς η υποστήριξή του είναι ενσωματωμένη στα λειτουργικά συστήματα Windows και OS/2. Τα αρχεία BMP μπορούν να έχουν επεκτάσεις .bmp, .dib και .rle. Επιπλέον, δεδομένα σε αυτή τη μορφή περιλαμβάνονται σε δυαδικά αρχεία πόρων ΑΠΕ και αρχεία PE.

Η Microsoft έχει επίσης αναπτύξει μορφές ICO και CUR για τις ανάγκες της, οι οποίες έχουν δομή παρόμοια με το BMP. Επιπλέον, δομές από αυτήν τη μορφή χρησιμοποιούνται από ορισμένες συναρτήσεις WinAPI του υποσυστήματος GDI.

Τα βάθη χρώματος σε αυτήν τη μορφή μπορεί να είναι 1, 2, 4, 8, 16, 24, 32, 48 bit ανά pixel, αλλά 2 bit ανά pixel δεν υποστηρίζονται επίσημα. Σε αυτήν την περίπτωση, για βάθη χρωμάτων μικρότερα από 16 bit, χρησιμοποιείται μια παλέτα με πλήρη έγχρωμα στοιχεία με βάθος 24 bit.

Στη μορφή BMP, οι εικόνες μπορούν να αποθηκευτούν ως έχουν ή χρησιμοποιώντας ορισμένους κοινούς αλγόριθμους συμπίεσης. Συγκεκριμένα, η μορφή BMP υποστηρίζει συμπίεση RLE χωρίς απώλεια ποιότητας και τα σύγχρονα λειτουργικά συστήματα και λογισμικό επιτρέπουν τη χρήση JPEG και PNG (αυτές οι μορφές είναι ενσωματωμένες στο BMP ως κοντέινερ).

DIB και DDB

Όταν χρησιμοποιείτε τη μορφή DIB Bitmap ανεξάρτητο από τη συσκευή, ράστερ ανεξάρτητα από τη συσκευή), ο προγραμματιστής μπορεί να έχει πρόσβαση σε όλα τα στοιχεία των δομών που περιγράφουν την εικόνα χρησιμοποιώντας έναν κανονικό δείκτη. Αλλά αυτά τα δεδομένα δεν χρησιμοποιούνται για τον άμεσο έλεγχο της οθόνης, καθώς αποθηκεύονται πάντα στη μνήμη του συστήματος και όχι στην αποκλειστική μνήμη βίντεο. Η μορφή pixel στη μνήμη RAM μπορεί να διαφέρει από τη μορφή που πρέπει να αποθηκευτεί στη μνήμη βίντεο για να εμφανιστεί ένα σημείο του ίδιου χρώματος. Για παράδειγμα, η μορφή DIB μπορεί να χρησιμοποιήσει 24 bit για να καθορίσει ένα pixel και αυτή τη στιγμή ο προσαρμογέας γραφικών μπορεί να λειτουργεί σε λειτουργία HiColor με βάθος χρώματος 16 bit. Σε αυτήν την περίπτωση, η φωτεινή κόκκινη κουκκίδα θα καθοριστεί σε μορφή ανεξάρτητη από το υλικό κατά τρία byte 0x0000ff και στη μνήμη βίντεο με τη λέξη 0xF800. Κατά την αντιγραφή μιας εικόνας στην οθόνη, το σύστημα θα αφιερώσει επιπλέον χρόνο για να μετατρέψει τους χρωματικούς κωδικούς από τη μορφή 24-bit στη μορφή buffer βίντεο.

Επισκόπηση δομής αρχείου

Το αρχείο BMP αποτελείται από τέσσερα μέρη:

  1. Κεφαλίδα αρχείου (BITMAPFILEHEADER)
  2. Ο τίτλος της εικόνας (BITMAPINFOHEADER, ενδέχεται να λείπει). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
  3. Παλέτα (μπορεί να λείπει)
  4. Η ίδια η εικόνα

BITMAFILEHEADER

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

Typedef struct tagBITMAPFILEHEADER ( WORD bfType; // μετατόπισε 0 byte από την αρχή του αρχείου DWORD bfSize; // μετατόπιση 2 byte από την αρχή του αρχείου, μήκος 4 byte WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits;

// μετατόπισε 10 byte από την αρχή του αρχείου, μήκος 4 byte

  • ) BITMAPFILEHEADER, * PBITMAPFILEHEADER;
  • Ο τύπος WORD πρέπει να είναι 16 bit, οι τύποι DWORD και LONG πρέπει να είναι 32 bit, ο τύπος LONG πρέπει να είναι υπογεγραμμένος και η σειρά byte θεωρείται ότι είναι μικρή endian.
  • bfType - τύπος αρχείου, χαρακτήρες "BM" (σε HEX: 0x42 0x4d).
  • bfSize - το μέγεθος ολόκληρου του αρχείου σε byte.

Τα bfReserved1 και bfReserved2 είναι δεσμευμένα και πρέπει να περιέχουν μηδενικά.

bfOffBits - περιέχει τη μετατόπιση σε byte από την αρχή της δομής BITMAPFILEHEADER έως τα ίδια τα bit της εικόνας.

Μετά την κεφαλίδα του αρχείου

BITMAPINFOHEADER

Η απλούστερη επιλογή κεφαλίδας. Οι εφαρμογές για Windows NT3.51 και παλαιότερες εκδόσεις μπορούν να χρησιμοποιούν μόνο αυτήν τη δομή. Μέγεθος 40 byte.

  • 0 - έχει νόημα για Win98/Me/2000/XP. Ο αριθμός των bit ανά pixel καθορίζει τη μορφή JPEG ή PNG.
  • 1 - μονόχρωμη εικόνα. Το μέλος bmiColors της δομής BITMAPINFO περιέχει δύο στοιχεία. Κάθε bit μιας εικόνας αντιπροσωπεύει ένα pixel. εάν το bit είναι μηδέν, το pixel έχει το χρώμα του πρώτου στοιχείου του πίνακα bmiColors, διαφορετικά - το χρώμα του δεύτερου.
  • 4 - εικόνα δεκαέξι χρωμάτων. Τα εικονοστοιχεία ορίζονται από δείκτες 4 bit, κάθε byte της εικόνας περιέχει πληροφορίες για δύο pixel - τα πιο σημαντικά 4 bit για το πρώτο, τα υπόλοιπα για το δεύτερο.
  • 8 - η παλέτα περιέχει έως και 256 χρώματα, κάθε byte της εικόνας αποθηκεύει ένα ευρετήριο στην παλέτα για ένα pixel.
  • 16 - εάν το πεδίο biCompression περιέχει την τιμή BI_RGB, το αρχείο δεν περιέχει παλέτα. Κάθε δύο byte της εικόνας αποθηκεύουν την ένταση των κόκκινων, πράσινων και μπλε στοιχείων ενός pixel. Σε αυτήν την περίπτωση, το πιο σημαντικό bit δεν χρησιμοποιείται. Εκχωρούνται 5 bit για κάθε στοιχείο: 0RRRRRGGGGGBBBB.
    Εάν το πεδίο biCompression περιέχει την τιμή BI_BITFIELDS, η παλέτα αποθηκεύει τρεις τιμές τεσσάρων byte που ορίζουν μια μάσκα για καθένα από τα τρία στοιχεία χρώματος. Κάθε εικονοστοιχείο σε μια εικόνα αντιπροσωπεύεται από μια τιμή δύο byte από την οποία εξάγονται τα στοιχεία χρώματος χρησιμοποιώντας μάσκες. Για WinNT/2000/XP, οι ακολουθίες bit κάθε στοιχείου πρέπει να ακολουθούν συνεχώς, χωρίς να επικαλύπτονται ή να τέμνονται με τις ακολουθίες άλλων στοιχείων. Για Win95/98/Me - υποστηρίζονται μόνο οι ακόλουθες μάσκες: 5-5-5, όπου η μάσκα του μπλε στοιχείου είναι 0x001F, πράσινο 0x03E0, κόκκινο 0x7C00. και 5-6-5, όπου η μάσκα του μπλε στοιχείου είναι 0x001F, πράσινο 0x07E0, κόκκινο 0xF800.
  • 24 - η παλέτα δεν χρησιμοποιείται, κάθε τρία byte της εικόνας αντιπροσωπεύει ένα pixel, ένα byte για την ένταση του μπλε, πράσινου και κόκκινου καναλιού, αντίστοιχα.
  • 32 - Εάν το πεδίο biCompression περιέχει την τιμή BI_RGB, η εικόνα δεν περιέχει παλέτα. Κάθε τέσσερα byte της εικόνας αντιπροσωπεύουν ένα pixel, ένα byte για την ένταση του μπλε, πράσινου και κόκκινου καναλιού αντίστοιχα. Το πιο σημαντικό byte από κάθε quad δεν χρησιμοποιείται συνήθως, αλλά επιτρέπει την αποθήκευση δεδομένων καναλιού άλφα.
    Εάν το πεδίο biCompression περιέχει την τιμή BI_BITFIELDS, τρεις χρωματικές μάσκες τεσσάρων byte αποθηκεύονται στην παλέτα - για τα κόκκινα, πράσινα και μπλε στοιχεία. Κάθε pixel σε μια εικόνα αντιπροσωπεύεται από τέσσερα byte. WinNT/2000: Οι μάσκες εξαρτημάτων δεν πρέπει να επικαλύπτονται ή να τέμνονται. Windows 95/98/Me: το σύστημα υποστηρίζει μόνο μία λειτουργία συμπίεσης, εντελώς παρόμοια με τη λειτουργία χωρίς συμπίεση BI_RGB - το πιο σημαντικό byte από κάθε τέσσερα χρησιμοποιείται ως κανάλι άλφα, τα επόμενα τρία προορίζονται για το μπλε, το πράσινο και το κόκκινο κανάλια, αντίστοιχα: 0xAARRGGBB.
biCompression Τύπος συμπίεσης για συμπιεσμένες εικόνες:
Εννοια Αναγνωριστικό Συμπίεση
0 BI_RGB ασυμπίεστη εικόνα
1 BI_RLE8 Συμπίεση RLE για εικόνες 8-bit
2 BI_RLE4 Συμπίεση RLE για εικόνες 4-bit
3 BI_BITFIELDS η εικόνα δεν συμπιέζεται, η παλέτα περιέχει τρεις μάσκες 4 byte για τα στοιχεία του κόκκινου, του πράσινου και του μπλε χρώματος. Χρησιμοποιείται για εικόνες 16 και 32 bit
4 BI_JPEG Win98/Me/2000/XP: Συμπίεση JPEG
5 BI_PNG Win98/Me/2000/XP: Συμπίεση PNG
6 BI_ALPHABITFIELDS WinCE: η εικόνα δεν συμπιέζεται, η παλέτα περιέχει τέσσερις μάσκες 4 byte για τα στοιχεία χρώματος κόκκινου, πράσινου, μπλε και διαφανούς (κανάλι άλφα). Χρησιμοποιείται για εικόνες 16 και 32 bit
biSizeImage Μέγεθος εικόνας σε byte. Μπορεί να περιέχει μηδέν για εικόνες BI_RGB. Win98/Me/2000/XP: Εάν η biCompression περιέχει BI_JPEG ή BI_PNG, το biSizeImage καθορίζει το μέγεθος του buffer εικόνας BI_JPEG ή BI_PNG.
biXPelsPerMeter Οριζόντια ανάλυση σε pixel ανά μέτρο για τη συσκευή-στόχο. Μια εφαρμογή μπορεί να χρησιμοποιήσει αυτήν την τιμή για να επιλέξει από μια ομάδα πόρων εικόνας την πιο κατάλληλη εικόνα για την τρέχουσα συσκευή. Για το DPI 96, το οποίο είναι αποδεκτό από τη Microsoft για οθόνες, θα είναι ίσο με 3780 (εάν υπολογίζεται χρησιμοποιώντας τον τύπο (96 / 25.4) * 1000).
Σε μια συσκευασμένη εικόνα, ο πίνακας εικονοστοιχείων ακολουθεί αμέσως τη δομή BITMAPINFO, το biClrUsed πρέπει να περιέχει το μηδέν ή το πραγματικό μέγεθος παλέτας.

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

Η δομή BITMAPINFO συνδυάζει το BITMAPINFOHEADER και την παλέτα, παρέχοντας μια πλήρη περιγραφή των διαστάσεων και των χρωμάτων μιας εικόνας.

Για να βρείτε την παλέτα στη δομή BITMAPINFO, η εφαρμογή πρέπει να χρησιμοποιήσει τις πληροφορίες που είναι αποθηκευμένες στο biSize ως εξής:

PCcolor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo-> bmiHeader.biSize ) ;

Το ράστερ συνήθως αποθηκεύεται σε κατακόρυφα κατοπτρισμένη μορφή. Αλλά είναι επίσης δυνατή η αποθήκευση του ράστερ όχι σε κατακόρυφα κατοπτρισμένη μορφή. Ένα σημάδι ότι το ράστερ στο BMP δεν είναι σε μορφή κάθετου καθρέφτη καθορίζεται από την παράμετρο biHeight.

BITMAPV4HEADER

Μια διευρυμένη έκδοση της δομής που περιγράφεται παραπάνω. Το Win NT 3.51 και παλαιότερο πρέπει να χρησιμοποιεί τη δομή BITMAPINFOHEADER. Το Win98/Me/2000/XP μπορεί να χρησιμοποιήσει τη δομή BITMAPV5HEADER αντί για τη δομή BITMAPV4HEADER.

Δομή Typedef ( DWORD bV4Size; LONG bV4Width; LONG bV4Height; WORD bV4Planes; WORD bV4BitCount; DWORD bV4V4Compression; DWORD bV4SizeImage; LONG bV4XPelsPerWlMeter; sed DW bV4ClrΣημαντικό CIEXYZTRIPLE bV4GammaBlue;

  • Τα πεδία από την αρχή της δομής έως και το bV4ClrImportant έχουν τον ίδιο σκοπό με τα αντίστοιχα πεδία της δομής BITMAPINFOHEADER.
  • bV4RedMask - έγχρωμη μάσκα του κόκκινου στοιχείου κάθε pixel, που χρησιμοποιείται μόνο εάν το bV4Compression περιέχει την τιμή BI_BITFIELDS.
  • bV4GreenMask - έγχρωμη μάσκα του πράσινου στοιχείου κάθε pixel, που χρησιμοποιείται μόνο εάν το bV4Compression περιέχει την τιμή BI_BITFIELDS.
  • bV4BlueMask - έγχρωμη μάσκα του μπλε στοιχείου κάθε pixel, που χρησιμοποιείται μόνο εάν το bV4Compression περιέχει την τιμή BI_BITFIELDS.
  • bV4AlphaMask - μάσκα που ορίζει το στοιχείο άλφα καναλιού.
  • bV4CSType - ορίζει τον χρωματικό χώρο της εικόνας.
  • bV4GammaRed - καμπύλη τόνου του κόκκινου στοιχείου. Αγνοείται εάν το bV4CSType δεν περιέχει τιμή LCS_CALIBRATED_RGB. Υποδεικνύεται σε μορφή 16×16.
  • bV4GammaGreen - καμπύλη τόνου του πράσινου στοιχείου. Αγνοείται εάν το bV4CSType δεν περιέχει τιμή LCS_CALIBRATED_RGB.
  • bV4GammaBlue - καμπύλη τόνου μπλε συστατικού. Αγνοείται εάν το bV4CSType δεν περιέχει τιμή LCS_CALIBRATED_RGB.

BITMAPV5HEADER

Win95/NT 4.0: Οι εφαρμογές μπορούν να χρησιμοποιήσουν το BITMAPV4HEADER. Το Win NT 3.51 και παλαιότερο πρέπει να χρησιμοποιεί τη δομή BITMAPINFOHEADER.

Structure Typedef ( DWORD bV5Size; LONG bV5Width; LONG bV5Hight; WORD bV5Planes; WORD bV5BitCount; DWORD bV5Compression; DWORD bV5SizeImage; LONG bV5XPelsPerMeter5PerMeter;DWORD bV5Bit; bV5ClrΣημαντικό DWORD bV5AlphaMask ; 5HEADER;

Για πεδία από την αρχή της δομής έως και το bV5GammaBlue, θα περιγραφούν μόνο διαφορές από τις προηγούμενες εκδόσεις - BITMAPINFOHEADER και BITMAPV4HEADER.

  • bV5CSType - ορίζει τον χρωματικό χώρο της εικόνας, μπορεί να λάβει τις ακόλουθες τιμές:
LCS_CALIBRATED_RGB LCS_sRGB LCS_WINDOWS_COLOR_SPACE PROFILE_LINKED PROFILE_EMBEDDED
  • bV5Intent - μπορεί να λάβει τις ακόλουθες τιμές:
LCS_GM_ABS_COLORIMETRIC LCS_GM_BUSINESS LCS_GM_GRAPHICS LCS_GM_IMAGES
  • bV5ProfileData - μετατόπιση σε byte από την αρχή της δομής έως την αρχή των δεδομένων προφίλ (όνομα αρχείου προφίλ, συμβολοσειρά που αποτελείται αποκλειστικά από πίνακα κωδικών 1252 χαρακτήρων και τελειώνει με μηδενικό byte). Αγνοείται εάν το bV5CSType περιέχει μια τιμή διαφορετική από PROFILE_LINKED και PROFILE_EMBEDDED.
  • bV5ProfileSize - μέγεθος δεδομένων προφίλ σε byte.
  • bV5Δέσμευση - κράτηση. Περιέχει μηδέν.

Παλέτα

Η παλέτα μπορεί να περιέχει μια ακολουθία πεδίων τεσσάρων byte σύμφωνα με τον αριθμό των διαθέσιμων χρωμάτων (256 για μια εικόνα 8 bit). Τα χαμηλά τρία byte κάθε πεδίου καθορίζουν την ένταση των κόκκινων, πράσινων και μπλε στοιχείων του χρώματος δεν χρησιμοποιείται. Κάθε pixel της εικόνας περιγράφεται σε αυτήν την περίπτωση από ένα byte που περιέχει τον αριθμό του πεδίου παλέτας στο οποίο είναι αποθηκευμένο το χρώμα αυτού του pixel.

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

Ένα αρχείο BMP μπορεί να μην περιέχει παλέτα εάν αποθηκεύει μια ασυμπίεστη έγχρωμη εικόνα.

Δεδομένα εικόνας

Μια ακολουθία pixel που καταγράφεται με τη μια ή την άλλη μορφή. Τα εικονοστοιχεία αποθηκεύονται σειρά προς σειρά, από κάτω προς τα πάνω. Κάθε γραμμή εικόνας είναι γεμάτη με μηδενικά σε μήκος που είναι πολλαπλάσιο των τεσσάρων byte.

Σε αρχεία bmp με βάθος χρώματος 24 bit, τα χρωματικά byte κάθε pixel αποθηκεύονται με σειρά BGR (Μπλε, Πράσινο, Κόκκινο).

Σε αρχεία bmp με βάθος χρώματος 32 bit, τα χρωματικά byte κάθε pixel αποθηκεύονται με σειρά BGRA (Μπλε, Πράσινο, Κόκκινο, Άλφα)

Βάθος bit εικόνας

Ανάλογα με τον αριθμό των αντιπροσωπευόμενων χρωμάτων, κάθε σημείο εκχωρείται από 1 έως 48 bit:

  • 1 bit - μονόχρωμη εικόνα (δύο χρώματα).
  • 2 bit - 4 πιθανά χρώματα (τρόποι λειτουργίας CGA) (η λειτουργία 2 bit δεν είναι επίσημα τυποποιημένη, αλλά χρησιμοποιείται).
  • 4 bit - εικόνα 16 χρωμάτων (τρόποι λειτουργίας EGA).
  • 8 bit (1 byte) - 256 χρώματα, η τελευταία από τις λειτουργίες για υποστήριξη χρωμάτων με ευρετήριο (δείτε παρακάτω).
  • 16 bit (2 byte) - Λειτουργία HiColor, Για 5-6-5 = 65536 πιθανές αποχρώσεις, για 5-5-5 = 32768 πιθανές αποχρώσεις.
  • 24 bit (3 byte) - TrueColor. Επειδή τα 3 byte δεν αντιστοιχίζονται καλά στις δυνάμεις των δύο (ειδικά κατά την αποθήκευση δεδομένων στη μνήμη, όπου η στοίχιση δεδομένων σε ένα όριο λέξης έχει σημασία), χρησιμοποιείται συχνά μια εικόνα 32 bit. Στη λειτουργία TrueColor, σε καθένα από τα τρία κανάλια (σε λειτουργία RGB) εκχωρείται 1 byte (256 πιθανές τιμές), ο συνολικός αριθμός χρωμάτων είναι .
  • 32 bit (4 byte) - αυτή η λειτουργία είναι σχεδόν παρόμοια με το TrueColor, το τέταρτο byte συνήθως δεν χρησιμοποιείται ή το κανάλι άλφα (διαφάνεια) βρίσκεται σε αυτό.
  • 48 bit (6 byte) - μια μορφή που χρησιμοποιείται σπάνια με αυξημένη ακρίβεια χρώματος (16 bit ανά κανάλι), που υποστηρίζεται από σχετικά μικρό αριθμό προγραμμάτων και εξοπλισμού.

Χρώματα με ευρετήριο

Όταν ο αριθμός των bit είναι 1 (2 χρώματα), 2 (4 χρώματα), 4 (16 χρώματα) ή 8 (256 χρώματα) ανά pixel, μπορεί να χρησιμοποιηθεί μια ειδική λειτουργία ευρετηρίου χρώματος. Σε αυτήν την περίπτωση, ο αριθμός που αντιστοιχεί σε κάθε pixel δεν υποδεικνύει το χρώμα, αλλά τον αριθμό του χρώματος στην παλέτα. Χρησιμοποιώντας μια παλέτα, είναι δυνατή η προσαρμογή της εικόνας στα χρώματα που υπάρχουν στην εικόνα. Σε αυτήν την περίπτωση, η εικόνα δεν περιορίζεται από καθορισμένα χρώματα, αλλά από τον μέγιστο αριθμό χρωμάτων που χρησιμοποιούνται ταυτόχρονα.

Παράδειγμα προγράμματος

Το παρακάτω πρόγραμμα ανοίγει ένα αρχείο BMP 24-bit σε ένα XWindow, το βάθος χρώματος πρέπει να είναι 32 bit, δεν λειτουργεί σε χαμηλότερες χρωματικές αποδόσεις, καθώς περιπλέκει το παράδειγμα:

/* Μεταγλώττιση με τη γραμμή: cc -o xtest xtest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lm */#συμπεριλαμβάνω #συμπεριλαμβάνω #συμπεριλαμβάνω #συμπεριλαμβάνω #συμπεριλαμβάνω #συμπεριλαμβάνω #συμπεριλαμβάνω #συμπεριλαμβάνω #συμπεριλαμβάνω #συμπεριλαμβάνω #συμπεριλαμβάνω #include "bitmap.h" /* Ακολουθούν οι ορισμοί της κεφαλίδας BMP όπως περιγράφονται παραπάνω σε αυτό το άρθρο */ static XImage * CreateImageFromBuffer(Display*, unsigned char *, int, int) ; main(int argc, char * argv ) ( Εμφάνιση * dis; Window win; /* Our window */ XEvent event; /* Events */ GC gc;/* Περιβάλλον γραφικών */< 2 ) { perror ("use: xtest file.bmpXImage * εικόνα; int n, πλάτος, ύψος, fd, μέγεθος; XImage * εικόνα;ανυπόγραφα δεδομένα char *; BITMAPFILEHEADER bmp; BITMAPINFOHEADER inf; char * buf;εάν (argc \n") ; exit(1);) if ((fd = open(argv[ 1 ] , O_RDONLY) ) == - 1 ) ( printf ("Σφάλμα ανοιχτού bitmap ) ; exit(1); /* Ανάγνωση στο buffer */ n = ανάγνωση (fd, buf, μέγεθος) ; printf("μέγεθος = %d byte αναγνωσμένα\n" , ιδ) ;εικόνα = CreateImageFromBuffer(dis, buf, πλάτος, ύψος) ; /* Διαγράψτε το buffer - δεν το χρειαζόμαστε πλέον */δωρεάν (buf); XMapWindow(dis, win) ; XSelectInput(dis, win, ExposureMask | KeyPressMask) ; ενώ (1 ) ( XNextEvent(dis, & event) ; if (event.xany .window == win) ( switch (event.type ) ( case Expose: XPutImage(dis, win, gc, image, 0 , 0 , 0 , 0 , εικόνα-> πλάτος, εικόνα-> ύψος) ; έξοδος (EXIT_SUCCESS) ;/* Δημιουργεί ένα Ximage από ένα αρχείο BMP, καθώς η εικόνα BMP αποθηκεύεται ανάποδα * και αντικατοπτρίζεται - αυτό διορθώνεται στον βρόχο */ XImage * CreateImageFromBuffer(Εμφάνιση * dis, ανυπόγραφο char * buf, int πλάτος, int ύψος) (int βάθος, οθόνη; XImage * img = NULL; int i, j; int numBmpBytes; size_t numImgBytes; int32_t; int32_t; int γραμμή int ih;/* Αριθμοί σειρών και στηλών που αντικατοπτρίζουν */< numBmpBytes; i++ ) { unsigned int r, g, b; int new_ind;/* Νέο ευρετήριο */ οθόνη = DefaultScreen(dis) ; βάθος = DefaultDepth(dis, οθόνη) ;θερμοκρασία = πλάτος * 3 ;<< 8 | b << 16 ) << 8 ; ind++; } img = XCreateImage(dis, CopyFromParent, depth, ZPixmap, 0 , (char * ) imgBuf, width, height, 32 , 0 ) ; XInitImage(img) ; γραμμή = θερμοκρασία + πλάτος % 4 ;/* Μήκος συμβολοσειράς λαμβάνοντας υπόψη την ευθυγράμμιση */

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

Στα αρχεία BMP, οι πληροφορίες χρώματος κάθε pixel κωδικοποιούνται σε 1, 4, 8, 16 ή 24 bit (bits/pixel). Ο αριθμός των bit ανά pixel, που ονομάζεται επίσης βάθος χρώματος, καθορίζει τον μέγιστο αριθμό χρωμάτων σε μια εικόνα. Μια εικόνα με βάθος 1 bit/pixel μπορεί να έχει μόνο δύο χρώματα και με βάθος 24 bit/pixel - περισσότερα από 16 εκατομμύρια διαφορετικά χρώματα.

Το παρακάτω διάγραμμα δείχνει τη δομή ενός τυπικού αρχείου BMP που περιέχει μια εικόνα 256 χρωμάτων (8 bit/βάθος pixel). Το αρχείο χωρίζεται σε τέσσερις κύριες ενότητες: την κεφαλίδα του αρχείου γραφικών ράστερ, την κεφαλίδα πληροφοριών πίνακα ράστερ, τον πίνακα χρωμάτων και τα ίδια τα δεδομένα του πίνακα ράστερ. Η κεφαλίδα ενός αρχείου γραφικών ράστερ περιέχει πληροφορίες σχετικά με το αρχείο, συμπεριλαμβανομένης της διεύθυνσης στην οποία ξεκινά η περιοχή δεδομένων πίνακα ράστερ. Η κεφαλίδα πληροφοριών πίνακα ράστερ περιέχει πληροφορίες σχετικά με την εικόνα που είναι αποθηκευμένη στο αρχείο, όπως το ύψος και το πλάτος της σε pixel. Ο πίνακας χρωμάτων παρέχει τις τιμές βασικού χρώματος RGB (κόκκινο, πράσινο, μπλε) για τα χρώματα που χρησιμοποιούνται στην εικόνα. Τα προγράμματα που διαβάζουν και εμφανίζουν αρχεία BMP, όταν χρησιμοποιούν προσαρμογείς βίντεο που δεν επιτρέπουν την εμφάνιση περισσότερων από 256 χρωμάτων, μπορούν να ορίσουν μέσω προγραμματισμού τέτοιες τιμές RGB στις χρωματικές παλέτες των προσαρμογέων για ακριβή αναπαραγωγή χρωμάτων.

Η μορφή των πραγματικών δεδομένων πίνακα ράστερ σε ένα αρχείο BMP εξαρτάται από τον αριθμό των bit που χρησιμοποιούνται για την κωδικοποίηση των δεδομένων χρώματος για κάθε pixel. Με μια εικόνα 256 χρωμάτων, κάθε pixel στο τμήμα του αρχείου που περιέχει τα πραγματικά δεδομένα πίνακα ράστερ περιγράφεται από ένα byte (8 bit). Αυτή η περιγραφή εικονοστοιχείων δεν αντιπροσωπεύει τις τιμές χρώματος RGB, αλλά χρησιμεύει ως δείκτης για την είσοδο στον πίνακα χρωμάτων του αρχείου. Έτσι, εάν το R/G/B=255/0/0 αποθηκεύεται ως η πρώτη τιμή χρώματος RGB στον πίνακα χρωμάτων ενός αρχείου BMP, τότε η τιμή του εικονοστοιχείου 0 στον πίνακα ράστερ θα εκχωρηθεί με το έντονο κόκκινο χρώμα. Οι τιμές των εικονοστοιχείων αποθηκεύονται με σειρά από αριστερά προς τα δεξιά, ξεκινώντας (συνήθως) από την κάτω σειρά της εικόνας. Έτσι, σε ένα αρχείο BMP 256 χρωμάτων, το πρώτο byte δεδομένων πίνακα ράστερ είναι ο δείκτης για το χρώμα του εικονοστοιχείου που βρίσκεται στην κάτω αριστερή γωνία της εικόνας. το δεύτερο byte αντιπροσωπεύει το δείκτη για το χρώμα του εικονοστοιχείου δίπλα στα δεξιά, κ.λπ. Εάν ο αριθμός των byte σε κάθε σειρά είναι μονός, τότε προστίθεται ένα επιπλέον byte σε κάθε σειρά για να ευθυγραμμιστούν τα δεδομένα του πίνακα ράστερ σε όρια 16-bit .


Δεν έχουν όλα τα αρχεία BMP δομή όπως αυτή που φαίνεται στο διάγραμμα. Για παράδειγμα, τα αρχεία BMP 16 και 24 bit/pixel δεν έχουν πίνακες χρωμάτων. σε αυτά τα αρχεία, οι τιμές των pixel του πίνακα ράστερ χαρακτηρίζουν άμεσα τις τιμές χρώματος RGB. Οι μορφές εσωτερικής αποθήκευσης μεμονωμένων ενοτήτων του αρχείου ενδέχεται επίσης να διαφέρουν. Για παράδειγμα, πληροφορίες συστοιχίας ράστερ σε ορισμένα αρχεία BMP 16 και 256 χρωμάτων μπορούν να συμπιεστούν χρησιμοποιώντας τον αλγόριθμο RLE, ο οποίος αντικαθιστά ακολουθίες πανομοιότυπων εικονοστοιχείων εικόνας με διακριτικά που καθορίζουν τον αριθμό των εικονοστοιχείων στην ακολουθία και το χρώμα τους. Στα Windows, μπορείτε να εργαστείτε με αρχεία BMP τύπου OS/2 που χρησιμοποιούν διάφορες μορφές κεφαλίδων πίνακα ράστερ και πίνακα χρωμάτων.

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

Μορφοποιήστε δομές

Η μορφή bmp (από τις λέξεις BitMaP - χάρτης bit, ή, στα ρωσικά, πίνακας bit) είναι μια ασυμπίεστη (κυρίως) εικόνα που διαβάζεται και εμφανίζεται αρκετά εύκολα στο λειτουργικό σύστημα Windows, το οποίο διαθέτει ειδικές λειτουργίες API που βοηθούν.

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

Στην αρχή υπάρχει μια κεφαλίδα αρχείου (BITMAPFILEHEADER). Περιγράφεται ως εξής:

bfTypeκαθορίζει τον τύπο του αρχείου. Εδώ θα πρέπει να είναι BM. Εάν ανοίξετε οποιοδήποτε αρχείο BMP σε ένα πρόγραμμα επεξεργασίας κειμένου (ή καλύτερα, σε ένα δεκαεξαδικό πρόγραμμα επεξεργασίας), θα δείτε ότι οι δύο πρώτοι χαρακτήρες είναι BM (από τη λέξη BitMap, όπως πιθανώς ήδη μαντέψατε).
bfSizeείναι το μέγεθος του ίδιου του αρχείου σε byte. Αυστηρά μιλώντας, θα πρέπει να το υπολογίσετε (το οποίο συνιστάται), αλλά έβαλα λάθος το μέγεθος του αρχείου (αν και όχι επίτηδες :)) και δεν υπήρχαν προβλήματα (το ACDSee διαβάστηκε χωρίς προβλήματα, το πρόγραμμά μου λειτούργησε), αλλά δεν σας προτείνω γράψε το εσκεμμένα λάθος , ξαφνικά θα εμφανιστεί ένα ευσυνείδητο πρόγραμμα που θα συγκρίνει αυτό το μέγεθος με το πραγματικό και θα αποφασίσει ότι δεν είναι bmp, αλλά κάτι άλλο. Στην ιδανική περίπτωση, όλα τα προγράμματα, για να βεβαιωθούν ότι είναι πραγματικό bmp και όχι ψεύτικο, θα πρέπει, πρώτον, να ελέγξουν ότι το bfType περιέχει "BM" (χωρίς εισαγωγικά) και, δεύτερον, ότι το bfSize είναι ίσο με το μέγεθος του αρχείου .
bfReserved1 και bfReserved2είναι δεσμευμένα και πρέπει να είναι μηδέν.
bfOffBits. Αυτό είναι ένα από τα πιο σημαντικά πεδία αυτής της δομής. Δείχνει πού ξεκινά το ίδιο το bitmap σε σχέση με την αρχή του αρχείου (ή, όπως λέει το MSDN, "από την αρχή της δομής BITMAPFILEHEADER"), το οποίο περιγράφει την εικόνα. Δηλαδή, για να είστε σίγουροι ότι θα φτάσετε στην αρχή του πίνακα, πρέπει να γράψετε:

typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biΎψος;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrΣημαντικό;
) BITMAPINFOHEADER, * PBITMAPINFOHEADER;

biSizeείναι το μέγεθος της ίδιας της δομής. Πρέπει να αρχικοποιηθεί ως εξής: bih.biSize = sizeof(BITMAPINFOHEADER);
Εδώ πάλι θα υποθέσουμε ότι η Β-Ε δηλώνεται ως εξής: BITMAPINFOHEADER bih;
biWidth και biHightορίστε το πλάτος και το ύψος της εικόνας σε pixel, αντίστοιχα.
διπλά αεροπλάνακαθορίζει τον αριθμό των επιπέδων. Προς το παρόν είναι πάντα ρυθμισμένο στο 1.
biBitCount- Αριθμός bit ανά pixel. Θα μιλήσουμε περισσότερα για αυτό παρακάτω.
δισυμπίεσηυποδεικνύει το είδος της συμπίεσης. Μην εκπλαγείτε ή φοβάστε ότι το bmp βιώνει ξαφνικά συμπίεση. Προσωπικά δεν έχω δει περισσότερα από ένα συμπιεσμένα bmp (αλλά δεν λέω ότι δεν υπάρχουν). Εάν δεν υπάρχει συμπίεση, τότε αυτή η σημαία πρέπει να οριστεί σε BI_RGB. Σε αυτό το άρθρο μιλάμε για την ασυμπίεστη μορφή, επομένως δεν θα αναφέρω καν άλλες σημαίες. Φαίνεται ότι η ίδια δομή χρησιμοποιείται σε αρχεία JPEG και PNG, επειδή ξεκινώντας από τα Windows 98 υπήρχαν επιλογές BI_JPEG, που δείχνει ότι αυτή η εικόνα είναι JPEG και BI_PNG, ότι είναι PNG (δεν ξέρω τίποτα για τη μορφή Jpeg, Απλώς έβγαλα αυτά τα συμπεράσματα με βάση αυτά που γράφονται στο MSDN).
biSizeImageυποδεικνύει το μέγεθος της εικόνας σε byte. Εάν η εικόνα δεν είναι συμπιεσμένη (δηλαδή, το προηγούμενο πεδίο έχει οριστεί σε BI_RGB), τότε θα πρέπει να γραφτεί ένα μηδέν εδώ. biXPelsPerMeterΚαι biYPelsPerMeterυποδηλώνουν, αντίστοιχα, την οριζόντια και κάθετη ανάλυση (σε pixel ανά μέτρο) της τελικής συσκευής στην οποία θα βγει το bitmap (raster). Μια εφαρμογή μπορεί να χρησιμοποιήσει αυτήν την τιμή για να επιλέξει από μια ομάδα πόρων το πιο κατάλληλο bitmap για την επιθυμητή συσκευή. Το γεγονός είναι ότι η μορφή bmp είναι ουσιαστικά ένα ράστερ ανεξάρτητο από το υλικό, δηλαδή όταν η εμφάνιση αυτού που λαμβάνεται δεν εξαρτάται από το σε τι προβάλλεται αυτό το ράστερ (να το πω έτσι). Για παράδειγμα, μια εικόνα θα έχει την ίδια εμφάνιση ανεξάρτητα από το αν είναι σχεδιασμένη σε οθόνη οθόνης ή τυπωμένη σε εκτυπωτή. Αλλά η ανάλυση των συσκευών είναι διαφορετική και χρησιμοποιούνται αυτές οι παράμετροι ακριβώς για να επιλέξετε την πιο κατάλληλη εικόνα από τις διαθέσιμες.
biClrUsedκαθορίζει τον αριθμό των χρωμάτων που χρησιμοποιούνται από τον πίνακα. Εάν αυτή η τιμή είναι μηδέν, τότε το ράστερ χρησιμοποιεί τον μέγιστο αριθμό χρωμάτων που επιτρέπεται από την τιμή biBitCount. Αυτό ισχύει μόνο για συμπιεσμένες εικόνες. Εάν το biClrUsed δεν είναι μηδενικό και το biBitCount είναι μικρότερο από 16, τότε το biClrUsed καθορίζει τον τρέχοντα αριθμό των διαθέσιμων χρωμάτων της μηχανής γραφικών ή του προγράμματος οδήγησης συσκευής. Εάν το biBitCount είναι μεγαλύτερο ή ίσο με 16, τότε το biClrUsed καθορίζει το μέγεθος του πίνακα χρωμάτων που χρησιμοποιείται για τη βελτιστοποίηση της τρέχουσας παλέτας συστήματος.
biClrΣημαντικό- αυτός είναι ο αριθμός των σημαντικών χρωμάτων. Καθορίζει τον αριθμό των χρωμάτων που χρειάζονται για την απεικόνιση του σχεδίου. Εάν αυτή η τιμή είναι 0 (όπως είναι συνήθως), τότε όλα τα χρώματα θεωρούνται σημαντικά.

Τύποι μορφής BMP

Όλοι οι τύποι μορφής bmp υπό όρουςμπορεί να χωριστεί σε δύο τύπους: παλέτα και μη παλέτα. Δηλαδή, εάν η παλέτα χρησιμοποιείται σε μια δεδομένη μορφή ή όχι. Λάβετε υπόψη ότι η παλέτα μπορεί να είναι ακόμη και σε μορφές χωρίς παλέτες, αλλά δεν χρησιμοποιείται εκεί. Σε bmps χωρίς παλέτες, το χρώμα υπολογίζεται απευθείας από τα bit που μπαίνουν στο αρχείο, ξεκινώντας από ένα συγκεκριμένο σημείο. Και στις παλέτες, κάθε byte περιγράφει ένα ή περισσότερα pixel και οι τιμές byte (ή bit) είναι ο χρωματικός δείκτης στην παλέτα. Αρχικά, θα παράσχω έναν πίνακα που συγκρίνει τις πιθανές επιλογές. Ο τύπος της εικόνας (παλέτα ή χωρίς παλέτα) εξαρτάται από το πόσα bit δίνονται ανά pixel, δηλαδή από την τιμή biBitCount της δομής BITMAPINFOHEADER.

biBitCountΜορφή παλέτας ή μη παλέταςΜέγιστος δυνατός αριθμός χρωμάτωνΣημειώσεις 1 Παλέτα2 Μια δίχρωμη, προσέξτε, όχι απαραίτητα ασπρόμαυρη, εικόνα παλέτας. Εάν το bit ράστερ (που είναι ακριβώς από κάτω) επαναρυθμιστεί (ίσο με 0), τότε αυτό σημαίνει ότι το πρώτο χρώμα από την παλέτα θα πρέπει να βρίσκεται σε αυτό το μέρος και αν οριστεί (ίσο με 1), τότε το δεύτερο. 4 Παλέτα16 Κάθε byte περιγράφει 2 pixel. Εδώ είναι ένα παράδειγμα από το MSDN Εάν το πρώτο byte στην εικόνα είναι 0x1F, τότε αντιστοιχεί σε δύο pixel, το χρώμα του πρώτου είναι το δεύτερο χρώμα από την παλέτα (επειδή η αντίστροφη μέτρηση ξεκινά από το μηδέν) και το δεύτερο pixel είναι. το 16ο χρώμα της παλέτας. 8 Παλέτα256 Μία από τις πιο κοινές επιλογές. Αλλά ταυτόχρονα και τα πιο απλά. Η παλέτα καταλαμβάνει ένα kilobyte (αλλά είναι καλύτερα να μην υπολογίζετε σε αυτό). Ένα byte είναι ένα χρώμα. Επιπλέον, η τιμή του είναι ο αριθμός χρώματος στην παλέτα. 16 Χωρίς παλέτα2^16 ή 2^15Αυτή είναι η πιο μπερδεμένη επιλογή. Ας ξεκινήσουμε με το γεγονός ότι είναι χωρίς παλέτες, δηλαδή κάθε δύο byte (μία λέξη WORD) στο ράστερ ορίζουν μοναδικά ένα pixel. Αλλά να τι συμβαίνει: υπάρχουν 16 bit και υπάρχουν 3 στοιχεία χρώματος (Κόκκινο, Πράσινο, Μπλε). Αλλά το 16 δεν θέλει να διαιρεθεί με το 3. Επομένως, υπάρχουν δύο επιλογές εδώ. Το πρώτο είναι να χρησιμοποιήσετε 15 bit αντί για 16, και στη συνέχεια υπάρχουν 5 bit για κάθε στοιχείο χρώματος. Με αυτόν τον τρόπο μπορούμε να χρησιμοποιήσουμε το πολύ 2^15 = 32768 χρώματα και να πάρουμε ένα τριπλό R-G-B = 5-5-5. Αλλά τότε ένα ολόκληρο κομμάτι από τα 16 χάνεται μάταια, αλλά τυχαίνει τα μάτια μας, μεταξύ όλων των χρωμάτων, να αντιλαμβάνονται καλύτερα το πράσινο, οπότε αποφασίσαμε να δώσουμε αυτό το κομμάτι στο πράσινο στοιχείο, δηλαδή, τότε παίρνουμε το. τριπλό R-G-B = 5-6-5, και τώρα μπορούμε να χρησιμοποιήσουμε 2^16 = 65536 χρώματα. Αλλά το πιο δυσάρεστο είναι ότι χρησιμοποιούνται και οι δύο επιλογές. Το MSDN προτείνει ότι για να διακρίνετε πόσα χρώματα χρησιμοποιούνται, να συμπληρώσετε το πεδίο biClrUsed από τη δομή BITMAPINFOHEADER με αυτήν την τιμή. Για να επιλέξετε κάθε στοιχείο πρέπει να χρησιμοποιήσετε τις παρακάτω μάσκες. Για μορφή 5-5-5: 0x001F για μπλε στοιχείο, 0x03E0 για πράσινο και 0x7C00 για κόκκινο. Για τη μορφή 5-6-5: 0x001F - μπλε, 0x07E0 - πράσινο και 0xF800 κόκκινα στοιχεία, αντίστοιχα. 24 Χωρίς παλέτα2^24 Και αυτή είναι η απλούστερη μορφή. Εδώ 3 byte ορίζουν 3 χρωματικά συστατικά. Δηλαδή, ένα συστατικό ανά byte. Απλώς διαβάζουμε τη δομή RGBTRIPLE και χρησιμοποιούμε τα πεδία rgbtBlue, rgbtGreen, rgbtRed. Πηγαίνουν με αυτή τη σειρά. 32 Χωρίς παλέτα2^32 Εδώ 4 byte ορίζουν 3 συστατικά. Ωστόσο, ένα byte δεν χρησιμοποιείται. Μπορεί να χρησιμοποιηθεί, για παράδειγμα, για το κανάλι άλφα (διαφάνεια). Σε αυτήν την περίπτωση, είναι βολικό να διαβάσετε το ράστερ χρησιμοποιώντας δομές RGBQUAD, οι οποίες περιγράφονται ως εξής:

Αποθήκευση δεδομένων σε μορφή bmp

Λοιπόν, τώρα ερχόμαστε στο πιο ενδιαφέρον μέρος. Μετά τις δομές BITMAPFILEHEADER και BITMAPINFOHEADER έρχεται η παλέτα. Επιπλέον, εάν η μορφή είναι χωρίς παλέτες, τότε μπορεί να μην υπάρχει, ωστόσο, δεν πρέπει να υπολογίζετε σε αυτήν. Το γεγονός είναι ότι όταν μόλις άρχισα να καταλαβαίνω τη μορφή bmp, διάβασα σε ένα βιβλίο ότι, υποτίθεται, εάν η μορφή είναι χωρίς παλέτες, τότε δεν έχει καθόλου παλέτα. Υπήρχαν ακόμη και δύο εικόνες - διαγράμματα μορφής: η μία με παλέτα, η άλλη χωρίς. Και εκείνη την εποχή έγραφα ένα πρόγραμμα που λειτουργεί επιμελώς με αρχεία bmp. Και έπρεπε να μετατρέψω τις εισερχόμενες εικόνες από 256 χρώματα σε 24-bit (αν υπάρχουν) σε προσωρινά αρχεία. Και απλά δεν δημιούργησα μια παλέτα σε 24-bit (bfOffBits από τη δομή BITMAPFILEHEADER ήταν ίσο με το άθροισμα sizeof(BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER), και άφησα τα εισερχόμενα 24-bit αμετάβλητα. Με ράστερ 256 χρωμάτων τα πάντα λειτούργησε όπως θα έπρεπε, μέχρι που δεν συνάντησα μια εικόνα 24-bit που εμφανιζόταν σκουπίδια στο κάτω μέρος αντί για το απαιτούμενο μέρος, δεν κατάλαβα αμέσως τι ήταν λάθος μέχρι που συνέκρινα το μέγεθος του αρχικού αρχείου θεωρητικό που θα έπρεπε να υπήρχε αν δεν υπήρχε παλέτα. Η διαφορά αποδείχθηκε ότι ήταν 1024 bytes (αν και όλες οι εικόνες που συνάντησα είχαν μέγεθος παλέτας 256 χρωμάτων, ή 1 Kb), μετακινήστε πάντα μέσα από το αρχείο στην αρχή του ράστερ, χρησιμοποιώντας bfOffBits Η παλέτα είναι μια σειρά από δομές RGBQUAD η μία μετά την άλλη Δεν χρησιμοποιούνται όλα τα χρώματα στην παλέτα (αλλά μόνο, για παράδειγμα, 16), τότε συχνά εκχωρούνται 256 πεδία για την παλέτα A 256 * 4 = 1024, όπου το 4 είναι το μέγεθος της δομής RGBQUAD, δηλαδή το ίδιο λαμβάνεται ένα kilobyte.

Αμέσως μετά την παλέτα έρχεται το ίδιο το ράστερ. Εδώ είναι που τα πράγματα μπερδεύονται περισσότερο. Πρώτον, τα pixel περιγράφονται εδώ όπως γράφονται στον παραπάνω πίνακα, ανάλογα με τη μορφή. Και μπορούν να περιέχουν από μόνα τους την τιμή των στοιχείων χρώματος (για εκείνα χωρίς παλέτες) ή μπορεί να είναι ευρετήρια ενός πίνακα παλέτας. Η ίδια η εικόνα καταγράφεται γραμμή προς γραμμή. Δεύτερον, η εικόνα φαίνεται να είναι ανάποδη. Δηλαδή, γράφεται πρώτα η κάτω γραμμή, μετά η προτελευταία γραμμή και ούτω καθεξής μέχρι την κορυφή. Και, τρίτον, όπως γράφτηκε στο, εάν το μέγεθος της γραμμής ράστερ δεν είναι πολλαπλάσιο του 4, τότε συμπληρώνεται με 1 έως 3 κενά (μηδέν) byte έτσι ώστε το μήκος της γραμμής να είναι πολλαπλάσιο της παραγράφου. Αυτό είναι το πιο δυσάρεστο πράγμα. Το γεγονός είναι ότι για κάθε μορφή πρέπει να προσαρμόσετε αυτόν τον αριθμό των κενών byte (αν και μου αρέσει να γράφω μέρος της παλέτας εκεί, απλά δεν θέλω να δημιουργήσω επιπλέον μεταβλητές "μηδέν" εάν ούτως ή άλλως παραλείψετε αυτά τα byte και κανένας τα χρειάζεται). Παρέχω έναν πίνακα με τύπους που δείχνουν για ποια μορφή πόσα byte πρέπει να προστεθούν στο τέλος της γραμμής. Εκεί, η μεταβλητή Width, όπως μπορείτε να μαντέψετε, σημαίνει το πλάτος της εικόνας. Όλοι αυτοί οι τύποι καθιερώθηκαν πειραματικά. Θα δώσω ένα παράδειγμα μόνο για τις πιο χρησιμοποιούμενες μορφές. Για τα υπόλοιπα, μπορείτε να τα γράψετε μόνοι σας.

Παραδείγματα προγραμμάτων

Μπορείτε να κατεβάσετε όλες τις πηγές, δεν θα γράψω πολλά εδώ. Θα δώσω απλώς τις λειτουργίες με σχόλια.

Γεια σας 1. Δημιουργία εικόνας σε μορφή bmp.
Εδώ δημιουργείται μια μονόχρωμη εικόνα. Υπάρχουν τρία παραδείγματα τέτοιων λειτουργιών: δημιουργία bmp 8, 16 και 24 bit. Θα δώσω μόνο για 16-bit.

// Ας δημιουργήσουμε μια εικόνα σε μορφή bmp 16 bit όπως 5-5-5, η οποία θα είναι απλά μονόχρωμη
void CreateBmp555 (char * fname, χρώμα WORD)
{
ΧΕΙΡΙΣΜΟΣ hFile;
DWORD RW;
int i, j;

// Δηλώστε τις απαραίτητες δομές
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
Παλέτα BYTE[1024];

// Παλέτα
// Ας έχουμε μια εικόνα 35 x 50 pixel
int Πλάτος = 35 ;

int Ύψος = 50 ; memset(Παλέτα, 0, 1024);
// Στην παλέτα έχουμε μηδενικά, συμπληρώστε τα

memset (&bfh, 0 , sizeof (bfh) ); Bfh.bfType = 0x4D42 ;
// Ας υποδηλώσουμε ότι αυτό είναι bmp "BM" bfh.bfOffBits = sizeof (bfh) + sizeof (bih) + 1024 ;
// Η παλέτα καταλαμβάνει 1 Kb, αλλά δεν θα τη χρησιμοποιήσουμε
bfh.bfSize = bfh.bfOffBits +
μέγεθος(χρώμα) * Πλάτος * Ύψος + Ύψος * ((μέγεθος (χρώμα) * Πλάτος) % 4 ) ;
// Υπολογίστε το μέγεθος του τελικού αρχείου
memset (& bih, 0 , sizeof (bih) );
bih.biSize = sizeof(bih); // Έτσι πρέπει να είναι
bih.biBitCount = 16; // Χρησιμοποιούμε 5-5-5
bih.biCompression = BI_RGB;
// Χωρίς συμπίεση
bih.biΎψος = Ύψος;
bih.biWidth = Πλάτος;
bih.biPlanes = 1 ;

// Θα πρέπει να είναι 1
// Και τα υπόλοιπα πεδία παραμένουν 0
HFile = CreateFile (fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);

εάν (hFile == INVALID_HANDLE_VALUE)
επιστροφή ;
// Γράψτε τις κεφαλίδες

WriteFile (hFile, & bfh, sizeof (bfh) , & RW, NULL );
WriteFile (hFile, & bih, sizeof (bih) , & RW, NULL );
// Γράψτε την παλέτα< Height; i++ )
{
WriteFile(hFile, Palette, 1024, &RW, NULL);< Width; j++ )
{
για (i = 0; i
}

για (j = 0; j
WriteFile (hFile, & color, sizeof (χρώμα) , & RW, NULL );
}
// Ευθυγράμμιση με το περίγραμμα
}

WriteFile (hFile, Παλέτα, (μέγεθος (χρώμα) * Πλάτος) % 4 , & RW, NULL ) ;

CloseHandle(hFile) ;

χρώμα - χρώμα εικόνας. Η τιμή αυτής της μεταβλητής πρέπει να συμπληρωθεί σύμφωνα με τον πρώτο πίνακα. Μπορείτε να δείτε την εικόνα που προκύπτει στο ACDSee, για παράδειγμα. Μόλις προσπάθησα να το ανοίξω στο Photoshop, αλλά αποδείχθηκε ότι δεν μπορεί να τα διαβάσει σε αυτήν τη μορφή, αλλά μπορείτε :).
{
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
Παράδειγμα 2. Μετατροπή εικόνας από μορφή 8 bit (256 χρώματα) σε 24 bit.
BOOL Convert256To24 (char * fin, char * fout)
int Πλάτος, Ύψος;
Παλέτα RGBQUAD[ 256 ] ;
BYTE * inBuf;
DWORD RW;
RGBTRIPLE * outBuf;
int i, j;

HANDLE hIn, hOut.
DWORD OffBits;
Hin = CreateFile (fin, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

εάν (hIn == INVALID_HANDLE_VALUE)
επιστροφή FALSE?
{
HOut = CreateFile(fout, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
Hin = CreateFile (fin, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
}

εάν (hOut == INVALID_HANDLE_VALUE)
CloseHandle(hIn);
// Διαβάστε τα δεδομένα
ReadFile (hIn, & bfh, sizeof (bfh) , & RW, NULL );

ReadFile (hIn, & bih, sizeof (bih) , & RW, NULL );
ReadFile (hIn, Palette, 256 * sizeof (RGBQUAD) , & RW, NULL );
// Ρυθμίστε τον δείκτη στην αρχή του ράστερ
SetFilePointer (hIn, bfh.bfOffBits, NULL, FILE_BEGIN) ;
Width = bih.biWidth ;

Ύψος = bih.biΎψος ;
OffBits = bfh.bfOffBits ;
// Εκχώρηση μνήμης

inBuf = νέο BYTE [Πλάτος];
outBuf = νέο RGBTRIPLE [Πλάτος]; // Συμπληρώστε τις κεφαλίδες
bfh.bfOffBits = sizeof (bfh) + sizeof (bih) ;
// Ας μην γράψουμε παλέτα

bih.biBitCount = 24 ;
εάν (hFile == INVALID_HANDLE_VALUE)
bfh.bfSize = bfh.bfOffBits + 4 * Πλάτος * Ύψος + Ύψος * (Πλάτος % 4 ) ;
// Μέγεθος αρχείου

// Και τα υπόλοιπα παραμένουν αμετάβλητα
// Γράψτε την παλέτα< Height; i++ )
{
WriteFile (hOut, & bfh, sizeof (bfh) , & RW, NULL );
WriteFile(hFile, Palette, 1024, &RW, NULL);< Width; j++ )
{
WriteFile (hOut, & bih, sizeof (bih) , & RW, NULL );
outBuf[ j].rgbtGreen = Παλέτα[ inBuf[ j] ] .rgbGreen ;
outBuf[ j].rgbtBlue = Παλέτα[ inBuf[ j] ] .rgbBlue ;
}
WriteFile (hOut, outBuf, sizeof (RGBTRIPLE) * Πλάτος, & RW, NULL );

// Γράψτε σκουπίδια για στοίχιση
WriteFile (hOut, Παλέτα, Πλάτος % 4 , & RW, NULL ) ;
SetFilePointer(hIn, (3 * Πλάτος) % 4, NULL, FILE_CURRENT) ;
}

διαγραφή inBuf;
διαγραφή outBuf?
HOut = CreateFile(fout, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
CloseHandle(hOut);
επιστροφή TRUE?
}

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

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

Για παράδειγμα, σε αυτό το σχήμα επισημαίνεται αρχείο my-file.bmp, τότε πρέπει να κάνετε δεξί κλικ σε αυτό το αρχείο και να επιλέξετε την επιλογή στο μενού αρχείο "σάρωση με AVG". Όταν κάνετε αυτήν την επιλογή, το AVG Antivirus θα ανοίξει και θα σαρώσει το αρχείο για ιούς.


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

Μερικές φορές απλά επανεγκατάσταση του Adobe Illustrator CCμπορεί να λύσει το πρόβλημά σας συνδέοντας σωστά το BMP με το Adobe Illustrator CC. Σε άλλες περιπτώσεις, ενδέχεται να προκύψουν προβλήματα με συσχετίσεις αρχείων κακός προγραμματισμός λογισμικούπρογραμματιστή και ίσως χρειαστεί να επικοινωνήσετε με τον προγραμματιστή για περαιτέρω βοήθεια.


Συμβουλή:Δοκιμάστε να ενημερώσετε το Adobe Illustrator CC στην πιο πρόσφατη έκδοση για να βεβαιωθείτε ότι έχετε τις πιο πρόσφατες επιδιορθώσεις και ενημερώσεις.


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


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


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

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


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


Εάν τα βήματα δεν λύσουν το πρόβλημακαι εξακολουθείτε να αντιμετωπίζετε προβλήματα με το άνοιγμα αρχείων BMP, αυτό μπορεί να οφείλεται σε έλλειψη διαθέσιμων πόρων συστήματος. Ορισμένες εκδόσεις αρχείων BMP ενδέχεται να απαιτούν σημαντικό αριθμό πόρων (π.χ. μνήμη/RAM, ισχύς επεξεργασίας) για να ανοίξουν σωστά στον υπολογιστή σας. Αυτό το πρόβλημα είναι αρκετά κοινό εάν χρησιμοποιείτε αρκετά παλιό υλικό υπολογιστή και ταυτόχρονα ένα πολύ νεότερο λειτουργικό σύστημα.

Αυτό το πρόβλημα μπορεί να προκύψει όταν ο υπολογιστής δυσκολεύεται να συμβαδίσει με μια εργασία, επειδή το λειτουργικό σύστημα (και άλλες υπηρεσίες που εκτελούνται στο παρασκήνιο) ενδέχεται να καταναλώνουν πάρα πολλούς πόρους για να ανοίξετε ένα αρχείο BMP. Δοκιμάστε να κλείσετε όλες τις εφαρμογές στον υπολογιστή σας πριν ανοίξετε το Αρχείο εικόνας Bitmap. Η απελευθέρωση όλων των διαθέσιμων πόρων στον υπολογιστή σας θα σας προσφέρει τις καλύτερες συνθήκες για να προσπαθήσετε να ανοίξετε το αρχείο BMP.


Εάν εσείς ολοκλήρωσε όλα τα βήματα που περιγράφονται παραπάνωκαι το αρχείο BMP εξακολουθεί να μην ανοίγει, ίσως χρειαστεί να το εκτελέσετε ενημέρωση εξοπλισμού. Στις περισσότερες περιπτώσεις, ακόμη και όταν χρησιμοποιείτε παλαιότερες εκδόσεις υλικού, η ισχύς επεξεργασίας μπορεί να είναι ακόμη περισσότερο από επαρκής για τις περισσότερες εφαρμογές χρηστών (εκτός αν κάνετε πολλή εργασία με ένταση CPU, όπως απόδοση 3D, οικονομική/επιστημονική μοντελοποίηση ή εντατική εργασία πολυμέσων) . Ετσι, είναι πιθανό ο υπολογιστής σας να μην έχει αρκετή μνήμη(κοινώς ονομάζεται "RAM" ή μνήμη τυχαίας πρόσβασης) για να εκτελέσετε την εργασία ανοίγματος ενός αρχείου.




Κορυφή