使用WPF在画布中调整图像 [英] Fit Image in canvas using WPF

查看:114
本文介绍了使用WPF在画布中调整图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有带有子图像的画布.这是我的XAML:

I have canvas with child images. Here is my XAML:

<Canvas x:Name="ImageArea" ClipToBounds="True">
    <Image x:Name="BigImage" RenderTransformOrigin="0.5,0.5">
        <Image.RenderTransform>
            <TransformGroup>
                <RotateTransform x:Name="ImageRotateTransform" Angle="0"/>
                <ScaleTransform x:Name="ImageScaleTransform" ScaleX="1" ScaleY="1"/>
                <TranslateTransform x:Name="ImageTranslateTransform" X="0" Y="0"/>
            </TransformGroup>
        </Image.RenderTransform>
    </Image>
 </Canvas>

我要使用以下代码将该图像放入画布中:

I want to fit this image in canvas with this code:

var fitSize = Math.Max(BigImage.ActualHeight, BigImage.ActualWidth);
var targetSize = Math.Min(ImageArea.ActualHeight, ImageArea.ActualWidth);
var ratio = targetSize / fitSize;
ImageScaleTransform.ScaleX = ImageScaleTransform.ScaleY = ratio;
ImageTranslateTransform.X = 
    fitSize == BigImage.ActualWidth ? 
    0 : ImageArea.ActualWidth / 2 - BigImage.ActualWidth*ratio / 2;
ImageTranslateTransform.Y = 
    fitSize == BigImage.ActualHeight ? 
    0 : ImageArea.ActualHeight / 2 - BigImage.ActualHeight * ratio / 2;

此代码计算缩放比例,然后根据其大小尝试居中图像.问题在于,转换转换的X和Y坐标计算正确,但图像定位不正确(只有一小部分图像在画布的底部可见).如果将RenderTransformOrigin设置为 0,0 图片放置在正常位置.

This code computes scale ratio, then tries to center image depending of it size. The problem is that X and Y coordinates of translate transform are computed right but image not positioned as expected (only small part of image visible in bottom down of the canvas). If set RenderTransformOrigin to 0,0 image positioned normal.

我在哪里弄错了?

推荐答案

问题是 Image 不再位​​于 Canvas 缩放后,因此平移偏移似乎不起作用.

The problem is that the Image is no longer positioned in the upper-left hand corner of the Canvas after scaling and so the translation offsets don't appear to be working.

根据您的问题,这是一个仅XAML的片段,具有红色的 Rectangle ,我们所做的不过是将比例因子手动设置为一个半而不是一个:

Here is a XAML-only fragment based on your question that has a red Rectangle and we've done nothing more than manually set the scale factors to one and a half instead of one:

<Grid>
    <Canvas x:Name="ImageArea" ClipToBounds="False" Background="Gray" Width="200" Height="200">
        <Rectangle x:Name="BigImage" RenderTransformOrigin="0.5,0.5" Width="100" Height="100" Fill="Red">
            <Rectangle.RenderTransform>
                <TransformGroup>
                    <RotateTransform x:Name="ImageRotateTransform" Angle="0"/>
                    <ScaleTransform x:Name="ImageScaleTransform" ScaleX="1.5" ScaleY="1.5"/>
                    <TranslateTransform x:Name="ImageTranslateTransform" X="0" Y="0"/>
                </TransformGroup>
            </Rectangle.RenderTransform>
        </Rectangle>
    </Canvas>
</Grid>

哪个会产生以下结果:

发生这种情况是因为 RenderTransformOrigin 设置.您可以不设置属性,也可以使用值"0,0" 来缩放时使左上角牢牢固定.

This happens because of the RenderTransformOrigin setting. You can leave the property unset or use the value "0,0" to keep the upper-left hand corner firmly seated while you scale it.

这篇关于使用WPF在画布中调整图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