【问题标题】:Locking a GDI+ Bitmap in Native C++?在本机 C++ 中锁定 GDI+ 位图?
【发布时间】:2010-06-09 02:17:05
【问题描述】:

我可以找到很多关于如何在托管 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 的等价物? 谢谢

【问题讨论】:

    标签: c++ gdi+


    【解决方案1】:

    lockdat->Scan0 是指向位图像素数据的指针。请注意,您真的关心您要求的像素格式,PixelFormatDontCare 不会这样做。因为你如何使用指针会受到像素格式的影响。 PixelFormat32bppARGB 是最简单的,一个像素将是一个 int 的大小,4 个字节代表 alpha、red、green 和 blue。并且步幅将等于位图的宽度。使一个简单的 memcpy() 很可能完成工作。注意位图是倒置的。

    【讨论】:

      【解决方案2】:
      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);
      

      【讨论】:

        猜你喜欢
        • 2013-07-13
        • 2011-06-06
        • 2013-04-07
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        • 2017-09-09
        • 1970-01-01
        相关资源
        最近更新 更多