private void Button_Save_Click(object sender, RoutedEventArgs e) { if (MessageBox.Show("確定完成旋轉並儲存?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Information) == MessageBoxResult.OK) { try { double ratio = heightRatio == 0 ? widthRatio : heightRatio; double oriWidth = rect2WAndH[0] / ratio; double oriHeight = rect2WAndH[1] / ratio; BitmapImage saveBitmapImage = new CreateBitmapImage().BitmapImageOriginal(ImageInfo.Image_FullPath); double sourceCenX = saveBitmapImage.PixelWidth / 2; double sourceCenY = saveBitmapImage.PixelHeight / 2; double oriStartX = sourceCenX - (oriWidth / 2); double oriStartY = sourceCenY - (oriHeight / 2); RotateAndSaveImage(saveBitmapImage, rotateAngle, (int)oriStartX, (int)oriStartY, (int)oriWidth, (int)oriHeight, ImageInfo.Image_FullPath); //儲存完馬上重載修改後的圖片 ImageInfo.BitmapImage = new CreateBitmapImage().BitmapImageShow(ImageInfo.Image_FullPath, 800); MessageBox.Show("儲存成功", "提示", MessageBoxButton.OK); Cvs.Children.Clear(); SetImageDefault(ImageInfo); } catch (Exception ex) { ErrorLog.ErrorMessageOutput(ex.ToString()); } } }
private void SaveImage(Transform transform) { //載入原圖至BitmapSource BitmapSource bitmapSource = new CreateBitmapImage().BitmapImageOriginal(ImageInfo.Image_FullPath); bitmapSource = new TransformedBitmap(bitmapSource, transform); ImageHelper.SaveUsingEncoder(bitmapSource, ImageInfo.Image_FullPath, ImageInfo.Image_Extension); ImageInfo.BitmapImage = new CreateBitmapImage().BitmapImageShow(ImageInfo.Image_FullPath, 800); //image.Source = bitmapSource; bitmapSource = null; ImageInfo = imageInfo; }
//編輯 public PatientSettingViewModel(string windowType, Agencys agencys, Patients patients) { WindowType = windowType; Patients = patients; //設定病患資料 //載入設定就好,避免多設定 Patient_Number = patients.Patient_Number; Patient_Name = patients.Patient_Name; Patient_IDNumber = patients.Patient_IDNumber; Patient_Gender = patients.Patient_Gender; Patient_Birth = patients.Patient_Birth; if (PathCheck.IsFileExist(agencys.Agency_ImagePath + patients.Patient_Photo)) { Patient_Photo = new CreateBitmapImage().BitmapImageShow(agencys.Agency_ImagePath + patients.Patient_Photo, 400); } Patient_FirstRegistrationDate = patients.Patient_FirstRegistrationDate == null ? DateTime.Now : (DateTime)patients.Patient_FirstRegistrationDate; DateTime lastRegistrationDate = new TableRegistrations().QueryLastRegistrationDate(patients); Patient_LastRegistrationDate = lastRegistrationDate == null?Patient_FirstRegistrationDate.ToString("yyyy/MM/dd") : lastRegistrationDate.ToString("yyyy/MM/dd"); PatientCategoryInfo = new TablePatientCategorys().QueryPatientPatientCategoryInfo(Patients).ToList().FindAll(s => s.IsChecked == true); }
bool isSkip = true; //ProgressDialogIndeterminate 回傳值 略過 private void Button_AutoImport_Click(object sender, RoutedEventArgs e) { if (btnAutoImport.IsChecked == true) { if (PathCheck.IsPathExist(Agencys.Agency_ImagePath) && PathCheck.IsPathExist(Agencys.Agency_WifiCardPath)) { bool isEverChanged = false; ProgressDialogIndeterminate progressDialogIndeterminate = new ProgressDialogIndeterminate(); progressDialogIndeterminate.Dispatcher.Invoke(() => { progressDialogIndeterminate.PText = "圖片偵測中"; progressDialogIndeterminate.PIsIndeterminate = true; progressDialogIndeterminate.ButtonContent = "跳過"; progressDialogIndeterminate.ReturnValueCallback += new ProgressDialogIndeterminate.ReturnValueDelegate(SetReturnValueCallbackFun); progressDialogIndeterminate.Show(); }); Registrations registrations = new Registrations(); Task t = Task.Factory.StartNew(() => { using (var ide = new iDentalEntities()) { CreateBitmapImage createBitmapImage = new CreateBitmapImage(); ObservableCollection <Templates_Images> Templates_ImagesCollect = tableTemplates_Images.QueryTemplatesImagesImportDateAndReturnFullImagePath(Agencys, Patients, SelectedTemplate, functionTemplateViewModel.SelectedDate); //default Image[i] in UserControl Templates int Imagei = 0; //載入樣板設定 int ImageCount = (int)SelectedTemplate.Template_ImageCount; int DecodePixelWidth = (int)SelectedTemplate.Template_DecodePixelWidth; while (Imagei < ImageCount) { progressDialogIndeterminate.Dispatcher.Invoke(() => { progressDialogIndeterminate.PText = "圖片 " + (Imagei + 1) + " 偵測中"; }); //目前處理的Image[i] Image iTarget; TemplateContent.Dispatcher.Invoke(() => { iTarget = new Image(); iTarget = (Image)TemplateContent.FindName("Image" + Imagei); //更換目標圖 //iTarget.Source = new BitmapImage(new Uri(@"/DigiDental;component/Resource/yes.png", UriKind.RelativeOrAbsolute)); }); //set the paramater default bool isChanged = false; bool detecting = true; while (true) { //開始偵測wifi card路徑 foreach (string f in Directory.GetFiles(Agencys.Agency_WifiCardPath)) { Thread.Sleep(1000); //設定病患資料夾 PatientImageFolderInfo patientImageFolderInfo = PatientFolderSetting.PatientImageFolderSetting(Agencys, Patients.Patient_ID, RegistrationDate); //檢查是否存在,不存在就新增 PathCheck.CheckPathAndCreate(patientImageFolderInfo.PatientImageFullPath); string extension = Path.GetExtension(f).ToUpper(); string newFileName = DateTime.Now.ToString("yyyyMMddHHmmssffff"); string imageFileName = newFileName + extension; //判斷圖片是否為正 //不是,旋轉後儲存 //是,直接File.Copy ImageHelper.RotateImageByExifOrientationData(f, patientImageFolderInfo.PatientImageFullPath + @"\" + newFileName + extension, extension, true); var queryRegistrations = from r in ide.Registrations where r.Patient_ID == Patients.Patient_ID && r.Registration_Date == RegistrationDate.Date select r; if (queryRegistrations.Count() > 0) { registrations = queryRegistrations.First(); } else { registrations.Patient_ID = Patients.Patient_ID; registrations.Registration_Date = RegistrationDate.Date; ide.Registrations.Add(registrations); //寫入Registrations ide.SaveChanges(); } Images images = new Images() { Image_Path = patientImageFolderInfo.PatientImagePath + @"\" + imageFileName, Image_FileName = imageFileName, Image_Extension = extension }; registrations.Images.Add(images); ide.SaveChanges(); //複製完如果刪除發生問題 //嘗試五次每次間隔3秒 int deleteTime = 0; while (deleteTime < 5) { Thread.Sleep(3000); try { File.Delete(f); deleteTime = 5; } catch (Exception ex) { deleteTime++; if (deleteTime == 5) { if (MessageBox.Show("影像搬移中出現問題", "錯誤", MessageBoxButton.OK, MessageBoxImage.Error) == MessageBoxResult.OK) { isStop = true; ErrorLog.ErrorMessageOutput(ex.ToString()); } } } } TemplateContent.Dispatcher.Invoke(() => { //INSERT TemplateImages //寫入資料庫再帶回畫面 string ImageUID = string.Empty; ImageUID = tableTemplates_Images.InsertOrUpdateTemplatesImages(Patients, functionTemplateViewModel.SelectedTemplate, functionTemplateViewModel.SelectedDate, images.Image_ID, images.Image_Path, Imagei.ToString()); iTarget = new Image(); iTarget = (Image)TemplateContent.FindName("Image" + Imagei); iTarget.Uid = ImageUID; iTarget.Source = createBitmapImage.BitmapImageShow(patientImageFolderInfo.PatientImageFullPath + @"\" + imageFileName, DecodePixelWidth); isChanged = true; }); isEverChanged = true; //代表以處理完結束這回合的偵測 detecting = false; } //ProcessingDialog STOP //停止 if (isStop) { isStop = false; TemplateContent.Dispatcher.Invoke(() => { iTarget = new Image(); iTarget = (Image)TemplateContent.FindName("Image" + Imagei); var findOriImage = from tc in Templates_ImagesCollect where tc.Template_Image_Number == Imagei.ToString() select tc; if (findOriImage.Count() > 0) { iTarget.Source = createBitmapImage.BitmapImageShow(findOriImage.First().Image_Path, DecodePixelWidth); } else { //iTarget.Source = new BitmapImage(new Uri(@"/DigiDental;component/Resource/no.png", UriKind.RelativeOrAbsolute)); } }); return; } else { // import pic OR skip import (NEXT) // 匯入之後接下一張,或是按了跳過 if (!detecting || !isSkip) { if (!isChanged) { TemplateContent.Dispatcher.Invoke(() => { iTarget = new Image(); iTarget = (Image)TemplateContent.FindName("Image" + Imagei); var findOriImage = from tc in Templates_ImagesCollect where tc.Template_Image_Number == Imagei.ToString() select tc; if (findOriImage.Count() > 0) { iTarget.Source = createBitmapImage.BitmapImageShow(findOriImage.First().Image_Path, DecodePixelWidth); } else { //iTarget.Source = new BitmapImage(new Uri(@"/DigiDental;component/Resource/no.png", UriKind.RelativeOrAbsolute)); } }); } Imagei++; isSkip = true; break; } } } } } }).ContinueWith(cw => { //結束 progressDialogIndeterminate.Dispatcher.Invoke(() => { progressDialogIndeterminate.PText = "處理完畢"; progressDialogIndeterminate.Close(); }); //委派回傳MainWindow //刷新Registrations 資料 //刷新Images 資料 if (isEverChanged) { ReturnValueCallback(registrations.Registration_Date); } GC.Collect(); btnAutoImport.IsChecked = false; }, TaskScheduler.FromCurrentSynchronizationContext()); } else { MessageBox.Show("影像路徑或Wifi Card路徑有問題,請至<設定>檢查是否有誤", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); } } }
private void Button_Save_Click(object sender, RoutedEventArgs e) { if (MessageBox.Show("確定完成修改並儲存?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Information) == MessageBoxResult.OK) { try { WaitingDialog waitingDialog = new WaitingDialog(); Thread thread = new Thread(() => { waitingDialog = new WaitingDialog(); waitingDialog.WText = "請稍後"; waitingDialog.WDetail = "影像儲存中..."; waitingDialog.Show(); System.Windows.Threading.Dispatcher.Run(); }); thread.SetApartmentState(ApartmentState.STA); thread.IsBackground = true; thread.Start(); BitmapImage saveBitmapImage = new CreateBitmapImage().BitmapImageOriginal(ImageInfo.Image_FullPath); double pw = saveBitmapImage.PixelWidth; double ph = saveBitmapImage.PixelHeight; double rw = rectangle.Width; double rh = rectangle.Height; double bw = border.Width; double bh = border.Height; //image 控制項P1 Point sourceP1 = new Point(Canvas.GetLeft(rectangle) - Canvas.GetLeft(border), Canvas.GetTop(rectangle) - Canvas.GetTop(border)); //原始圖片比例的rectangle double oriWidth = pw * (rw / bw); double oriHeight = ph * (rh / bh); //比例 double rectangleRatioX = sourceP1.X / bw; double rectangleRatioY = sourceP1.Y / bh; //原始圖片的P1 Point oriStartPoint = new Point(pw * rectangleRatioX, ph * rectangleRatioY); DealNewImage(saveBitmapImage, rotateAngle, (int)oriStartPoint.X, (int)oriStartPoint.Y, (int)oriWidth, (int)oriHeight, ImageInfo.Image_FullPath); waitingDialog.Dispatcher.BeginInvoke(new Action(() => { System.Windows.Threading.Dispatcher.CurrentDispatcher.InvokeShutdown(); waitingDialog.Close(); })); thread.Abort(); //儲存完馬上重載修改後的圖片 ImageInfo.BitmapImage = new CreateBitmapImage().BitmapImageShow(ImageInfo.Image_FullPath, 800); MessageBox.Show("儲存成功", "提示", MessageBoxButton.OK); SetImageDefault(ImageInfo.Image_FullPath); GC.Collect(); } catch (Exception ex) { ErrorLog.ErrorMessageOutput(ex.ToString()); } } }
/// <summary> /// 處理變動後的Image /// </summary> /// <param name="sourceImage">圖片來源</param> /// <param name="angle">旋轉角度</param> /// <param name="startX">裁切起始點X</param> /// <param name="startY">裁切起始點Y</param> /// <param name="width">裁切寬</param> /// <param name="height">裁切高</param> /// <param name="filePath">圖片路徑</param> public void DealNewImage(BitmapImage sourceImage, double angle, int startX, int startY, int width, int height, string filePath) { try { bool isEditRotate = sliderRotate.Value != defaultRotateAngle ? true : false; bool isEditWidth = border.Width != rectangle.Width ? true : false; bool isEditHeight = border.Height != rectangle.Height ? true : false; bool isEditBrightness = sliderBrightness.Value != defaultBrightness ? true : false; bool isEditContrast = sliderContrast.Value != defaultConstrast ? true : false; ContrastAdjustEffect effectBrightnessContrast = (ContrastAdjustEffect)filterBrightnessContrast.Effect; bool isEditSharpen = sliderSharpen.Value != defaultSharpen ? true : false; SharpenEffect effectSharpen = (SharpenEffect)filterSharpen.Effect; bool isEditDefog = sliderDefog.Value != defaultDefog ? true : false; bool isEditExposure = sliderExposure.Value != defaultExposure ? true : false; bool isEditGamma = sliderGamma.Value != defaultGamma ? true : false; ToneMappingEffect effectExposureGamma = (ToneMappingEffect)filterExposureGamma.Effect; bool isEditGrayScale = (bool)checkboxGrayScale.IsChecked ? true : false; GrayScaleEffect effectGrayScale = (GrayScaleEffect)filterGrayScale.Effect; bool isEditInvertColor = (bool)checkboxInvertColor.IsChecked ? true : false; InvertColorEffect effectInvertColor = (InvertColorEffect)filterInvertColor.Effect; if (isEditRotate || isEditWidth || isEditWidth) { TransformGroup transformGroup = new TransformGroup(); RotateTransform rotateTransform = new RotateTransform(angle); rotateTransform.CenterX = sourceImage.PixelWidth / 2.0; rotateTransform.CenterY = sourceImage.PixelHeight / 2.0; transformGroup.Children.Add(rotateTransform); TranslateTransform translateTransform = new TranslateTransform(); translateTransform.X = -startX; translateTransform.Y = -startY; transformGroup.Children.Add(translateTransform); DrawingVisual vis = new DrawingVisual(); RenderTargetBitmap rtb; using (DrawingContext cont = vis.RenderOpen()) { cont.PushTransform(transformGroup); cont.DrawImage(sourceImage, new Rect(new Size(sourceImage.PixelWidth, sourceImage.PixelHeight))); cont.Close(); rtb = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Default); SaveNewImage(rtb, vis, filePath); sourceImage = new CreateBitmapImage().BitmapImageOriginal(ImageInfo.Image_FullPath); } } if (isEditBrightness || isEditContrast) { DrawingVisual vis = new DrawingVisual(); RenderTargetBitmap rtb = new RenderTargetBitmap(sourceImage.PixelWidth, sourceImage.PixelHeight, 96d, 96d, PixelFormats.Default);; using (DrawingContext cont = vis.RenderOpen()) { cont.DrawImage(sourceImage, new Rect(new Size(sourceImage.PixelWidth, sourceImage.PixelHeight))); cont.Close(); vis.Effect = effectBrightnessContrast; SaveNewImage(rtb, vis, filePath); sourceImage = new CreateBitmapImage().BitmapImageOriginal(ImageInfo.Image_FullPath); } } if (isEditSharpen) { DrawingVisual vis = new DrawingVisual(); RenderTargetBitmap rtb = new RenderTargetBitmap(sourceImage.PixelWidth, sourceImage.PixelHeight, 96d, 96d, PixelFormats.Default);; using (DrawingContext cont = vis.RenderOpen()) { cont.DrawImage(sourceImage, new Rect(new Size(sourceImage.PixelWidth, sourceImage.PixelHeight))); cont.Close(); vis.Effect = effectSharpen; SaveNewImage(rtb, vis, filePath); sourceImage = new CreateBitmapImage().BitmapImageOriginal(ImageInfo.Image_FullPath); } } if (isEditDefog || isEditExposure || isEditGamma) { DrawingVisual vis = new DrawingVisual(); RenderTargetBitmap rtb = new RenderTargetBitmap(sourceImage.PixelWidth, sourceImage.PixelHeight, 96d, 96d, PixelFormats.Default);; using (DrawingContext cont = vis.RenderOpen()) { cont.DrawImage(sourceImage, new Rect(new Size(sourceImage.PixelWidth, sourceImage.PixelHeight))); cont.Close(); vis.Effect = effectExposureGamma; SaveNewImage(rtb, vis, filePath); sourceImage = new CreateBitmapImage().BitmapImageOriginal(ImageInfo.Image_FullPath); } } if (isEditGrayScale) { DrawingVisual vis = new DrawingVisual(); RenderTargetBitmap rtb = new RenderTargetBitmap(sourceImage.PixelWidth, sourceImage.PixelHeight, 96d, 96d, PixelFormats.Default);; using (DrawingContext cont = vis.RenderOpen()) { cont.DrawImage(sourceImage, new Rect(new Size(sourceImage.PixelWidth, sourceImage.PixelHeight))); cont.Close(); vis.Effect = effectGrayScale; SaveNewImage(rtb, vis, filePath); sourceImage = new CreateBitmapImage().BitmapImageOriginal(ImageInfo.Image_FullPath); } } if (isEditInvertColor) { DrawingVisual vis = new DrawingVisual(); RenderTargetBitmap rtb = new RenderTargetBitmap(sourceImage.PixelWidth, sourceImage.PixelHeight, 96d, 96d, PixelFormats.Default);; using (DrawingContext cont = vis.RenderOpen()) { cont.DrawImage(sourceImage, new Rect(new Size(sourceImage.PixelWidth, sourceImage.PixelHeight))); cont.Close(); vis.Effect = effectInvertColor; SaveNewImage(rtb, vis, filePath); sourceImage = new CreateBitmapImage().BitmapImageOriginal(ImageInfo.Image_FullPath); } } } catch (Exception ex) { ErrorLog.ErrorMessageOutput(ex.ToString()); } }