Блокировка GDI + Bitmap в родном C ++? - PullRequest
2 голосов
/ 08 июня 2010

Я могу найти много примеров того, как сделать это в управляемом c ++, но ни одного для неуправляемого.

Я хочу получить все пиксельные данные настолько эффективно, насколько это возможно, но для некоторых вещей из scan0 мне нужно большеИнформация о том, чтобы я мог правильно перебрать данные пикселей и получить каждое значение rgba из него.

сейчас у меня есть это:

  Bitmap *b = new Bitmap(filename);
  if(b == NULL)
  {
   return 0;
  }

  UINT w,h;
  w = b->GetWidth();
  h = b->GetHeight();
  Rect *r = new Rect(0,0,w,h);
  BitmapData *lockdat;
 b->LockBits(r,ImageLockModeRead,PixelFormatDontCare,lockdat);

  delete(r);
  if(w == 0 && h == 0)
  {
   return 0;
  }

  Color c;

  std::vector<GLubyte> pdata(w * h * 4,0.0);

  for (unsigned int i = 0; i < h; i++) {
   for (unsigned int j = 0; j < w; j++) {
    b->GetPixel(j,i,&c);

    pdata[i * 4 * w + j * 4 + 0] = (GLubyte) c.GetR();
    pdata[i * 4 * w + j * 4 + 1] = (GLubyte) c.GetG();
    pdata[i * 4 * w + j * 4 + 2] = (GLubyte) c.GetB();
    pdata[i * 4 * w + j * 4 + 3] = (GLubyte) c.GetA();
   }
  }
  delete(b);

  return CreateTexture(pdata,w,h);

Как использовать lockdat, чтобы сделать эквивалентGetPixel?Спасибо

Ответы [ 2 ]

2 голосов
/ 08 июня 2010

lockdat-> Scan0 - указатель на данные пикселей растрового изображения. Обратите внимание, что действительно действительно заботятся о том, какой пиксельный формат вы запрашиваете, PixelFormatDontCare не подойдет Потому что, как вы используете указатель, зависит от формата пикселя. PixelFormat32bppARGB является самым простым, один пиксель будет иметь размер целого числа, 4 байта, представляющих альфа, красный, зеленый и синий. И шаг будет равен ширине растрового изображения. Вероятность того, что простой memcpy () выполнит свою работу. Осторожно, растровые изображения хранятся в обратном порядке.

0 голосов
/ 08 июня 2010
Bitmap *m_image = new Bitmap(...) // a 24-bit RGB bitmap

BitmapData bmData;
Rect rect(0, 0, m_image->GetWidth(), m_image->GetHeight());
m_image->LockBits(&rect , ImageLockModeRead , PixelFormat24bppRGB,&bmData  );
memcpy(your_bytes_buffer, bmData.Scan0, min(bmData.Height * bmData.Stride, your_buffer_size));
m_image->UnlockBits(&bmData);
...