سؤال

ولدي 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.

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