Golang使用SDL2进行图像处理的方法
Golang使用SDL2进行图像处理的方法 大家好 我正在使用这个sdl2库: https://godoc.org/github.com/veandco/go-sdl2 但我遇到了很多问题,如果有人有sdl2使用经验请帮帮我。这是我的第一个问题:我想获取可用的显示器数量,这是我的代码:
sdl.Init(sdl.INIT_VIDEO)
Num,err :=sdl.GetNumVideoDisplays()
fmt.Println(Num)
if err!=nil {
fmt.Println(err)
}
但是当我连接另一个显示器并调用这个函数时,它返回的数量还是一样。我尝试重新调用Init函数但没有成功。
更多关于Golang使用SDL2进行图像处理的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我在Windows和Linux上都运行过,不过目前是在Windows上
更多关于Golang使用SDL2进行图像处理的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
它只是两个都返回1吗?
你是重新启动实际程序,还是只是在连接另一个显示器后再次检查结果?不确定 SDL2 是否支持显示器的热插拔。
你在哪个平台上运行?Windows、Linux 还是 Mac OS?
是的,这正是我想要实现的功能。我有一台带HDMI接口的投影仪,当投影仪关闭时电脑无法识别它,这就像我插入了另一个显示器一样。
很抱歉回复晚了,重启程序确实有效,但是我们能否在不退出整个程序的情况下重新启动 SDL 本身?
啊,我明白了。请检查重启程序后是否正常工作。SDL2可能只在程序启动时枚举显示器数量,而不是在调用GetNumVideoDisplays()函数时进行枚举。
在SDL2中,GetNumVideoDisplays() 函数返回的是系统检测到的显示器数量,但需要确保在调用之前正确初始化SDL的视频子系统。您的问题可能是由于显示器连接状态变化后SDL没有重新检测导致的。
以下是修正后的代码示例:
package main
import (
"fmt"
"github.com/veandco/go-sdl2/sdl"
)
func main() {
// 初始化SDL视频子系统
if err := sdl.Init(sdl.INIT_VIDEO); err != nil {
fmt.Printf("初始化SDL失败: %v\n", err)
return
}
defer sdl.Quit()
// 获取显示器数量
numDisplays, err := sdl.GetNumVideoDisplays()
if err != nil {
fmt.Printf("获取显示器数量失败: %v\n", err)
return
}
fmt.Printf("检测到的显示器数量: %d\n", numDisplays)
// 获取每个显示器的详细信息
for i := 0; i < numDisplays; i++ {
displayName, err := sdl.GetDisplayName(i)
if err != nil {
fmt.Printf("获取显示器 %d 名称失败: %v\n", i, err)
continue
}
displayBounds, err := sdl.GetDisplayBounds(i)
if err != nil {
fmt.Printf("获取显示器 %d 边界失败: %v\n", i, err)
continue
}
fmt.Printf("显示器 %d: 名称=%s, 位置=(%d,%d), 分辨率=%dx%d\n",
i, displayName,
displayBounds.X, displayBounds.Y,
displayBounds.W, displayBounds.H)
}
}
如果显示器连接状态发生变化,您可能需要重新初始化SDL或使用事件检测:
// 检测显示器变化事件
func monitorChangeDetection() {
sdl.AddEventWatchFunc(func(event sdl.Event) bool {
switch event.GetType() {
case sdl.DISPLAYEVENT_CONNECTED:
fmt.Println("新显示器已连接")
// 重新获取显示器信息
num, _ := sdl.GetNumVideoDisplays()
fmt.Printf("当前显示器数量: %d\n", num)
case sdl.DISPLAYEVENT_DISCONNECTED:
fmt.Println("显示器已断开")
// 重新获取显示器信息
num, _ := sdl.GetNumVideoDisplays()
fmt.Printf("当前显示器数量: %d\n", num)
}
return false
}, nil)
}
确保在调用SDL函数前正确初始化,并在程序结束时调用sdl.Quit()。如果问题仍然存在,可能需要检查系统的显示器检测机制或SDL的版本兼容性。

