C# “拉伸”设置为“均匀”时的图像控制和图像大小调整

C# “拉伸”设置为“均匀”时的图像控制和图像大小调整,c#,xaml,image-processing,windows-rt,C#,Xaml,Image Processing,Windows Rt,我有个奇怪的问题。我有一个用户控件。我正在为Windows 8.1制作一个应用程序,我将从图片库中选择一幅图像。图像将在我的应用程序中打开,拉伸是均匀的,水平和垂直对齐到中心 我的用户控件将出现在我点击图像的位置。现在的问题是,当图像拉伸为“无”时,我能够放大正确的区域(单击周围),但现在,当我将拉伸设置为均匀并将水平和垂直对齐设置为中心时,我在用户控件中获得了其他像素信息 我想知道如何修复它。无论如何,图像可以是2*全高清,也可以是高清,甚至更低。 其次,我想知道图像的边界。有了边界,我想说的

我有个奇怪的问题。我有一个用户控件。我正在为Windows 8.1制作一个应用程序,我将从图片库中选择一幅图像。图像将在我的应用程序中打开,拉伸是均匀的,水平和垂直对齐到中心

我的用户控件将出现在我点击图像的位置。现在的问题是,当图像拉伸为“无”时,我能够放大正确的区域(单击周围),但现在,当我将拉伸设置为均匀并将水平和垂直对齐设置为中心时,我在用户控件中获得了其他像素信息

我想知道如何修复它。无论如何,图像可以是2*全高清,也可以是高清,甚至更低。 其次,我想知道图像的边界。有了边界,我想说的是,我的用户控件不应该超出图像的边界。 如何实现这一点。如果需要我的代码,我会粘贴它,如果需要的话

有这个可供参考。这就是我要发展的!我已经准备好了用户控件,我得到了Stretch=NONE的精确像素,并且没有水平和垂直对齐设置。


这是我的

代码,我相信问题在于如何使用控件,而不是图像。如果避免进行位图裁剪和替换,则会显著加快速度,并且可能适用于所有拉伸类型

我修改了源代码以显示这一点-完全删除裁剪。如果由于其他原因需要裁剪,则应考虑使用不安全关键字(和属性设置允许),以显著加快其使用速度。 另外,为了避免延迟/向上跳跃,我添加了ishitsetvisible=“False”,这样您的增量就不会因为悬停在图像上而中断

我看到你已经有45度的代码了-因为它不在你的源代码中,我只添加了一个90度旋转的例子,当你到达侧面-所以你可以看到如何设置一个RenderTransferorMorigin点

MainPage.xaml:

<Page x:Name="page1" 
    x:Class="controlMagnifier.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:controlMagnifier"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid x:Name="ParentGrid" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" PointerReleased="ParentGrid_OnPointerReleased"  >
        <Canvas x:Name="InkPresenter" Height="auto" Width="auto">

            <Image Stretch="Uniform" x:Name="image2"  >
                <Image.Source >
                    <BitmapImage UriSource="/Assets/wallpaper.jpg" />
                </Image.Source>
            </Image>

        </Canvas>

        <local:MagnifierUsercontrol  x:Name="MagnifyTip"  Visibility="Collapsed"  ManipulationMode="All"
                                     IsHitTestVisible="False" Height="227" Width="171"
                                     VerticalContentAlignment="Bottom" HorizontalContentAlignment="Center">
        </local:MagnifierUsercontrol>
    </Grid>
</Page>

MainPage.xaml.cs:

using System;
using Windows.Foundation;
using Windows.Storage;
using Windows.UI.Input;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;

namespace controlMagnifier
{
    public sealed partial class MainPage : Page
    {
        public const int XAxis = 200;
        public const int YAxis = 435;
        private readonly RotateTransform myRotateTransform = new RotateTransform {CenterX = 0.5, CenterY = 1};
        private readonly ScaleTransform myScaleTransform = new ScaleTransform {ScaleX = 1, ScaleY = 1};
        private readonly TransformGroup myTransformGroup = new TransformGroup();
        private readonly TranslateTransform myTranslateTransform = new TranslateTransform();
        public WriteableBitmap CurrentBitmapObj, CurrentCroppedImage = null;
        public Point currentContactPt, GridPoint;
        public Thickness margin;
        public PointerPoint pt;
        public double xValue, yValue;

