由于图像XAML中的dpi差异,画布中的项目与计算位置不匹配

问题描述

我在将正方形放置在包含图像的Canvas的正确位置时遇到问题(从API接收为byte [])。确实显示了一些矩形,有些矩形有些偏斜,有些则完全偏斜,甚至没有达到应有的水平。

<ViewBox>
        <Canvas Height="{Binding ActualHeight,ElementName=img}" Width="{Binding ActualWidth,ElementName=img}">
            <Image Name="img" Source="{Binding Image.Image,ElementName=uc}" Stretch="None" />
            <Rectangle Canvas.Left="{Binding Image.ImageAttributes.Rect.X,ElementName=uc}" Canvas.Top="{Binding Image.ImageAttributes.Rect.Y,ElementName=uc}" Visibility="{Binding ShowBox,Converter={StaticResource BoolToVisibilityConverter} }" Width="{Binding Image.ImageAttributes.Rect.Width,ElementName=uc}" Height="{Binding Image.ImageAttributes.Rect.Height,ElementName=uc}" stroke="Red" strokeThickness="1">
                <Rectangle.LayoutTransform>
                    <RotateTransform Angle="{Binding Image.ImageAttributes.Roll,ElementName=uc}"/>
                </Rectangle.LayoutTransform>
            </Rectangle>
            
        </Canvas>
    </ViewBox>

起初我以为可能是因为我从API获取错误的数据值或后端出现问题。经过一天多的调试,我终于弄明白了,这是由于图像中的DPI所致。例如: 假设正常情况下,某些图片尺寸为300 x 450,但是以xaml为单位,实际的height / actualWidth设置为400x600。这是因为图像的dpi为72,而xaml中的认dpi似乎是96(300/72 * 96 = 400)。但是Rectangle并没有考虑到图像尺寸已更改并且应在其应绘制的位置绘制的事实(例如,DB中的绝对值应为:X:30,Y:45,Height:90,Width:90更改尺寸后,以X:40,Y:60,Height:120,Width:120绘制)。

我的问题是:有什么方法可以在显示图像之前将dpi标准化或在将其发送到要处理的API和添加数据库中之前对其进行标准化? 如果没有,如何调整大小或获得dpi差异以计算Canvas中其他项目的新值?

解决方法

返回不让问题悬而未决。解决方法如下:

<Viewbox>
    <Grid>
    <Canvas Name="cnvImage" Height="{Binding Height,ElementName=img}" Width="{Binding Width,ElementName=img}">
        <Image Name="img" Width="{Binding Source.PixelWidth,RelativeSource={RelativeSource Self}}" Height="{Binding Source.PixelHeight,RelativeSource={RelativeSource Self}}" Source="{Binding NImage,ElementName=uc}"/>
    </Canvas>
        <Canvas Name="grAttribute" Height="{Binding Height,ElementName=cnvImage}" Width="{Binding Width,ElementName=cnvImage}">
    </Canvas>
    </Grid>
</Viewbox>

无需重新评估或重新计算任何内容。 为了完成这项工作,您需要分配 Width="{Binding Source.PixelWidth,RelativeSource={RelativeSource Self}}"

此外,我将矩形的创建拆分为wpf,所以我现在有2个画布,但这与问题无关。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...