问题描述
我在将正方形放置在包含图像的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个画布,但这与问题无关。