        public MainPage()
        {
            InitializeComponent();
            ParentGrid.Holding += Grid_Holding;
            image2.PointerMoved += InkCanvas_PointerMoved;
            image2.PointerReleased += ParentGrid_OnPointerReleased;
            margin = MagnifyTip.Margin;
            image2.CacheMode = new BitmapCache();

            myTransformGroup.Children.Add(myScaleTransform);
            myTransformGroup.Children.Add(myRotateTransform);
            myTransformGroup.Children.Add(myTranslateTransform);

            MagnifyTip.RenderTransformOrigin = new Point(0.5, 1);
            MagnifyTip.RenderTransform = myTransformGroup;
        }

        private void Grid_Holding(object sender, HoldingRoutedEventArgs e)
        {
            try
            {
                GridPoint = e.GetPosition(image2);

                myTranslateTransform.X = xValue - XAxis;
                myTranslateTransform.Y = yValue - YAxis;
                MagnifyTip.RenderTransform = myTransformGroup;

                MagnifyTip.Visibility = Visibility.Visible;
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void InkCanvas_PointerMoved(object sender, PointerRoutedEventArgs e)
        {
            try
            {
                pt = e.GetCurrentPoint(image2);
                currentContactPt = pt.Position;

                xValue = currentContactPt.X;
                yValue = currentContactPt.Y;

                if (xValue > 300)
                {
                    myRotateTransform.Angle = -90;
                }
                else if (xValue < 100)
                {
                    myRotateTransform.Angle = 90;
                }
                else
                {
                    myRotateTransform.Angle = 0;
                }

                MagnifyTip.RenderTransform = myRotateTransform;

                myTranslateTransform.X = xValue - XAxis;
                myTranslateTransform.Y = yValue - YAxis;
                MagnifyTip.RenderTransform = myTransformGroup;
            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                e.Handled = true;
            }
        }

        private async void StoreCrrentImage()
        {
            try
            {
                var storageFile =
                    await
                        StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/wallpaper.jpg",
                            UriKind.RelativeOrAbsolute));

                using (
                    var fileStream =
                        await storageFile.OpenAsync(FileAccessMode.Read))
                {
                    var bitmapImage = new BitmapImage();

                    await bitmapImage.SetSourceAsync(fileStream);
                    var writeableBitmap =
                        new WriteableBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight);
                    fileStream.Seek(0);
                    await writeableBitmap.SetSourceAsync(fileStream);
                    CurrentBitmapObj = writeableBitmap;
                    writeableBitmap.Invalidate();
                }
            }
            catch (Exception)
            {
                // Graphics g=new Graphics();
                throw;
            }


            finally
            {
            }
        }

