- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有下面的 Ruby 代码,我正在使用 Windows API 调用,我应该能够使用函数 GetDIBits 从我创建的位图中检索 RGB 值数组,用于 AI 处理。我需要为 GetDIBits 函数提供一个 BITMAPINFO 结构以及一些其他变量。我应该可以接受其他变量,但是如何在 ruby 中创建一个可用于该函数的结构(使用 Windows API)?
请看下面的代码
如果您能完成 GetDIBits 函数以便我可以检索一组 RGB 值,我将不胜感激。
谢谢马丁
def getscreen()
width = Win32API.new("User32.dll","GetSystemMetrics",["L"],"L").call(0)
height = Win32API.new("User32.dll","GetSystemMetrics",["L"],"L").call(1)
#Get desktop DC, create a compatible dc, create a comaptible bitmap and select into compatible dc.
hddc = Win32API.new("User32.dll","GetDC",["L"],"L").call(Win32API.new("User32.dll","GetDesktopWindow",[],"L").call)
hcdc = Win32API.new("Gdi32.dll","CreateCompatibleDC",["L"],"L").call(hddc)
hbitmap = Win32API.new("Gdi32.dll","CreateCompatibleBitmap",["L","L","L"],"L").call(hddc,width,height)
Win32API.new("Gdi32.dll","SelectObject",["L","L"],"L").call(hcdc,hbitmap)
Win32API.new("Gdi32.dll","BitBlt",["L","L","L","L","L","L","L","L","P"],"L").call(hcdc,0,0,width,height,hddc,0,0,"SRCCOPY|CAPTUREBLT")
#save hbitmap to stream of byte as you mentioned
Win32API.new("Gdi32.dll","GetDIBits",["L","L","L","L","L","L","P"],"L").call(hcdc,hbitmap,1,1200,0,"DIB_RGB_COLORS")
pixelarray = Array.new
#Need a .call to fill the pixelarray array
Win32API.new("User32.dll","ReleaseDC",["L","L"],"L").call(Win32API.new("User32.dll","GetDesktopWindow",[],"L").call,hddc)
Win32API.new("Gdi32.dll","DeleteDC",["L"],"L").call(hcdc)
Win32API.new("Gdi32.dll","DeleteObject",["L"],"L").call(hbitmap)
#Print screen width and height
puts "Screen width: #{width}"
puts "Screen height: #{height}"
end
最佳答案
这段代码似乎得到了一些数据,虽然我没有仔细观察以判断它是否是来自屏幕的颜色:
require 'Win32API'
module Foo
GetSystemMetrics = Win32API.new "User32.dll", "GetSystemMetrics", ["L"], "L"
GetDC = Win32API.new "User32.dll", "GetDC", ["L"], "L"
GetDesktopWindow = Win32API.new "User32.dll", "GetDesktopWindow", [], "L"
CreateCompatibleDC = Win32API.new "Gdi32.dll", "CreateCompatibleDC", ["L"], "L"
CreateCompatibleBitmap = Win32API.new "Gdi32.dll", "CreateCompatibleBitmap", ["L","L","L"], "L"
SelectObject = Win32API.new "Gdi32.dll","SelectObject", ["L","L"], "L"
BitBlt = Win32API.new "Gdi32.dll","BitBlt", ["L","L","L","L","L","L","L","L","L"], "L"
CAPTUREBLT = 0x40000000
SRCCOPY = 0x00CC0020
GetDIBits = Win32API.new "Gdi32.dll","GetDIBits", ["L","L","L","L","P","P","L"], "L"
DIB_RGB_COLORS = 0
BI_RGB = 0
def self.getscreen
width = GetSystemMetrics.call 0
height = GetSystemMetrics.call 1
puts "Screen width: #{width}"
puts "Screen height: #{height}"
desktop_handle = GetDesktopWindow.call
raise "GetDesktopWindow failed" if desktop_handle == 0
hddc = GetDC.call desktop_handle
raise "Get DC failed." if hddc == 0
hcdc = CreateCompatibleDC.call hddc
raise "CreateCompatibleDC failed" if hcdc == 0
hbitmap = CreateCompatibleBitmap.call hddc, width, height
raise "CreateCompatibleBitmap failed" if hbitmap == 0
result = SelectObject.call hcdc, hbitmap
raise "SelectObject failed" if result == 0 # not sure if this is right
result = BitBlt.call hcdc, 0, 0, width, height, hddc, 0, 0, SRCCOPY | CAPTUREBLT
raise "BitBlt failed" if result == 0
SelectObject.call hcdc, 0 # attempt to deselect the bitmap because GetDIBits requires it?
size_in_bytes = width*height*4
bitmap_info = [40, #biSize
width,
height,
1, #biPlanes
32, #biBitCount
BI_RGB, #biCompression
size_in_bytes,
2000, #biXPelsPerMeter: not used?
2000, #biYPelsPerMeter: not used?
0, # biClrUsed
0 # biClrImportant
].pack("LLLSSLLLLLL") #+ [0,0,0,0].pack("LLLL")
buffer = (" " * size_in_bytes).force_encoding("BINARY")
result = GetDIBits.call hcdc, hbitmap, 0, height, buffer, bitmap_info, DIB_RGB_COLORS
raise "GetDIBits failed." if result == 0
puts "Number of scan lines copied: #{result}"
puts "buffer contents: " + buffer.strip.inspect[0,100] + " ..."
puts "First pixel = %02x,%02x,%02x,%02x" % [buffer[0].ord, buffer[1].ord, buffer[2].ord, buffer[3].ord]
return buffer
end
end
Foo.getscreen
当我在 Windows 中使用 ruby 1.9.2p180 运行它时的输出是:
Screen width: 1366
Screen height: 768
Number of scan lines copied: 768
buffer contents: "\x0F\f\a\xFF\x0F\f\a\xFF\x0F\f\a\xFF\x0F\f\a\xFF\x0F\f\a\xFF\x
0F\f\a\xFF\x0F\f\a\xFF\x0F\f\a\xFF\x0 ...
First pixel = 0f,0c,07,ff
如果您对我在这里所做的事情有任何疑问,请告诉我。
关于ruby - 在 ruby 中使用 GetDIBits 函数时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8691497/
我正在尝试使用以下代码使用 getDIBits 获取 1bpp 位图的位: HDC dcmem=NULL; PBYTE buf=NULL; LPBITMAPINFO bmpInfo; HBITMAP
我正在尝试通过 GetDIBits 从兼容位图中获取像素数组(它完全由 RGB(0,0,255) 颜色填充),但它返回另一种颜色。而且,当我尝试更改数组时,它实际上返回了一个异常。怎么了? case
首先我加载图像“cool.bmp”..加载没问题。然后我调用函数“getPixArray”,但它失败了。 case WM_CREATE:// runs once on creation of wi
MSDN 说在调用此函数之前不应将 GetDiBits 中使用的位图选入 DC。但根据我的经验(使用 BitBlt),我知道除非选择它,否则我无法绘制位图。 GetDiBits 是如何避免这种情况的?
var bitmap win.BITMAP win.GetObject(win.HGDIOBJ(hBitmap), unsafe.Sizeof(bitmap), unsafe.Pointer(&bit
我一直在尝试制作一个 SDL 程序,该程序能够截取整个屏幕的屏幕截图,在本例中,可以显示整个显示器屏幕的实时反馈。我已经成功地使用 GDI 函数检索图像,但我不知道在 GetDIBits() 函数返回
我可以使用 GetDIBits 加载当前窗口的颜色内容,但我不知道如何从某个位置加载图像的颜色。谁能告诉我怎么做? char str[256]; HDC hdc;
我想使用 GetDIBits 在 C++ 中加载位图。这是我正在使用的代码: HBITMAP hBmp = LoadBitmap(hInstance, MAKEINTRESOURCE(id)); BI
我正在尝试创建一个与 Windows API GetPixel() 函数等效的函数,但我想创建我的屏幕的位图,然后读取该缓冲区。 这就是我得到的(大部分是从谷歌搜索中复制粘贴的),当我运行它时它只打印
我目前正在编写一个扫描屏幕并查找像素的小程序。我的问题是 GetDIBits 函数似乎没有返回正确的屏幕截图。 将位图复制到剪贴板会将正确的屏幕图像放入剪贴板。我决定将函数的输出打印到一个 BMP 文
根据我使用此功能的经验,我对 GetDiBits 有一些疑问。我错误地创建了一个双倍于我需要的大小的位图: HBITMAP hBmpSection = CreateCompatibleBitmap(S
我正在使用 GetDIBits将屏幕兼容设备上下文中的位图数据转换为特定格式的 DIB。我的印象是,当源位图为每像素 8 位或更少时,DC 仅用于合成颜色表。由于我的源位图是一个完整的 32 位彩色图
我正在尝试使用 GetDIBits 函数获取位图的像素。由于我没有研究过 Windows GDI/API,所以我对第一个参数 HDC 非常不确定。我在 SO 和网络上搜索了无数帖子,但无法找到有关如何
GetDIBits() 没有将正确的 BGR 值传递给 COLORREF 数组: #include #include using namespace std; int main() {int i;
我正在尝试获取 PNG 图像的大小(不存储到文件中)。我正在使用 this code作为引用。当调用 GetDIBits() 时,图像的大小将更新为 bi.biSizeImage。当 bi.biCom
我调用了 GetDIBits,该调用在 32 位中完美运行,但在 64 位中失败。尽管句柄的值不同,bitmapinfo 结构的内容是相同的。 这是我能想到的重现错误的最小(至少稍微结构化)代码示例。
我正在抓取屏幕的一部分并扫描特定颜色范围的像素。 我看了MSDN's Capturing an Image示例并知道如何使用这些函数。 我可以将这些位放入数组中,但我不确定如何以可以像处理图像一样遍历
我有下面的 Ruby 代码,我正在使用 Windows API 调用,我应该能够使用函数 GetDIBits 从我创建的位图中检索 RGB 值数组,用于 AI 处理。我需要为 GetDIBits 函数
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我正在制作屏幕截图并将位图的位检索到字符缓冲区中。我想通过 winsock 将它发送到另一个程序。这是成功的,但发送位图会消耗处理器,所以我想压缩位图以通过 winsock 发送。 我应该使用哪些 G
我是一名优秀的程序员,十分优秀!