الحصول على قيمة البكسل لملف BMP
سؤال
حصلت على سؤال لقراءة صورة BMP. كيف يمكنني الحصول على قيمة البيكسل (R ، G ، B قيم) في صورة BMP؟ هل يمكن لأي شخص مساعدتي في استخدام لغة البرمجة C؟
المحلول
تتمثل الطريقة السهلة في العثور على مكتبة معالجة صور جيدة للمنصة التي اخترتها واستخدامها.
- لينكس إيمليب / GDK-Pixbuf (Gnome/GTK) / صورة QT (KDE/QT) يجب أن تكون قادرة على فعل ما تحتاجه.
- شبابيك لست على دراية بمكتبة النظام المناسبة ، ولكن MSDN ابحث عن "صورة نقطية" ربما يكون مكانًا جيدًا للبدء.
- ماك OSX الكاكاو لديه بعض قدرات معالجة الصور ، انظر هذه المقالة.
الطريقة الصعبة هي فتح الملف وتفسير البيانات الثنائية في الواقع. للقيام بذلك ستحتاج إلى مواصفات ملف BMP. أوصي بتجربة الطريق السهل أولاً.
نصائح أخرى
ملاحظة: قد تحتاج إلى الحصول على بايت إضافي لقيم ألفا إذا كان BMP الخاص بك يحتوي على قناة ألفا. في هذه الحالة ستكون الصورة image[pixelcount][4]
, ، وستضيف آخر getc(streamIn)
خط لعقد هذا الفهرس الرابع. تحولت BMP الخاصة بي إلى عدم الحاجة إلى ذلك.
// super-simplified BMP read algorithm to pull out RGB data
// read image for coloring scheme
int image[1024][3]; // first number here is 1024 pixels in my image, 3 is for RGB values
FILE *streamIn;
streamIn = fopen("./mybitmap.bmp", "r");
if (streamIn == (FILE *)0){
printf("File opening error ocurred. Exiting program.\n");
exit(0);
}
int byte;
int count = 0;
for(i=0;i<54;i++) byte = getc(streamIn); // strip out BMP header
for(i=0;i<1024;i++){ // foreach pixel
image[i][2] = getc(streamIn); // use BMP 24bit with no alpha channel
image[i][1] = getc(streamIn); // BMP uses BGR but we want RGB, grab byte-by-byte
image[i][0] = getc(streamIn); // reverse-order array indexing fixes RGB issue...
printf("pixel %d : [%d,%d,%d]\n",i+1,image[i][0],image[i][1],image[i][2]);
}
fclose(streamIn);
~ locutus
تحتاج إلى دراسة تنسيق ملف BMP. من الأسهل قراءة ملفات BMP غير مضغوطة 24 بت. أنها تحتوي فقط على رأس في البداية وقيم RGB لكل بكسل.
للبدء بهذا ، تحقق من مثال صورة 2x2 صورة نقطية على http://en.wikipedia.org/wiki/bmp_file_format. اتبع الخطوات أدناه.
- قم بإنشاء صورة 2x2 BMP الموضحة على ويكيبيديا.
- افتح الملف في الوضع الثنائي باستخدام برنامج C الخاص بك.
- تسعى إلى الموقف البايت 54.
- اقرأ 3 بايت.
ستكون البايتات 0 و 0 و 255 على التوالي. (لست متأكدًا مما إذا كان الطلب هو RGB. لقد فعلت هذا منذ فترة طويلة وأعتقد أن الأمر ليس RGB. فقط تحقق من هذا.)
بهذه البساطة! ادرس رأس BMP لفهم المزيد حول التنسيق.