C ++ / Win32 و: كيفية الحصول على قناة ألفا من HBITMAP؟
سؤال
ولدي HBITMAP
التي تحتوي على بيانات قناة ألفا. أنا يمكن أن تجعل بنجاح هذه باستخدام وظيفة ::AlphaBlend
GDI.
ومع ذلك، عندما استدعاء الدالة ::GetPixel
GDI، وأنا لا نعود القيم مع عنصر ألفا. وثائق لا يقول أن تقوم بإرجاع قيمة RGB من بكسل.
هل هناك طريقة لاسترداد القيم قناة ألفا بكسل في HBITMAP
؟
وأريد أن أكون قادرة على الكشف عند استخدام :: AlphaBlend، وعندما لاستخدام أسلوب المدرسة القديمة لعلاج لون معين في HBITMAP مصدر كما شفافة.
HDC sourceHdc = ::CreateCompatibleDC(hdcDraw);
::SelectObject(sourceHdc, m_hbmp);
// This pixel has partial transparency, but ::GetPixel returns just RGB.
COLORREF c = ::GetPixel(sourceHdc, 20, 20);
// Draw the bitmap to hdcDraw
BLENDFUNCTION bf1;
bf1.BlendOp = AC_SRC_OVER;
bf1.BlendFlags = 0;
bf1.SourceConstantAlpha = 0xff;
bf1.AlphaFormat = AC_SRC_ALPHA;
::AlphaBlend(di.hdcDraw, x, 10, 64, 64, sourceHdc, 0, 0, 64, 64, bf1);
::DeleteDC(sourceHdc);
الإجابة
استخدم GetDIBits لاسترداد الأول (أو أكثر) مسح خط (ق) من الصورة:
byte* bits[1000];// = new byte[w * 4];
BITMAPINFO bmi;
memset(&bmi, 0, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = w;
bmi.bmiHeader.biHeight = -h;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 0;
bmi.bmiHeader.biYPelsPerMeter = 0;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
int rv = ::GetDIBits(sourceHdc1, m_hbmp, 0, 1, (void**)&bits, &bmi, DIB_RGB_COLORS);
//bits[3] == alpha of topleft pixel;
//delete[] bits;
المحلول
استخدم GetDIBits. وبهذه الطريقة يمكنك الحصول على مجموعة واسعة من وRGBQUAD التي يكون ربما يمكنك تخمين قناة ألفا بجانب R، G والمكونات B.
لا تنتمي إلى StackOverflow