如何计算图形流屏幕上特定像素的位置

本文关键字:像素 位置 屏幕 何计算 计算 图形 | 更新日期: 2023-09-27 18:24:23

如何计算图形流中特定像素的位置?这个流是我的主监视器的屏幕截图。假设我想要像素的位置:

0, 0  
0, 10  
10, 0  
10, 10

我正在使用DirectX 9 SDK
以下是我(从本教程中)用来计算位置的部分代码:

const int Bpp = 4;
int o = 20;
int m = 8;
int screenWidthMinusM = Screen.PrimaryScreen.Bounds.Width - m;
int screenHeightMinusM = Screen.PrimaryScreen.Bounds.Height - m;
int bx = (screenWidthMinusM - m) / 3 + m;
int by = (screenHeightMinusM - m) / 3 + m;
int bx2 = (screenWidthMinusM - m) * 2 / 3 + m;
int by2 = (screenHeightMinusM - m) * 2 / 3 + m;
long x, y;
long pos;
y = m;
for (x = m; x < screenWidthMinusM; x += o)
{
   pos = (y * Screen.PrimaryScreen.Bounds.Width + x) * Bpp;  
   if (x < bx) tlPos.Add(pos);
   else if (x > bx && x < bx2) tPos.Add(pos);
   else if (x > bx2) trPos.Add(pos);
}

但这返回的集合的数字从大约53000到大约700000(来自另一种类似的方法)。提取该颜色后

Surface s = sc.CaptureScreen();
GraphicsStream gs = s.LockRectangle(LockFlags.None);
byte[] bu = new byte[4];    
foreach (long pos in positions)
{
    gs.Position = pos;
    gs.Read(bu, 0, 4);
    r += bu[2];
    g += bu[1];
    b += bu[0];
    i++;
}

我需要制作包含这些位置的自己的收藏。

如何计算图形流屏幕上特定像素的位置

我假设您的屏幕截图的所有像素都在这个图形流(doc)中,并希望在指定像素位置(x,y)的流中获得索引。

因此它应该很容易:Index = (x + y * screenwidth) * SizeOf(Pixel)

为了读取数据,您应该将SeekRead结合起来。

好的,我找到了答案,它在我的代码中,我不完全理解为什么,但是:

//x - screen width
//y - screen height
Bpp = 4; // ?
gs.Position = (x * Screen.PrimaryScreen.Bounds.Width + y) * Bpp;