Zoom Ritaglia i pixel in un controllo utente

Ho sviluppato un controllo utente. Il controllo utente è come un vetro lente d’ingrandimento. Il controllo utente ha un pulsante immagine che mostra le immagini ritagliate pixel per pixel.

StorageFile storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/wallpaper.jpg", UriKind.RelativeOrAbsolute)); using (Windows.Storage.Streams.IRandomAccessStream fileStream = await storageFile.OpenAsync(FileAccessMode.Read)) { BitmapImage bitmapImage = new BitmapImage(); await bitmapImage.SetSourceAsync(fileStream); WriteableBitmap writeableBitmap = new WriteableBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight); fileStream.Seek(0); await writeableBitmap.SetSourceAsync(fileStream); writeableBitmap = writeableBitmap.Crop(Convert.ToInt32(xValue), Convert.ToInt32(yValue), 100, 100); MagnifyTip.image1.ImageSource = writeableBitmap; 

Ora MagnifyTip.image1 ha una sorgente di immagini che è impostata su un’immagine ritagliata. Il mio requirenment è di ingrandire la regione ritagliata e quindi assegnarla alla sorgente dell’immagine. Il controllo utente è simile a questo inserisci la descrizione dell'immagine qui L’aiuto sarebbe apprezzato

Forse questo funziona per te, è tanto efficiente quanto suppongo WPF dal momento che non c’è il ritaglio dell’immagine nel codice, semplicemente usa RenderTransform per fare la magia. Esegui il codice qui sotto e premi il mouse sull’immagine in modo che la lente d’ingrandimento appaia così:

inserisci la descrizione dell'immagine qui

XAML:

                      

E questo è il codice dietro:

 using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media.Imaging; namespace WpfApplication1 { public partial class MainWindow : Window, INotifyPropertyChanged { public MainWindow() { ZoomFactor = 8; ImageZoomSize = 200; InitializeComponent(); BorderZoom.Visibility = Visibility.Hidden; } public double Xt { get; private set; } public double Yt { get; private set; } public double ZoomFactor { get; private set; } public int ImageZoomSize { get; private set; } public int ImageZoomSizeHalf { get { return ImageZoomSize/2; } } public Point CenterPoint { get { return new Point(ImageZoomSizeHalf, ImageZoomSizeHalf);} } private void FullImage_OnMouseDown(object sender, MouseButtonEventArgs e) { BorderZoom.Visibility = Visibility.Visible; FullImage_OnMouseMove(sender, e); } private void FullImage_OnMouseMove(object sender, MouseEventArgs e) { if (BorderZoom.Visibility == Visibility.Visible) { BorderZoom.Visibility = Visibility.Visible; var pos = e.GetPosition(FullImage); Canvas.SetLeft(BorderZoom, pos.X - ImageZoomSizeHalf); Canvas.SetTop(BorderZoom, pos.Y - ImageZoomSizeHalf); var isrc = FullImage.Source as BitmapSource; if(isrc == null) return; var h = (double)isrc.PixelHeight; var w = (double)isrc.PixelWidth; Xt = pos.X* (-ImageZoomSize/w) + ImageZoomSize/2.0; Yt = pos.Y * (-ImageZoomSize / h) + ImageZoomSize / 2.0; OnNotifyPropertyChanged("Xt"); OnNotifyPropertyChanged("Yt"); } } private void FullImage_OnMouseUp(object sender, MouseButtonEventArgs e) { BorderZoom.Visibility = Visibility.Hidden; } public event PropertyChangedEventHandler PropertyChanged; private void OnNotifyPropertyChanged(string propName) { if(PropertyChanged!= null) PropertyChanged(this, new PropertyChangedEventArgs(propName)); } } } 

AGGIORNARE

Come richiesto, vedi il codice sottostante che avvolge la punta ingrandente in un controllo utente simile a questo:

Incorporando il controllo dell'utente

XAML per MagifiyingTipCtrl:

                    

Code-behind per MagifiyingTipCtrl:

 using System.Windows.Media.Imaging; namespace WpfApplication1 { public partial class MagifiyingTipCtrl : UserControl { public MagifiyingTipCtrl() { ZoomFactor = 8; ZoomWidth = 136; ZoomHeight = 128; InitializeComponent(); } public static readonly DependencyProperty SourceImageProperty = DependencyProperty.Register("SourceImage", typeof (BitmapSource), typeof (MagifiyingTipCtrl)); public static readonly DependencyProperty XtProperty = DependencyProperty.Register("Xt", typeof(double), typeof(MagifiyingTipCtrl)); public static readonly DependencyProperty YtProperty = DependencyProperty.Register("Yt", typeof(double), typeof(MagifiyingTipCtrl)); public BitmapSource SourceImage { get { return (BitmapSource)GetValue(SourceImageProperty); } set { SetValue(SourceImageProperty, value); } } public double Xt { get { return (double)GetValue(XtProperty); } set { SetValue(XtProperty, value); } } public double Yt { get { return (double)GetValue(YtProperty); } set { SetValue(YtProperty, value); } } public void SetPosition(Point pos) { if (SourceImage == null) return; var h = (double)SourceImage.PixelHeight; var w = (double)SourceImage.PixelWidth; Xt = pos.X * (-ZoomWidth / w) + ZoomWidth / 2.0; Yt = pos.Y * (-ZoomHeight / h) + ZoomHeight / 2.0; } public double ZoomFactor { get; private set; } public int ZoomWidth { get; private set; } public int ZoomHeight { get; private set; } public int ZoomWidthHalf { get { return ZoomWidth / 2; } } public int ZoomHeightHalf { get { return ZoomHeight / 2; } } public Point CenterPoint { get { return new Point(ZoomWidthHalf, ZoomHeightHalf); } } } } 

XAML per la finestra principale:

         

Code-behind per MainWindow:

 using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace WpfApplication1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void FullImage_OnMouseDown(object sender, MouseButtonEventArgs e) { MagnifiyingTip.Visibility = Visibility.Visible; FullImage_OnMouseMove(sender, e); } private void FullImage_OnMouseMove(object sender, MouseEventArgs e) { if (MagnifiyingTip.Visibility == Visibility.Visible) { MagnifiyingTip.Visibility = Visibility.Visible; var pos = e.GetPosition(FullImage); Canvas.SetLeft(MagnifiyingTip, pos.X - MagnifiyingTip.ActualWidth/2); Canvas.SetTop(MagnifiyingTip, pos.Y - MagnifiyingTip.ActualHeight); MagnifiyingTip.SetPosition(pos); } } private void FullImage_OnMouseUp(object sender, MouseButtonEventArgs e) { MagnifiyingTip.Visibility = Visibility.Hidden; } } } 

Proprio come ho scritto nel mio commento, una rapida demoapp in WPF per PictureZoom.

https://github.com/hrkrx/PictureZoomExample

è solo un esame quindi ci può essere molto ottimizzato, ma spero che ti stia aiutando