如何在wpf应用程序中了解图像信息

时间:2009-05-26 11:41:45

标签: wpf image c#-3.0

我正在开发WPF应用程序。在那个iam中加载Listbox中的图像。有没有办法知道低分辨率的图像。我想用警告显示低分辨率图像。 Plz帮我解决了这个问题。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

假设您正在加载位图图像(包括BMP,JPEG,PNG等 - 任何不是矢量图像绘制的图像),您可以使用System.Windows.Media.Imaging中的BitmapSource类来读取源图像PixelHeight和PixelWidth。虽然您可以将图像直接加载到BitmapSource中,但如果要加载到Image控件中,则可以直接通过Image的Source属性访问BitmapSource。然后,它只是确定低分辨率对你意味着什么 - 小于50像素,100像素,200像素等,并在PixelHeight或PixelWidth小于此时显示警告。

将它们放在一起,假设我们想要在图像顶部显示橙色矩形,如果它小于100px宽或小于100px高。使用非列表框实现,我们可以这样做:

<Image x:Name="DemoImage" Source="demo.png"/>
<Rectangle Fill="Orange" Width="20" Height="20">
    <Rectangle.Resources>
        <local:LessThanConverter x:Key="LessThanConverter"/>
    </Rectangle.Resources>
    <Rectangle.Style>
        <Style TargetType="Rectangle">
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=DemoImage, Path=Source.PixelHeight, 
                    Converter={StaticResource LessThanConverter}, ConverterParameter=100}" Value="True">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=DemoImage, Path=Source.PixelWidth, 
                    Converter={StaticResource LessThanConverter}, ConverterParameter=100}" Value="True">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Rectangle.Style>
</Rectangle>

由于WPF仅触发检查相等,我们需要一个转换器来比较两个值 - 在这种情况下,我们的实际像素高度/宽度和我们确定的像素高度/宽度使图像'低分辨率' - 并返回我们可以触发的真/假值。在上面的代码中,它名为LessThanConverter。转换器的代码很简单:

/// <summary>
/// Converter to use in WPF triggers that returns true when
/// 'value' is less than 'parameter'.
/// </summary>
public class LessThanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, System.Globalization.CultureInfo culture)
    {
        return ((int)value < System.Convert.ToInt32(parameter));
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后,当加载图像时,矩形的样式检查其触发器以查看图像的高度或宽度是否小于100px;如果是这样,它会将矩形的可见性从默认(折叠)更改为可见,从而在图像顶部显示橙色矩形。当然,当图像分辨率较低时,您可以轻松地使用其他元素进行显示。

要在列表框中执行此操作,您只需更新项目模板即可同时包含源图像和警告图标;然后,根据与其关联的图像将样式应用于警告图标。您不能在此处使用ElementName绑定,但其他绑定类型之一应该足够。

或者,将下面的代码(使用ElementName绑定)包装到包含图像和警告图标的自定义控件中,您可以像项目模板中的普通图像控件一样使用它,除了您的自定义控件显示警告除图像外的图标(显示低分辨率图像时)。