C# 拉伸图像以填充可用的宽度/高度(单独)

C# 拉伸图像以填充可用的宽度/高度(单独),c#,wpf,image,C#,Wpf,Image,是否可以用xaml中的图像填充可用的宽度/高度? 我需要像UniformToFill这样的东西,但我可以控制拉伸方向(宽度或高度) 假设我有以下代码: <UniformGrid Columns="2" Rows="2"> <Image Source="Desert1.jpg" Stretch="Uniform"/> // <Image Source="Desert2.jpg" Stretch="UniformToFill"/>

是否可以用xaml中的图像填充可用的宽度/高度? 我需要像UniformToFill这样的东西,但我可以控制拉伸方向(宽度或高度)

假设我有以下代码:

<UniformGrid Columns="2" Rows="2">        
    <Image Source="Desert1.jpg" Stretch="Uniform"/> //
    <Image Source="Desert2.jpg" Stretch="UniformToFill"/> // 
    <Image Source="Desert3.jpg" />
    <Image Source="Desert4.jpg" />
</UniformGrid>

//
// 
编辑: 例如(宽度):若图像的宽度是我想要显示的宽度的一半,我不关心高度,只缩放x2图像的高度和宽度。所以图像必须适合宽度,而不关心高度。这是期望的行为,但如果不可能的话-好的。所以你们可以重新思考这个问题,若可能的话,我怎样才能在xaml中做到这一点


此外,所有图像可能具有不同的宽度和高度

这可能就是您要查找的

TransformedBitmap

这是我在ImageUtility类中创建的一个静态方法

public static TransformedBitmap GetScaledBitmapImageSprite(BitmapSource src, double x_scale, double y_scale)
{
  return (new TransformedBitmap(src, new ScaleTransform(x_scale, y_scale)));
{
x_刻度和y_刻度是双刻度,形式如下:

所需宽度/原始宽度

也许与你所寻找的有点不同,但我认为它可以让你在正确的轨道上开始

您可以将转换位图存储在内存中,并通过以下方式应用新的转换:

TransformedBitmap x = new TransformedBitmap();
x.Transform = new ScaleTransform(x,y);
我认为在某些条件下,你可能会得到你想要的效果。如果您的图像都大于将显示的大小,您可以使用以下方法:

<Image Source="Desert.jpg" Stretch="UniformToFill" StretchDirection="DownOnly" />

视图框
图像
具有相同的
拉伸
属性,MSDN文章中有一个很好的例子说明了不同组合之间的差异。

您应该使用

<Image Source="{Binding Image}" Stretch="Fill"/>

比如,如果您使用Stretch=“UnifrmtoFill”,那么它将以一定的比例改变长度和宽度,或者我将两者一起说

所以如果你使用
Stretch=“Fill”,无论发生什么变化,您都可以一次更改高度或宽度。

您需要动态控制它吗?@KingKing是的,我需要界面中的复选框之类的东西来控制它,也可以接受“静态”解决方案,因此,我可以将xaml代码加倍并隐藏不必要的代码:D。但是动态地说,我真的不理解这里的问题。你是说如果你的图像是你想显示的一半宽,但是高度正确,你只想水平扩展它?这种行为对我来说毫无意义,因此如果是这样的话,也许你应该重新考虑你的目标。@ZombieSheep据我所知,他可能想拥有一些
属性
,以确定图像是应该在
宽度
上拉伸还是在
高度
上拉伸(当然是另一个(非拉伸)将统一格式,以便图像的宽度/高度与原始图像的宽度/高度相同)。我正在寻找基于XAML的解决方案,因为它使我不必获取父容器的高度、图片高度,然后计算代码中的缩放率。我已经看到了这些属性,但是一个他们可以工作的情况应该太具体了。此外,UniformToFill覆盖的此类情况超过了通常所需的高度或宽度。不幸的是,UniformToFill不允许设置所需的属性。如果您确实花时间将MSDN上链接页面中的示例代码放入新的测试WPF项目中,并使用上面列出的设置运行它,那么您将看到这确实提供了所需的结果。它工作的唯一条件是原始图像的大小大于显示的大小。尽管如此,如果这个条件不能满足,那么我承认这对你没有帮助。好吧,我写了这个代码,但仍然不明白。对于宽度和高度都较大的图片,使用UniformToFill看起来绝对像,但对于较小的图片,它根本不起作用。看起来我无法控制缩放时必须使用哪个属性。我确实说过,只有当你的图像比你显示的图像大时,它才会起作用。如果您选择
DownOnly
,然后在
Unifrom
UniformToFill
设置之间切换,您将看到它通过降低高度和显示所需的全宽来工作。如果您想放大图像(例如,使用比显示的图像小的图像),那么请不要介意,祝您搜索好运。我在MSDN示例中仔细测试了更大的图片(和旋转版本)<代码>统一减少宽度和高度。对于
UniformToFill
减少宽度或高度的最低值。而且,看起来我无法控制缩放必须使用哪个属性。