C ++使用GetDIBits()读取像素 [英] c++ read pixels with GetDIBits()

查看:165
本文介绍了C ++使用GetDIBits()读取像素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图创建一个与Windows API GetPixel()函数等效的函数,但是我想创建屏幕的位图,然后读取该缓冲区.

I'm trying to create a function which is equivalent to the windows API GetPixel() function, but I want to create a bitmap of my screen and then read that buffer.

这就是我所拥有的(大多数副本是从Google搜索中粘贴过来的),当我运行它时,它只会打印出0.我想我大部分都正确,而且我的问题是我不知道如何读取BYTE变量.

This is what I've got (Mostly copy pasted from google searches), when I run it it only prints out 0's. I think I've got most of it right, and that my issue is that I don't know how to read the BYTE variable.

所以我的问题是,我该怎么做才能使其for循环打印出一些随机的颜色(R,G或B)?

So my question is, what do I need to do in order to get it to print out some random colors (R,G or B) with my for loop?

#include <Windows.h>
#include <iostream>
#include <math.h>
#include <stdio.h>

using namespace std;

int main() {

    HDC hdc,hdcMem;

    hdc = GetDC(NULL);
    hdcMem = CreateCompatibleDC(hdc); 

    HBITMAP hBitmap = CreateCompatibleBitmap(hdc, 1680, 1050);

    BITMAPINFO MyBMInfo = {0};
    MyBMInfo.bmiHeader.biSize = sizeof(MyBMInfo.bmiHeader); 
    // Get the BITMAPINFO structure from the bitmap
    if(0 == GetDIBits(hdcMem, hBitmap, 0, 0, NULL, &MyBMInfo, DIB_RGB_COLORS)) {
        cout << "error" << endl;
    }

    // create the bitmap buffer
    BYTE* lpPixels = new BYTE[MyBMInfo.bmiHeader.biSizeImage];

    MyBMInfo.bmiHeader.biSize = sizeof(MyBMInfo.bmiHeader);
    MyBMInfo.bmiHeader.biBitCount = 32;  
    MyBMInfo.bmiHeader.biCompression = BI_RGB;  
    MyBMInfo.bmiHeader.biHeight = abs(MyBMInfo.bmiHeader.biHeight); 

    // get the actual bitmap buffer
    if(0 == GetDIBits(hdc, hBitmap, 0, MyBMInfo.bmiHeader.biHeight, (LPVOID)lpPixels, &MyBMInfo, DIB_RGB_COLORS)) {
        cout << "error2" << endl;
    }

    for(int i = 0; i < 100; i++) {
        cout << (int)lpPixels[i] << endl;
    }

    return 0;
}

  • Windows 7
  • C :: B 13.12(控制台应用程序)
  • 编译器:mingw32-gcc
  • 已链接库gdi32
    • Windows 7
    • C::B 13.12 (Console Application)
    • Compiler: mingw32-gcc
    • Library gdi32 linked
    • 推荐答案

      按照约定,我将使用工作代码段添加一个新答案(我添加了缺少的lpPixels清理).请参阅我之前的答案中的讨论以及@enhzflep所做的讨论.

      As agreed, I'm adding a new answer with the working code snippet (I added the missing cleanup of lpPixels). See the discussions in my previous answer and the one made by @enhzflep.

      #include <Windows.h>
      #include <iostream>
      #include <math.h>
      #include <stdio.h>
      using namespace std;
      
      HBITMAP GetScreenBmp( HDC hdc) {
          // Get screen dimensions
          int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
          int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
      
          // Create compatible DC, create a compatible bitmap and copy the screen using BitBlt()
          HDC hCaptureDC  = CreateCompatibleDC(hdc);
          HBITMAP hBitmap = CreateCompatibleBitmap(hdc, nScreenWidth, nScreenHeight);
          HGDIOBJ hOld = SelectObject(hCaptureDC, hBitmap); 
          BOOL bOK = BitBlt(hCaptureDC,0,0,nScreenWidth, nScreenHeight, hdc,0,0,SRCCOPY|CAPTUREBLT); 
      
          SelectObject(hCaptureDC, hOld); // always select the previously selected object once done
          DeleteDC(hCaptureDC);
          return hBitmap;
      }
      
      int main() {
          HDC hdc = GetDC(0);
      
          HBITMAP hBitmap = GetScreenBmp(hdc);
      
          BITMAPINFO MyBMInfo = {0};
          MyBMInfo.bmiHeader.biSize = sizeof(MyBMInfo.bmiHeader); 
      
          // Get the BITMAPINFO structure from the bitmap
          if(0 == GetDIBits(hdc, hBitmap, 0, 0, NULL, &MyBMInfo, DIB_RGB_COLORS)) {
              cout << "error" << endl;
          }
      
          // create the bitmap buffer
          BYTE* lpPixels = new BYTE[MyBMInfo.bmiHeader.biSizeImage];
      
          // Better do this here - the original bitmap might have BI_BITFILEDS, which makes it
          // necessary to read the color table - you might not want this.
          MyBMInfo.bmiHeader.biCompression = BI_RGB;  
      
          // get the actual bitmap buffer
          if(0 == GetDIBits(hdc, hBitmap, 0, MyBMInfo.bmiHeader.biHeight, (LPVOID)lpPixels, &MyBMInfo, DIB_RGB_COLORS)) {
              cout << "error2" << endl;
          }
      
          for(int i = 0; i < 100; i++) {
              cout << (int)lpPixels[i];
          }
      
          DeleteObject(hBitmap);
          ReleaseDC(NULL, hdc);
          delete[] lpPixels;
          return 0;
      }
      

      这篇关于C ++使用GetDIBits()读取像素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