использование изображений из ресурсов - управление изображением пусто - PullRequest
1 голос
/ 22 января 2011

Я пытаюсь использовать изображения из ресурсов.

  1. Я добавляю одно изображение PNG к ресурсам, имя heart.png .Это общедоступное свойство.
  2. Я выставляю ресурсы с классом в качестве совета здесь: http://houseofbilz.com/archives/2009/03/15/binding-to-resources-in-silverlightwpf/

Вот класс:

namespace Spirit.Util {using Properties;

public class PublicResources
{
    private readonly  static Resources Resources = new Resources();

    public Resources SpiritResources { get { return Resources; } }

}

}

Я добавляю в app.xaml:

<Util:PublicResources x:Key="SpiritResources"/>

И попробуйте использовать для управления изображением.

        <Image Style="{StaticResource InfoIcon}">
            <Image.Source>
                <!--<MultiBinding Converter="{StaticResource imageToGrayConverter}">-->
                    <Binding Path="SpiritResources.heart" Source="{StaticResource SpiritResources}"/>
                    <!--<Binding Path="Oponent.Info.IsFriend" Mode="OneWay" UpdateSourceTrigger="PropertyChanged"/>
                </MultiBinding>-->
            </Image.Source>
        </Image>

Проблема с Фристомчто управление изображением пустое, почему?

Моя полная цель - связать изображение из ресурсов по управлению изображениями с помощью мультисвязывания и мультиконвертера.Если свойство Isfriend (Oponent.Info.IsFriend) имеет значение false, я хочу преобразовать изображение в оттенки серого.

Другая проблема здесь.Я использую этот класс конвертера для преобразования изображения в градации серого.

 public class ImageToGrayConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            //string imageUri = values[0] as BimapImage;

            //value is type of System.Drawing.Image
            var image = values[0] as BitmapImage; //new BitmapImage(new Uri(imageUri, UriKind.Relative));

            string s = values[1].ToString();

            bool isLogged = System.Convert.ToBoolean(s);

            if (!isLogged)
            {
                try
                {
                    if (image != null)
                    {
                        var grayBitmapSource = new FormatConvertedBitmap();
                        grayBitmapSource.BeginInit();
                        grayBitmapSource.Source = image;
                        grayBitmapSource.DestinationFormat = PixelFormats.Gray32Float;
                        grayBitmapSource.EndInit();
                        return grayBitmapSource;
                    }
                    return null;

                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return image;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Значение - это тип System.Drawing.BitmapImage, я думаю, что я могу преобразовать Bitmap в класс BitmapImage с помощью этого простого класса:

http://dog -net.org / content / development / wpf / system-drawing-bitmap-to-bitmapimage /

Но я должен решить первую проблему с самого начала.Спасибо за совет.

1 Ответ

0 голосов
/ 22 января 2011

Поскольку ваше сообщение не является тегом Silverlight, я решил вашу проблему в приложении WPF.

Я только что добавил существующий файл PNG в стандартные ресурсы.Затем поместите ресурсы в XAML как статический ресурс и свяжите содержимое PNG-файла с элементом Image:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:props="clr-namespace:WpfApplication1.Properties">
<Window.Resources>
    <self:ImageConverter x:Key="Conv"/>
    <props:Resources x:Key="Res"/>
</Window.Resources>
<StackPanel>
    <Image Source="{Binding Source={StaticResource Res}, Path=dossier_ardoise_images, Converter={StaticResource Conv}}"/>
</StackPanel>

Мой метод конвертации выглядит следующим образом (это стандартный IValueConverter, но это не имеет значения):

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is Bitmap)
        {
            var stream = new MemoryStream();
            ((Bitmap)value).Save(stream, ImageFormat.Png);

            BitmapImage bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.StreamSource = stream;
            bitmap.EndInit();

            return bitmap; // use when you need normal image

            var conv = new FormatConvertedBitmap();
            conv.BeginInit();
            conv.Source = bitmap;
            conv.DestinationFormat = PixelFormats.Gray32Float;
            conv.EndInit();

            return conv; // use when you need grayed image

        }
        return value;
    }

РЕДАКТИРОВАНИЕ

Чтобы получить растровое изображение в оттенках серого с сохранением прозрачности, я бы рекомендовал использовать следующий метод (из этой статьи ):

    public static Bitmap MakeGrayscale(Bitmap original)
    {
        //create a blank bitmap the same size as original
        Bitmap newBitmap = new Bitmap(original.Width, original.Height);

        //get a graphics object from the new image
        Graphics g = Graphics.FromImage(newBitmap);

        //create the grayscale ColorMatrix
        ColorMatrix colorMatrix = new ColorMatrix(
           new float[][] 
              {
                 new float[] {.3f, .3f, .3f, 0, 0},
                 new float[] {.59f, .59f, .59f, 0, 0},
                 new float[] {.11f, .11f, .11f, 0, 0},
                 new float[] {0, 0, 0, 1, 0},
                 new float[] {0, 0, 0, 0, 1}
              });

        //create some image attributes
        ImageAttributes attributes = new ImageAttributes();

        //set the color matrix attribute
        attributes.SetColorMatrix(colorMatrix);

        //draw the original image on the new image
        //using the grayscale color matrix
        g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),
           0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);

        //dispose the Graphics object
        g.Dispose();
        return newBitmap;
    }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is Bitmap)
        {
            var stream = new MemoryStream();
            MakeGrayscale((Bitmap)value).Save(stream, ImageFormat.Png);
            //((Bitmap)value).Save(stream, ImageFormat.Png);

            BitmapImage bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.StreamSource = stream;
            bitmap.EndInit();
            return bitmap;
        }
        return value;
    }
...