126 lines
5.2 KiB
C#
126 lines
5.2 KiB
C#
using System.Text.Json;
|
||
|
||
namespace SHH.CameraDashboard
|
||
{
|
||
public partial class CameraRepository
|
||
{
|
||
public async Task<bool> UpdateImageProcessingAsync(CameraEditInfo dto)
|
||
{
|
||
if (dto == null) return false;
|
||
|
||
var serviceNode = AppGlobal.UseServiceNode;
|
||
if (serviceNode == null) return false;
|
||
|
||
// 1. 使用专用的 Processing 路由
|
||
string requestUrl = $"http://{serviceNode.ServiceNodeIp}:{serviceNode.ServiceNodePort}{WebApiRoutes.Cameras.Processing(dto.Id.ToString())}";
|
||
|
||
// 2. 解析分辨率字符串 (例如 "1920x1080" -> 1920, 1080)
|
||
int width = 1280; // 默认值
|
||
int height = 720;
|
||
|
||
if (!string.IsNullOrWhiteSpace(dto.TargetResolution))
|
||
{
|
||
var parts = dto.TargetResolution.ToLower().Split('x');
|
||
if (parts.Length == 2)
|
||
{
|
||
int.TryParse(parts[0], out width);
|
||
int.TryParse(parts[1], out height);
|
||
}
|
||
}
|
||
|
||
try
|
||
{
|
||
// 2. 构建精简的专用 JSON Payload
|
||
// 只包含图像处理相关的字段,不发送其他干扰信息
|
||
var payload = new
|
||
{
|
||
// --- 分辨率 (拆分成 int) ---
|
||
targetWidth = width,
|
||
targetHeight = height,
|
||
|
||
// 确保这些字段名与后端 Processing 接口的定义一致
|
||
useGrayscale = dto.UseGrayscale,
|
||
enhanceImage = dto.EnhanceImage,
|
||
|
||
// 缩放控制
|
||
allowShrink = dto.AllowShrink,
|
||
allowEnlarge = dto.AllowEnlarge, // 这里使用你确认过的 AllowEnlarge
|
||
|
||
// 目标分辨率
|
||
targetResolution = dto.TargetResolution ?? ""
|
||
};
|
||
|
||
string jsonBody = JsonHelper.Serialize(payload);
|
||
|
||
// 3. 发送请求
|
||
// 通常专用功能接口使用 POST 或 PUT。根据你的路由命名(Processing 是名词/动词),
|
||
// 且是对资源的部分修改,PUT 的可能性较大;但如果是“执行处理”,也可能是 POST。
|
||
// 建议先试 PUT (因为是 Update 操作),如果报 405 则改 POST。
|
||
await WebApiService.Instance.PostAsync(requestUrl, jsonBody, "图像处理配置");
|
||
|
||
return true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
System.Diagnostics.Debug.WriteLine($"更新图像处理配置失败: {ex.Message}");
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// [新增] 获取指定设备的图像处理配置
|
||
/// 对应后端: GET /api/cameras/{id}/processing
|
||
/// </summary>
|
||
public async Task<CameraEditInfo> GetImageProcessingAsync(long id)
|
||
{
|
||
var serviceNode = AppGlobal.UseServiceNode;
|
||
if (serviceNode == null) return null;
|
||
|
||
// 1. 拼接 URL: http://.../api/Cameras/1001/processing
|
||
string requestUrl = $"http://{serviceNode.ServiceNodeIp}:{serviceNode.ServiceNodePort}{WebApiRoutes.Cameras.Root}/{id}/processing";
|
||
|
||
try
|
||
{
|
||
// 2. 发送 GET 请求
|
||
string jsonResponse = await WebApiService.Instance.GetAsync(requestUrl, "获取图像处理配置");
|
||
if (string.IsNullOrEmpty(jsonResponse)) return null;
|
||
|
||
// 3. 解析后端返回的 ProcessingOptions JSON
|
||
// 注意:这里定义一个临时类来匹配后端 JSON 结构,确保字段名一致
|
||
var options = JsonHelper.Deserialize<ProcessingOptionsDto>(jsonResponse);
|
||
if (options == null) return null;
|
||
|
||
// 4. 映射回 CameraEditInfo 给 ViewModel 使用
|
||
return new CameraEditInfo
|
||
{
|
||
Id = id,
|
||
// 将宽高拼回 "1920x1080" 格式
|
||
TargetResolution = $"{options.targetWidth}x{options.targetHeight}",
|
||
|
||
// 映射开关 (注意字段名对应关系)
|
||
AllowShrink = options.enableShrink,
|
||
AllowEnlarge = options.enableExpand, // 后端叫 EnableExpand
|
||
EnhanceImage = options.enableBrightness
|
||
};
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
System.Diagnostics.Debug.WriteLine($"[Repository] 获取图像配置失败: {ex.Message}");
|
||
return null;
|
||
}
|
||
}
|
||
|
||
// [内部类] 用于接收后端 JSON 的 DTO
|
||
// 字段名需与后端 ProcessingOptions 序列化出来的 JSON 字段一致 (通常是 camelCase)
|
||
private class ProcessingOptionsDto
|
||
{
|
||
public int targetWidth { get; set; }
|
||
public int targetHeight { get; set; }
|
||
public bool enableShrink { get; set; }
|
||
public bool enableExpand { get; set; } // 对应后端的 EnableExpand
|
||
public bool enableBrightness { get; set; } // 对应后端的 EnableBrightness
|
||
public int brightness { get; set; }
|
||
}
|
||
}
|
||
}
|