我有一个问题,试图将一个正方形放在画布的正确位置,其中包含图像(从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。例如:假设一些图像尺寸通常为300x450,但在xaml中,实际高度/实际宽度被设置为400x600。这是因为图像的dpi是72,而xaml中的默认dpi似乎是96 (300 / 72 * 96 = 400)。但是矩形没有考虑到图像尺寸改变的事实,并且绘制在它应该在的地方(例如。DB的绝对值是: X:30,Y:45,高度:90,宽度:90现在应该在尺寸改变后绘制在X:40,Y:60,高度:120,宽度:120中)。
我的问题是:有没有办法在显示图像之前对dpi进行标准化,或者在将其发送到API进行处理并添加到DB之前对其进行标准化?如果不是,我如何调整大小或获得dpi差异来计算画布中其他项目的新值?
发布于 2020-09-11 19:54:12
返回到不留下未回答的问题。以下是解决方案:
<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}}" Height="{Binding Source.PixelHeight, RelativeSource={RelativeSource Self}}"
此外,我将矩形的创建拆分到我的wpf中,所以我现在有两个画布,但它与问题无关。
https://stackoverflow.com/questions/63464971
复制相似问题