سؤال

إليك سؤال سريع وسهل:باستخدام GDI+ من C++، كيف يمكنني تحميل صورة من بيانات البكسل في الذاكرة؟

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

المحلول

ربما لم يكن الأمر سهلاً كما كنت تأمل، ولكن يمكنك إنشاء ملف BMP في الذاكرة باستخدام بيانات البكسل الخاصة بك:

إذا لزم الأمر، قم بترجمة بيانات البكسل الخاصة بك إلى تنسيق متوافق مع BITMAP.إذا كان لديك بالفعل، على سبيل المثال، بيانات بيكسل RGB 24 بت، فمن المحتمل ألا تكون هناك حاجة إلى ترجمة.

قم بإنشاء (في الذاكرة) بنية BITMAPFILEHEADER، متبوعة ببنية BITMAPINFO.

الآن لديك الأشياء التي تحتاجها، وتحتاج إلى وضعها في IStream حتى يتمكن GDI+ من فهمها.ربما تكون الطريقة الأسهل (وإن لم تكن الأكثر أداءً) للقيام بذلك هي:

  1. قم باستدعاء GlobalAlloc() بحجم BITMAPFILEHEADER وBITMAPINFO وبيانات البكسل الخاصة بك.
  2. بالترتيب، انسخ بيانات BITMAPFILEHEADER وBITMAPINFO وبيانات البكسل إلى الذاكرة الجديدة (اتصل بـ GlobalLock للحصول على مؤشر الذاكرة الجديد).
  3. اتصل بـ CreateStreamOnHGlobal() للحصول على IStream لـ BMP الموجود في الذاكرة.

الآن، اتصل بأسلوب GDI+ Image::FromStream() لتحميل صورتك إلى GDI+.

حظ سعيد!

نصائح أخرى

وهناك منشئ نقطية الذي يأخذ BITMAPINFO ومؤشر إلى بيانات البكسل مباشرة، على سبيل المثال:

BITMAPINFO bmi;
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 32;
bmi.bmiHeader.biHeight = 32;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 24;
char data[32 * 32 * 3];
// Write pixels to 'data' however you want...
Gdiplus::Bitmap* myImage = new Gdiplus::Bitmap(&bmi, data);

وهذا موافق لصورة RGB، اذا كان صورة لوحة كنت بحاجة إلى تخصيص BITMAPINFO مع مساحة كافية للRGBQUADS الخ الخ.

استخدم SHCreateMemStream، فإنه يأخذ مؤشر إلى البيانات وحجم البيانات.

IStream *pStream = SHCreateMemStream((BYTE *) InputBuffer, Size);
// Do what you want
pStream->Release();

هل "بيانات بكسل في الذاكرة" تنسيق كنوع صورة معينة، أي، نقطية، TIF، PNG، وما إلى ذلك؟ إذا كان الأمر كذلك، والحصول عليها في تيار واستخدام System.Drawing.Image.FromStream.

هذه المقالة يصف كيف يمكنك تحميل GDI + صورة من و(الصليب الأحمر) ملف المورد. يجب تحميل صورة من الذاكرة تكون مشابهة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top