From d5f32bfadb2b2cde6a758dde2826b6f041279af6 Mon Sep 17 00:00:00 2001 From: "zhengxuan.zhang" Date: Sat, 14 Mar 2026 21:27:09 +0800 Subject: [PATCH] =?UTF-8?q?#0018=20=E4=BF=AE=E5=A4=8D=E5=9B=BE=E5=83=8F?= =?UTF-8?q?=E5=A4=84=E7=90=86=E7=95=8C=E9=9D=A2=E5=8F=82=E6=95=B0=E5=8C=BA?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=85=A8=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9B=E5=B0=86=E5=8F=82=E6=95=B0=E5=8F=8A=E7=AE=97=E5=AD=90?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E6=94=B9=E4=B8=BA=E4=B8=AD=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- XplorePlane/App.xaml.cs | 9 +++++ .../Libs/ImageProcessing/ImageROIControl.dll | Bin 0 -> 39424 bytes .../ImageProcessing.Controls.resources.dll | Bin 0 -> 4096 bytes .../ImageProcessing.Processors.resources.dll | Bin 0 -> 16384 bytes .../Services/IImageProcessingService.cs | 1 + .../Services/ImageProcessingService.cs | 9 +++++ .../ViewModels/ImageProcessingViewModel.cs | 33 ++++++++++++------ .../Views/ImageProcessingPanelView.xaml | 10 +++--- .../Views/ImageProcessingPanelView.xaml.cs | 5 ++- XplorePlane/Views/ImageProcessingWindow.xaml | 4 +-- XplorePlane/XplorePlane.csproj | 6 ++++ XplorePlane/readme.txt | 4 ++- 12 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 XplorePlane/Libs/ImageProcessing/ImageROIControl.dll create mode 100644 XplorePlane/Libs/ImageProcessing/zh-CN/ImageProcessing.Controls.resources.dll create mode 100644 XplorePlane/Libs/ImageProcessing/zh-CN/ImageProcessing.Processors.resources.dll diff --git a/XplorePlane/App.xaml.cs b/XplorePlane/App.xaml.cs index 07dfcb3..a15cf4d 100644 --- a/XplorePlane/App.xaml.cs +++ b/XplorePlane/App.xaml.cs @@ -1,5 +1,7 @@ using System; +using System.Globalization; using System.IO; +using System.Threading; using System.Windows; using XplorePlane.Views; using XplorePlane.ViewModels; @@ -21,6 +23,13 @@ namespace XplorePlane { protected override void OnStartup(StartupEventArgs e) { + // 强制使用中文 UI,确保 ImageProcessing 库显示中文 + var zhCN = new CultureInfo("zh-CN"); + Thread.CurrentThread.CurrentCulture = zhCN; + Thread.CurrentThread.CurrentUICulture = zhCN; + CultureInfo.DefaultThreadCurrentCulture = zhCN; + CultureInfo.DefaultThreadCurrentUICulture = zhCN; + // 配置 Serilog 日志系统 ConfigureLogging(); diff --git a/XplorePlane/Libs/ImageProcessing/ImageROIControl.dll b/XplorePlane/Libs/ImageProcessing/ImageROIControl.dll new file mode 100644 index 0000000000000000000000000000000000000000..b25bcf4b980e72032070d6265e20d82af4158a4b GIT binary patch literal 39424 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 literal 0 HcmV?d00001 diff --git a/XplorePlane/Libs/ImageProcessing/zh-CN/ImageProcessing.Controls.resources.dll b/XplorePlane/Libs/ImageProcessing/zh-CN/ImageProcessing.Controls.resources.dll new file mode 100644 index 0000000000000000000000000000000000000000..e2402996cef46cdbd6754aa0910e7f0dc2740960 GIT binary patch literal 4096 zcmeHKU2GIp6h1@Czf_2XKopp!t)P@)x4YZjHK5yesjfo1>6XSQ5oUHTW#a5iGc${n z2i+)`AP-<-LV~<$q7wgNAgv_gn-3=VW;Br)9$L`&z>7~lh~K%hv)i(QVtgW;={@(H zbI(2Z{M?`I?iWr`3lX)V-MmROjh-PR@tsi>!)+Tcw$b^em)ob6U6tYoB14p_8(~2W_7go2 z(s$FVb=T#rCE%Z#Ghg$?VIO>aArQu7tTn&ENl=OQYp&-O!AajTAm-!*oP-R#*IZ#a zP?WyzhnQ`(q0NB|QU4rPk}El{0QPMGEu;_Ii6Yn#ij)%NRid$wsmbotjX?LiZ*N@U zDQ}}$g-OpBWo<-wPQ@(>uTG5!y(HXjwd@rg*D{T6bxgRP>DW8sT7>DR%-#>c&)SH0{3Rifx zU#V4vYkY{46pO^7X)vgp1w4b+@hWNt|FdWv1>ZI8agR0LLCk!VI`$OkENDIw9Z&Dc zWzl~O{wVYPmSdo2fJj-qnrJB(@{g_Qkp!dC5<_(h3* ziO&Et1o|A&Qrb=%X_dt5ByN}ZF^M%=PMxG-7UPE{?tonll{!SN)zA`5O8A)+r8Q*G zE3^!lTcEi(SeR)0Zl_eS#FG^6KdNt@1C}WI*of5Ud7^AslcT0@i9R3MG%CIzt>`;$ zeQ>}jPw4h!V>q0Zcd|`R+V`zz4!a@H`Nn^U*uoE@Y}@? z-l8Q_NA`}bi(fsydUVs)N6xJO;p-clzkg}b`B#n|Ik{%0RaKO>^$M-MotH#0g|sN& z0b7h-J*mgiB_k%%u~H&o7$rU46HV(qA{Ei2$=*~?Jeo|zaPuj&SkBQR>{abvV{!x2 zDpSo6-hYjeeFKi0wXEH`X$N~l2#s^faI*_`VMY5Z?2 zt(7_v3colRpovCl9o8R!y)sS6H6{^}4o*n>IZ!$*id!C#U>!})wB^bUe3RER?Ugpe zXtJ2=;gMnACg%D6Uu;Kk^DFiE#$elp^+rCTxJ@JVMp$tZ^f{ya$hqis_}Pf?Zhg>T zgX3|i0xEb;H9VdcK8DSBZ4}xCopHGmXLf=np=&~N5MGcxzK5k>!!50PoHOVgLXD literal 0 HcmV?d00001 diff --git a/XplorePlane/Libs/ImageProcessing/zh-CN/ImageProcessing.Processors.resources.dll b/XplorePlane/Libs/ImageProcessing/zh-CN/ImageProcessing.Processors.resources.dll new file mode 100644 index 0000000000000000000000000000000000000000..be92f77078b4312757a3639230eed587673a7401 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/XplorePlane/Services/IImageProcessingService.cs b/XplorePlane/Services/IImageProcessingService.cs index 45b4692..365c775 100644 --- a/XplorePlane/Services/IImageProcessingService.cs +++ b/XplorePlane/Services/IImageProcessingService.cs @@ -12,6 +12,7 @@ namespace XplorePlane.Services IReadOnlyList GetAvailableProcessors(); IReadOnlyList GetProcessorParameters(string processorName); ImageProcessorBase GetProcessor(string processorName); + string GetProcessorDisplayName(string processorName); void RegisterProcessor(string name, ImageProcessorBase processor); Task ProcessImageAsync( diff --git a/XplorePlane/Services/ImageProcessingService.cs b/XplorePlane/Services/ImageProcessingService.cs index 87b0e77..c7f2799 100644 --- a/XplorePlane/Services/ImageProcessingService.cs +++ b/XplorePlane/Services/ImageProcessingService.cs @@ -78,6 +78,15 @@ namespace XplorePlane.Services throw new ArgumentException($"Processor not registered or is 16-bit only: {processorName}", nameof(processorName)); } + public string GetProcessorDisplayName(string processorName) + { + if (_processorRegistry.TryGetValue(processorName, out var p)) + return string.IsNullOrWhiteSpace(p.Name) ? processorName : p.Name; + if (_processorRegistry16.TryGetValue(processorName, out var p16)) + return string.IsNullOrWhiteSpace(p16.Name) ? processorName : p16.Name; + return processorName; + } + public async Task ProcessImageAsync( BitmapSource source, string processorName, diff --git a/XplorePlane/ViewModels/ImageProcessingViewModel.cs b/XplorePlane/ViewModels/ImageProcessingViewModel.cs index d1b1028..1a4078d 100644 --- a/XplorePlane/ViewModels/ImageProcessingViewModel.cs +++ b/XplorePlane/ViewModels/ImageProcessingViewModel.cs @@ -11,12 +11,20 @@ using XplorePlane.Services; namespace XplorePlane.ViewModels { + /// 算子列表项:持有注册 key 和本地化显示名 + public class ProcessorItem + { + public string Key { get; } + public string DisplayName { get; } + public ProcessorItem(string key, string displayName) { Key = key; DisplayName = displayName; } + public override string ToString() => DisplayName; + } public class ImageProcessingViewModel : BindableBase { private readonly IImageProcessingService _imageProcessingService; private readonly ILogger _logger; - private string _selectedProcessor; + private ProcessorItem _selectedProcessorItem; private BitmapSource _currentImage; private BitmapSource _originalImage; private double _processingProgress; @@ -28,14 +36,12 @@ namespace XplorePlane.ViewModels _imageProcessingService = imageProcessingService; _logger = logger; - AvailableProcessors = new ObservableCollection(); + AvailableProcessors = new ObservableCollection(); CurrentParameters = new ObservableCollection(); - // Populate available processors - foreach (var name in _imageProcessingService.GetAvailableProcessors()) - AvailableProcessors.Add(name); + foreach (var key in _imageProcessingService.GetAvailableProcessors()) + AvailableProcessors.Add(new ProcessorItem(key, _imageProcessingService.GetProcessorDisplayName(key))); - // Initialize commands (stubs - implemented in tasks 7.2, 7.4, 7.7) SelectProcessorCommand = new DelegateCommand(OnSelectProcessor); ApplyProcessingCommand = new DelegateCommand(OnApplyProcessing); ResetImageCommand = new DelegateCommand(OnResetImage); @@ -43,15 +49,22 @@ namespace XplorePlane.ViewModels SaveResultCommand = new DelegateCommand(OnSaveResult, () => CurrentImage != null); } - public ObservableCollection AvailableProcessors { get; } + public ObservableCollection AvailableProcessors { get; } public ObservableCollection CurrentParameters { get; } - public string SelectedProcessor + public ProcessorItem SelectedProcessorItem { - get => _selectedProcessor; - set => SetProperty(ref _selectedProcessor, value); + get => _selectedProcessorItem; + set + { + SetProperty(ref _selectedProcessorItem, value); + if (value != null) OnSelectProcessor(value.Key); + } } + // Keep SelectedProcessor as the key string for service calls + public string SelectedProcessor => _selectedProcessorItem?.Key; + public BitmapSource CurrentImage { get => _currentImage; diff --git a/XplorePlane/Views/ImageProcessingPanelView.xaml b/XplorePlane/Views/ImageProcessingPanelView.xaml index 48fec4e..f3ba1f8 100644 --- a/XplorePlane/Views/ImageProcessingPanelView.xaml +++ b/XplorePlane/Views/ImageProcessingPanelView.xaml @@ -84,9 +84,9 @@ - + - + @@ -148,7 +148,9 @@ - + @@ -159,7 +161,7 @@ FontFamily="{StaticResource CsdFont}" FontSize="12" ItemsSource="{Binding AvailableProcessors}" - SelectedItem="{Binding SelectedProcessor}" + SelectedItem="{Binding SelectedProcessorItem}" SelectionChanged="OnProcessorComboChanged" /> diff --git a/XplorePlane/Views/ImageProcessingPanelView.xaml.cs b/XplorePlane/Views/ImageProcessingPanelView.xaml.cs index 057f7a3..b2942eb 100644 --- a/XplorePlane/Views/ImageProcessingPanelView.xaml.cs +++ b/XplorePlane/Views/ImageProcessingPanelView.xaml.cs @@ -4,7 +4,6 @@ using System.Windows.Controls; using Prism.Ioc; using XplorePlane.Services; using XplorePlane.ViewModels; - namespace XplorePlane.Views { public partial class ImageProcessingPanelView : UserControl @@ -27,12 +26,12 @@ namespace XplorePlane.Views private void OnProcessorComboChanged(object sender, SelectionChangedEventArgs e) { - if (sender is ComboBox cmb && cmb.SelectedItem is string processorName + if (sender is ComboBox cmb && cmb.SelectedItem is ProcessorItem item && _imageProcessingService != null) { try { - var processor = _imageProcessingService.GetProcessor(processorName); + var processor = _imageProcessingService.GetProcessor(item.Key); parameterControl.LoadProcessor(processor); } catch (ArgumentException) diff --git a/XplorePlane/Views/ImageProcessingWindow.xaml b/XplorePlane/Views/ImageProcessingWindow.xaml index 4340ea2..5281dc0 100644 --- a/XplorePlane/Views/ImageProcessingWindow.xaml +++ b/XplorePlane/Views/ImageProcessingWindow.xaml @@ -3,8 +3,8 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:views="clr-namespace:XplorePlane.Views" Title="图像处理" - Width="1000" Height="700" - MinWidth="800" MinHeight="500" + Width="1200" Height="750" + MinWidth="900" MinHeight="550" WindowStartupLocation="CenterOwner" ShowInTaskbar="False"> diff --git a/XplorePlane/XplorePlane.csproj b/XplorePlane/XplorePlane.csproj index b1023d4..3e04bfc 100644 --- a/XplorePlane/XplorePlane.csproj +++ b/XplorePlane/XplorePlane.csproj @@ -174,6 +174,12 @@ PreserveNewest + + + + PreserveNewest + zh-CN\%(Filename)%(Extension) + diff --git a/XplorePlane/readme.txt b/XplorePlane/readme.txt index f366e2d..2cac0a9 100644 --- a/XplorePlane/readme.txt +++ b/XplorePlane/readme.txt @@ -12,4 +12,6 @@ 2026.3.14 ---------------------- -1、主页面的布局与拆分 √ \ No newline at end of file +1、主页面的布局与拆分 √ +2、硬件层射线源的集成 √ +3、图像层集成,包括复刻一个示例界面,优化界面布局及算子中文 √ \ No newline at end of file