package controller import ( "bytes" "encoding/base64" "fmt" "image" "image/png" rdpengine "ezops/pkg/rdp" "github.com/gorilla/websocket" ) // encodeRDPBitmapPNG 将实时 RGBA 脏矩形压缩为 PNG,避免原始整帧占满低带宽 WebSocket。 // Logan.Li func encodeRDPBitmapPNG(frame rdpengine.ServerFrame) (rdpengine.ServerFrame, error) { if frame.Type != "bitmap" || len(frame.RGBA) == 0 { return frame, nil } if frame.Width <= 0 || frame.Height <= 0 { return rdpengine.ServerFrame{}, fmt.Errorf("RDP 位图尺寸无效: %dx%d", frame.Width, frame.Height) } required := frame.Width * frame.Height * 4 if len(frame.RGBA) < required { return rdpengine.ServerFrame{}, fmt.Errorf("RDP 位图数据不足: got=%d want=%d", len(frame.RGBA), required) } img := image.NewRGBA(image.Rect(0, 0, frame.Width, frame.Height)) copy(img.Pix, frame.RGBA[:required]) var buf bytes.Buffer encoder := png.Encoder{CompressionLevel: png.BestSpeed} if err := encoder.Encode(&buf, img); err != nil { return rdpengine.ServerFrame{}, fmt.Errorf("压缩 RDP 位图失败: %w", err) } frame.Image = "data:image/png;base64," + base64.StdEncoding.EncodeToString(buf.Bytes()) frame.RGBA = nil return frame, nil } // writeCompressedRDPBitmap 发送浏览器已支持的 JSON PNG 帧,兼容现有前端绘制逻辑。 // Logan.Li func writeCompressedRDPBitmap(conn *websocket.Conn, frame rdpengine.ServerFrame) error { encoded, err := encodeRDPBitmapPNG(frame) if err != nil { return err } return conn.WriteJSON(encoded) }