C ++: ما هو أبسط وسيلة لقراءة وكتابة ملفات BMP باستخدام C ++ على ويندوز؟

StackOverflow https://stackoverflow.com/questions/199403

سؤال

وأود أن تحميل ملف BMP، والقيام ببعض العمليات عليها في الذاكرة، وإخراج ملف BMP جديد باستخدام C ++ على ويندوز (Win32 والأم). أنا على علم يماغيماغيك وانها C ++ ملزمة <لأ href = "http://www.imagemagick.org / ماغيك٪ 2B٪ 2B / "يختلط =" نوفولو noreferrer "> ماغيك ++ ، ولكن اعتقد انها مبالغة لهذا المشروع منذ أنا حاليا غير مهتم في تنسيقات الملفات الأخرى أو المنصات.

وماذا سيكون أبسط طريقة من حيث الإعداد كود لقراءة وكتابة ملفات BMP؟ الجواب قد يكون "مجرد استخدام ماغيك ++، فمن أبسط."

سؤال ذات صلة: ما هي أفضل مكتبة الصور التلاعب

هل كانت مفيدة؟

المحلول

عند وضع فقط لويندوز أنا عادة مجرد استخدام ATL CImage الدرجة

نصائح أخرى

EasyBMP إذا كنت تريد مجرد دعم BMP. I'ts بسيطا بما فيه الكفاية لبدء استخدام في غضون دقائق، وانها المتعدد إذا كنت بحاجة إلى ذلك.

وملف BMP يتكون من 3 الهياكل. A BITMAPFILEHEADER تليها BITMAPINFO متبوعا صفيف من البايت.

والطريقة أبسط المطلقة لتحميل ملف BMP باستخدام Win32 هو استدعاء CreateFile، GetFileSize، طلب & ReadFile وCloseHandle لتحميل صورة الملف في الذاكرة، ثم يلقي مجرد مؤشر إلى المخزن المؤقت لBITMAPFILEHEADER والذهاب من هناك.

وأكذب، وأبسط طريقة لاستدعاء LoadImage. مع التأكد من تمرير علامة LR_DIBSECTION لضمان أن يتم لا GDI تحويل الصورة المحملة في كل ما bitdepth العرض الأساسي الخاص بك تم تكوينه ل. وهذا له ميزة الحصول لكم HBITMAP التي يمكنك تحديدها في العاصمة، وبالتالي رسم في جميع أنحاء باستخدام GDI.

لحفظه ومع ذلك، لا يوجد طريق مختصر. تحتاج إلى إعداد BITMAPFILEHEADER، الكتابة بها، وملء في بنية BITMAPINFO، والكتابة التي بها، ومن ثم البيانات بكسل الفعلي.

CBitmap الطبقة يفعل BMP I / O.

#include <windows.h>

LoadImage

وأنا لم تستخدم ماغيك ++، ولكن ويندوز لديه مكتبة دعا مكون التصوير ويندوز التي من المحتمل أن تتناسب مع احتياجاتك.

وحاولت CImage على النحو الوارد أعلاه، ولكن كان لدي مجموعة C كاملة من القيم بكسل أنني ببساطة يريد تفريغ باعتباره BMP (أو أي شكل آخر). CImage لا يوجد لديه المنشئ لذلك، وأنا لا أريد أن ربط MFC (لCBitmap) ولا محاولة لفهم IWIC.

وماذا كان من السهل كان CIMG :

#include <cimg/cimg.h>
using namespace cimg_library;
//...
void SaveMyData(uint8_t *pxarray, int width, int height)
{
    CImg<uint8_t> img(pxarray, width, height);
    img.save_bmp("sav.bmp");
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top