سؤال

أريد إنشاء وظيفة محصول في محرك موجود. هذا ما لدي بالفعل:

bool Bitmap::Crop(RECT cropArea)
{
BITMAP bm;
GetObject(m_Handle, sizeof(bm), &bm);

HDC hSrc = CreateCompatibleDC(NULL);
SelectObject(hSrc, m_Handle);

HDC hNew = CreateCompatibleDC(NULL);
HBITMAP hBmp = CreateCompatibleBitmap(hNew, bm.bmWidth, bm.bmHeight);
HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);

BitBlt(hNew, 0, 0, bm.bmWidth, bm.bmHeight, hSrc, 0, 0, SRCCOPY);

SelectObject(hNew, hOld);

DeleteDC(hSrc);
DeleteDC(hNew);

DeleteObject(m_Handle);

m_Handle = hBmp;
}

أريدها فقط نسخ الصورة بأكملها إلى hbitmap جديد واستبدالها القديم. لذلك أنا أعلم أنه يعمل. بعد ذلك هو مجرد اللعب مع معلمات bitblt.

m_handle هو hbitmap من نقطية الفئة.

نتيجة هذا الرمز هو مجرد شاشة سوداء.

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

المحلول

لا تقم أبدًا بإنشاء صورة نقطية متوافقة من العاصمة "الطازجة". ما لم تكن تريد إنشاء صورة نقطية 1BPP - صورة نقطية افتراضية تم تحديدها في ذاكرة جديدة DC هي صورة نقطية 1x1 1BPP - لذا فإن أي صورة نقطية متوافقة تقوم بإنشائها ستتطابق مع ذلك. الذي يميل إلى أن يؤدي إلى كل الإخراج الأسود.

صورة نقطية اللون في HSRC ، لذا استخدم الذي - التي العاصمة لجعل صورة نقطية جديدة.

نصائح أخرى

شكرا لمساعدتي. الوظيفة تعمل تماما الآن.

bool Bitmap::Crop(RECT cropArea)
{
HDC hSrc = CreateCompatibleDC(NULL);
SelectObject(hSrc, m_Handle);

HDC hNew = CreateCompatibleDC(hSrc);
HBITMAP hBmp = CreateCompatibleBitmap(hSrc, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 
HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);

bool retVal = (BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY))?true:false;

SelectObject(hNew, hOld);

DeleteDC(hSrc);
DeleteDC(hNew);

DeleteObject(m_Handle);

m_Handle = hBmp;

return retVal;
}

تغييران صغيران:

HBITMAP hBmp = CreateCompatibleBitmap(hNew, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 

BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY); 

قد ترغب في إجراء المزيد من الفحص للتأكد من أن المنطقة المطلوبة تقع ضمن حجم صورة نقطية أصلية.

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