        private void ParentGrid_OnPointerReleased(object sender, PointerRoutedEventArgs e)
        {
            MagnifyTip.Visibility = Visibility.Collapsed;
        }
    }
}
使用系统;
使用Windows基金会;
使用Windows.Storage;
使用Windows.UI.Input;
使用Windows.UI.Xaml;
使用Windows.UI.Xaml.Controls;
使用Windows.UI.Xaml.Input;
使用Windows.UI.Xaml.Media;
使用Windows.UI.Xaml.Media.Imaging;
名称空间控制放大镜
{
公共密封部分类主页面:第页
{
公共常数int XAxis=200;
公共常数int YAxis=435;
私有只读RotateTransform myRotateTransform=新的RotateTransform{CenterX=0.5,CenterY=1};
私有只读ScaleTransform myScaleTransform=new ScaleTransform{ScaleX=1,ScaleY=1};
私有只读TransformGroup myTransformGroup=新TransformGroup();
私有只读TranslateTransform myTranslateTransform=新TranslateTransform();
公共可写位图CurrentBitmapObj,CurrentCroppedImage=null;
公共点,公共点;
公共厚度裕度;
公共点;
公共双X值,Y值;
公共主页()
{
初始化组件();
ParentGrid.Holding+=网格_Holding;
image2.PointerMoved+=InkCanvas_PointerMoved;
image2.PointerReleased+=父网格_OnPointerReleased;
页边距=放大页边距;
image2.CacheMode=新的位图缓存();
myTransformGroup.Children.Add(myScaleTransform);
myTransformGroup.Children.Add(myRotateTransform);
myTransformGroup.Children.Add(myTranslateTransform);
放大倍数p.renderTransferMorigin=新点(0.5,1);
magnifitp.RenderTransform=myTransformGroup;
}
私有无效网格保持(对象发送方,保持路由目标)
{
尝试
{
网格点=e.GetPosition(图2);
myTranslateTransform.X=xValue-XAxis;
myTranslateTransform.Y=yValue-YAxis;
magnifitp.RenderTransform=myTransformGroup;
放大率IP.Visibility=可见性.Visibility;
}
捕获(例外)
{
投
}
}
私有void InkCanvas_PointerMoved(对象发送方,PointerRoutedEventArgs e)
{
尝试
{
pt=e.GetCurrentPoint(图2);
电流触点pt=pt位置;
xValue=电流触点pt.X;
Y值=电流触点PT.Y;
如果(xValue>300)
{
myRotateTransform.角度=-90;
}
否则如果(X值<100)
{
myRotateTransform.角度=90;
}
其他的
{
myRotateTransform.Angle=0;
}
放大IP.RenderTransform=myRotateTransform;
myTranslateTransform.X=xValue-XAxis;
myTranslateTransform.Y=yValue-YAxis;
magnifitp.RenderTransform=myTransformGroup;
}
捕获(例外)
{
投
}
最后
{
e、 已处理=正确;
}
}
私有异步void StoreCrrentImage()
{
尝试
{
var存储文件=
等候
StorageFile.GetFileFromApplicationUrisync(新Uri(“ms”)-appx:///Assets/wallpaper.jpg",
相对溶质);
使用(
var文件流=
等待存储文件
<UserControl
    x:Class="controlMagnifier.MagnifierUsercontrol"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:controlMagnifier"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" Height="227" Width="171">

    <Canvas x:Name="controlCanvas" x:FieldModifier="public"  Height="Auto" Width="Auto" >
        <Grid Height="227" Width="171" HorizontalAlignment="Center" Canvas.Left="0" Canvas.Top="0">

            <Border x:FieldModifier="public" x:Name="imgBorder" Width="150" CornerRadius="50,50,50,50" Margin="13,25,13,97">
                <Border.Background>
                    <ImageBrush x:FieldModifier="public" x:Name="image1"    />
                </Border.Background>
            </Border>

            <TextBlock x:Name="txtreading" Height="30" Width="80" Margin="0,-145,0,0" FontWeight="Bold" Foreground="Red"  FontSize="20" Text="ABC" TextAlignment="Center" />
            <!--<Image Height="120" Width="150" Margin="0,-50,0,0" Source="Assets/SmallLogo.scale-100.png" ></Image>-->
            <Path x:Name="MagnifyTip"  Data="M25.533,0C15.457,0,7.262,8.199,7.262,18.271c0,9.461,13.676,19.698,17.63,32.338    c0.085,0.273,0.34,0.459,0.626,0.457c0.287-0.004,0.538-0.192,0.619-0.467c3.836-12.951,17.666-22.856,17.667-32.33    C43.803,8.199,35.607,0,25.533,0z M25.533,32.131c-7.9,0-14.328-6.429-14.328-14.328c0-7.9,6.428-14.328,14.328-14.328    c7.898,0,14.327,6.428,14.327,14.328C39.86,25.702,33.431,32.131,25.533,32.131z" Fill="#FFF4F4F5" Stretch="Fill" Stroke="Black" UseLayoutRounding="False" Height="227" Width="171" />
        </Grid>
    </Canvas>

</UserControl>