首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RenderTransform RotateTransform模糊图像

RenderTransform RotateTransform模糊图像
EN

Stack Overflow用户
提问于 2013-02-16 02:57:24
回答 4查看 2.8K关注 0票数 1

我有以下自定义UserControl,它表示我的应用程序中的卡:

代码语言:javascript
复制
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:Core="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Namespace="clr-namespace:MyApp" xmlns:Properties="clr-namespace:MyApp.Properties" Core:Class="MyApp.Card" Height="176" RenderTransformOrigin="0.5,0.5" Width="83" UseLayoutRounding="True">
    <UserControl.LayoutTransform>
        <TransformGroup>
            <RotateTransform/>
            <ScaleTransform/>
        </TransformGroup>
    </UserControl.LayoutTransform>
    <UserControl.RenderTransform>
        <TransformGroup>
            <RotateTransform/>
            <ScaleTransform/>
        </TransformGroup>
    </UserControl.RenderTransform>
    <UserControl.Resources>
        <Namespace:ImagesConverter Core:Key="ImagesConverter"/>
    </UserControl.Resources>
    <Canvas Core:Name="Layout">
        <Image Core:Name="Image" HorizontalAlignment="Left" Source="{Binding Source={Core:Static Properties:Resources.Cards}, Converter={StaticResource ImagesConverter}}" Stretch="None" VerticalAlignment="Top">
            <Image.Clip>
                <RectangleGeometry Core:Name="Clipping" Rect="0,0,83,176"/>
            </Image.Clip>
            <Image.RenderTransform>
                <TranslateTransform Core:Name="Translation" X="0" Y="0"/>
            </Image.RenderTransform>
        </Image>
        <Rectangle Core:Name="Highlight" Canvas.Left="-2" Canvas.Top="-2" Height="180" Opacity="0.7" Stroke="#FFFFF500" StrokeThickness="3" Visibility="Collapsed" Width="87"/>
    </Canvas>
</UserControl>

如你所见..。我有一个包含所有卡面的位PNG图像,然后,当我在构造函数中创建一个传递SuitRank枚举值的新卡时,我会计算出图像的正确剪贴符和转换。一切都很有魅力..。除了当我试图用一个需要90°旋转的Storyboard动画我的卡。下面是我的代码( StoryboardMainWindow.Resources中定义):

代码语言:javascript
复制
<DoubleAnimation BeginTime="00:00:00.4" Duration="00:00:00.2" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(RotateTransform.Angle)" To="90"/>

其结果是:

我不明白怎么回事..。但是图像会以某种方式拉伸,变得非常模糊,就像你看到的。我试着在我的卡控制中使用UseLayoutRounding="True",在我的MainWindow中使用SnapsToDevicePixels="True",就像在其他地方建议的那样.但这不管用!当然..。如果我用LayoutTransform而不是RenderTransform旋转卡片,一切都很完美,卡片也不会模糊.但我不能让卡围绕它的中心旋转,我的动画需要从中心旋转90°。动画Canvas.Top一半的卡高度加上布局旋转看上去像一个非常不明智的解决方案.这也让我的动画看起来很糟糕。你能给我提个解决办法吗?

我试着用RenderOptions.BitmapScalingMode="NearestNeighbor"RenderOptions.EdgeMode="Aliased"..。但情况变得更糟了:

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-18 13:16:38

问题是底层图像,以及布局,有一个奇数作为宽度(83)。RenderTransformOrigin,即使设置为“0.5”,也可能是向上或向下舍入该值,从而导致非常糟糕的呈现。将图像和布局宽度都更改为偶数(82),完全解决了这个问题。

票数 3
EN

Stack Overflow用户

发布于 2013-02-16 03:03:43

您可以尝试更改Image上的Image,并查看是否可以找到有效的设置,我已经在应用程序中添加了用于此情况的设置示例。

代码语言:javascript
复制
   RenderOptions.BitmapScalingMode="NearestNeighbor"
   RenderOptions.EdgeMode="Aliased"

示例:

代码语言:javascript
复制
    <Image RenderOptions.BitmapScalingMode="NearestNeighbor"
           RenderOptions.EdgeMode="Aliased"
           Core:Name="Image" HorizontalAlignment="Left" Source="{Binding Source={Core:Static Properties:Resources.Cards}, Converter={StaticResource ImagesConverter}}" Stretch="None" VerticalAlignment="Top">
        <Image.Clip>
            <RectangleGeometry Core:Name="Clipping" Rect="0,0,83,176"/>
        </Image.Clip>
        <Image.RenderTransform>
            <TranslateTransform Core:Name="Translation" X="0" Y="0"/>
        </Image.RenderTransform>
    </Image>
票数 1
EN

Stack Overflow用户

发布于 2013-02-16 04:15:07

您指出,使用LayoutTransform可以很好地工作,而不会模糊图像。你试过使用它并指定中心作为旋转的枢轴吗?

类似于:

代码语言:javascript
复制
<Image ...>
  <Image.LayoutTransform>
    <RotateTransform CenterX="0.5" CenterY="0.5" Angle="90"/>
  </Image.LayoutTransform>
</Image>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14906448

复制
相关文章

相似问题

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