首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由于图像XAML中的dpi差异,画布中的项目与其计算位置不匹配

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

Stack Overflow用户
提问于 2020-08-18 16:44:36
回答 1查看 10关注 0票数 0

我有一个问题,试图将一个正方形放在画布的正确位置,其中包含图像(从API接收为byte[])。有些矩形显示得很整齐,有些稍有偏离,有些则完全偏离,甚至没有接近它应该在的位置。

代码语言:javascript
复制
<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差异来计算画布中其他项目的新值?

EN

Stack Overflow用户

回答已采纳

发布于 2020-09-11 19:54:12

返回到不留下未回答的问题。以下是解决方案:

代码语言:javascript
复制
<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中,所以我现在有两个画布,但它与问题无关。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63464971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档