using System; using System.IO; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Input; using Microsoft.Win32; namespace Ink_Canvas { public partial class MainWindow : Window { #region Image private async void BtnImageInsert_Click(object sender, RoutedEventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image files (*.jpg; *.jpeg; *.png; *.bmp)|*.jpg;*.jpeg;*.png;*.bmp"; if (openFileDialog.ShowDialog() == true) { string filePath = openFileDialog.FileName; Image image = await CreateAndCompressImageAsync(filePath); if (image != null) { string timestamp = "img_" + DateTime.Now.ToString("yyyyMMdd_HH_mm_ss_fff"); image.Name = timestamp; // 新缩放逻辑:最大宽高为画布一半,并居中 double maxWidth = inkCanvas.ActualWidth / 2; double maxHeight = inkCanvas.ActualHeight / 2; double scaleX = maxWidth / image.Width; double scaleY = maxHeight / image.Height; double scale = Math.Min(1, Math.Min(scaleX, scaleY)); image.Width = image.Width * scale; image.Height = image.Height * scale; InkCanvas.SetLeft(image, (inkCanvas.ActualWidth - image.Width) / 2); InkCanvas.SetTop(image, (inkCanvas.ActualHeight - image.Height) / 2); inkCanvas.Children.Add(image); // 添加鼠标事件处理,使图片可以被选择 image.MouseDown += UIElement_MouseDown; image.IsManipulationEnabled = true; timeMachine.CommitElementInsertHistory(image); } } } private async Task CreateAndCompressImageAsync(string filePath) { string savePath = Path.Combine(Settings.Automation.AutoSavedStrokesLocation, "File Dependency"); if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } string fileExtension = Path.GetExtension(filePath); string timestamp = "img_" + DateTime.Now.ToString("yyyyMMdd_HH_mm_ss_fff"); string newFilePath = Path.Combine(savePath, timestamp + fileExtension); await Task.Run(() => File.Copy(filePath, newFilePath, true)); return await Dispatcher.InvokeAsync(() => { BitmapImage bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.UriSource = new Uri(newFilePath); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.EndInit(); int width = bitmapImage.PixelWidth; int height = bitmapImage.PixelHeight; Image image = new Image(); // 设置拉伸模式为Fill,支持任意比例缩放 image.Stretch = Stretch.Fill; if (isLoaded && Settings.Canvas.IsCompressPicturesUploaded && (width > 1920 || height > 1080)) { double scaleX = 1920.0 / width; double scaleY = 1080.0 / height; double scale = Math.Min(scaleX, scaleY); TransformedBitmap transformedBitmap = new TransformedBitmap(bitmapImage, new ScaleTransform(scale, scale)); image.Source = transformedBitmap; image.Width = transformedBitmap.PixelWidth; image.Height = transformedBitmap.PixelHeight; } else { image.Source = bitmapImage; image.Width = width; image.Height = height; } return image; }); } #endregion #region Media private async void BtnMediaInsert_Click(object sender, RoutedEventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Media files (*.mp4; *.avi; *.wmv)|*.mp4;*.avi;*.wmv"; if (openFileDialog.ShowDialog() == true) { string filePath = openFileDialog.FileName; byte[] mediaBytes = await Task.Run(() => File.ReadAllBytes(filePath)); MediaElement mediaElement = await CreateMediaElementAsync(filePath); if (mediaElement != null) { InkCanvas.SetLeft(mediaElement, 0); InkCanvas.SetTop(mediaElement, 0); inkCanvas.Children.Add(mediaElement); // 添加鼠标事件处理,使媒体元素可以被选择 mediaElement.MouseDown += UIElement_MouseDown; mediaElement.IsManipulationEnabled = true; mediaElement.LoadedBehavior = MediaState.Manual; mediaElement.UnloadedBehavior = MediaState.Manual; mediaElement.Loaded += async (_, args) => { mediaElement.Play(); await Task.Delay(100); mediaElement.Pause(); }; timeMachine.CommitElementInsertHistory(mediaElement); } } } private async Task CreateMediaElementAsync(string filePath) { string savePath = Path.Combine(Settings.Automation.AutoSavedStrokesLocation, "File Dependency"); if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } return await Dispatcher.InvokeAsync(() => { MediaElement mediaElement = new MediaElement(); mediaElement.Source = new Uri(filePath); string timestamp = "media_" + DateTime.Now.ToString("yyyyMMdd_HH_mm_ss_fff"); mediaElement.Name = timestamp; mediaElement.LoadedBehavior = MediaState.Manual; mediaElement.UnloadedBehavior = MediaState.Manual; mediaElement.Width = 256; mediaElement.Height = 256; string fileExtension = Path.GetExtension(filePath); string newFilePath = Path.Combine(savePath, mediaElement.Name + fileExtension); File.Copy(filePath, newFilePath, true); mediaElement.Source = new Uri(newFilePath); return mediaElement; }); } #endregion } }