You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用WIN API(windows.h)的情况下通过RayLib获取显示器像素颜色

不用Win32 API获取屏幕像素的解决方案(兼容raylib)

方案1:直接用raylib内置的屏幕捕获API

raylib自带全屏捕获功能,不需要依赖Windows API就能实现像素读取,完全规避冲突问题:

// 捕获当前主显示器的全屏图像
Image screenCapture = LoadImageFromScreen();
// 获取指定坐标(x, y)的像素颜色(raylib坐标原点为屏幕左上角)
Color targetPixel = GetImageColor(screenCapture, x, y);
// 使用完记得释放图像资源
UnloadImage(screenCapture);

这个方法是最省心的,完全基于raylib自身接口,不会和任何系统头文件产生冲突。

方案2:用跨平台图形库实现(如SDL2)

如果需要更灵活的跨平台方案,可以引入SDL2(注意配置编译环境时要避免和raylib的链接冲突),核心代码如下:

#include <SDL2/SDL.h>

int main() {
    SDL_Init(SDL_INIT_VIDEO);
    // 创建全屏窗口捕获屏幕
    SDL_Window* window = SDL_CreateWindow("Screen Capture", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    
    // 获取屏幕分辨率
    int screenW, screenH;
    SDL_GetWindowSize(window, &screenW, &screenH);
    
    // 读取屏幕像素到缓冲区
    Uint32* pixelBuffer = malloc(screenW * screenH * sizeof(Uint32));
    SDL_RenderReadPixels(renderer, NULL, SDL_PIXELFORMAT_RGBA8888, pixelBuffer, screenW * sizeof(Uint32));
    
    // 读取(x, y)处的像素颜色
    Uint32 pixel = pixelBuffer[y * screenW + x];
    Uint8 r = (pixel >> 24) & 0xFF;
    Uint8 g = (pixel >> 16) & 0xFF;
    Uint8 b = (pixel >> 8) & 0xFF;
    Uint8 a = pixel & 0xFF;
    
    // 释放资源
    free(pixelBuffer);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

方案3:强制规避raylib与Windows.h的冲突(迫不得已时用)

如果必须使用Win32 API,可以通过编译宏屏蔽冲突部分:

  • 先包含Windows.h前定义宏,避免引入GDI/USER模块:
#define NOGDI
#define NOUSER
#include <windows.h>
#include "raylib.h"
  • 或者先包含raylib.h,再取消冲突宏定义后引入Windows.h:
#include "raylib.h"
#undef APIENTRY
#undef WINAPI
#include <windows.h>

这种方法需要根据实际冲突点调整宏定义,不如前两种方案稳定。

内容的提问来源于stack exchange,提问作者Вили Били

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:45:18