Уменьшите растровое изображение в WPF с лучшим качеством - PullRequest
0 голосов
/ 12 марта 2011

Как я могу преобразовать этот код GDI в код WPF?

Icon bigIcon32x32 = null;
                    bigIcon32x32 = Icon.ExtractAssociatedIcon("c:\\test.docx");                    

                    Bitmap bm = bigIcon32x32.ToBitmap();

                    Bitmap thumb16x16 = new Bitmap(16, 16);
                    Graphics graphics = Graphics.FromImage(thumb16x16);
                    graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    graphics.DrawImage(bm, new Rectangle(0, 0, 16, 16), new Rectangle(0, 0, bm.Width, bm.Height), GraphicsUnit.Pixel);

                    graphics.Dispose();
                    bm.Dispose(); 
                    thumb16x16.Dispose(); 

Кажется, мне нужно использовать метод ToBitmap (), но с тех пор я хочу использовать только WPF.

В конце я хочу отобразить маленькие изображения 16x16 пикселей в столбце WPF DataGrid через Binding.

1 Ответ

1 голос
/ 12 марта 2011

Чтобы показать растровое изображение в ячейке DataGrid, вы можете использовать DataGridTemplateColumn с DataTemplate, используя IValueConverter для отображения изображения в ячейке DataGrid.

Вы можете поиграть со свойствами BmpBitmapDecoder, чтобы получить максимально хорошее изображение.

Вот определение для DataGrid в XAML:
1- У меня есть три столбца в DataGrid с первым изображением.
2- Я установил Path =.потому что все, что я хотел сделать, это загрузить изображение из конвертера.
3- DataGrid привязывается к коллекции Customers в ViewModel, и в конце я включил их определения для полноты.

<Window x:Class="ContextMenuNotFiring.Views.MainView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:Helpers="clr-namespace:ContextMenuNotFiring.Helpers" 
  Title="Main Window" Height="400" Width="800">
  <Window.Resources>
    <Helpers:ImageConverter  x:Key="imgConv"/>
  </Window.Resources>
  <Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <DataGrid
       Grid.Row="0"
       IsSynchronizedWithCurrentItem="True"
       Background="Transparent" 
       AutoGenerateColumns="False"
       ItemsSource="{Binding Customers}">
     <DataGrid.Columns>
        <DataGridTemplateColumn
           Header="Icon" 
           Width="SizeToHeader">
           <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                  <Image Source="{Binding Path=., Converter={StaticResource imgConv}}" />
              </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn 
           Header="First Name" 
           Width="SizeToHeader"
           Binding="{Binding FirstName}" />
        <DataGridTextColumn 
           Header="Last Name" 
           Width="SizeToCells"
           Binding="{Binding LastName}" />
       </DataGrid.Columns>
    </DataGrid>
  </Grid>
</Window>

Вот конвертер, который выполняет разовый поиск ассоциированного значка Word Doc.Если вы хотите обрабатывать несколько значков, сохраните ссылки BitmapFrame в Словаре и используйте входной параметр «value», чтобы выбрать, какое изображение отображать.

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Globalization;
using System.IO;
using System.Windows.Data;
using System.Windows.Media.Imaging;

namespace ContextMenuNotFiring.Helpers
{
  [ValueConversion(typeof(object), typeof(BitmapSource))]
  public sealed class ImageConverter : IValueConverter
  {
    private static BitmapFrame _bitmapFrame = null;

    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
      try
      {
        if (_bitmapFrame == null)
        {
          using (Icon bigIcon32x32 = Icon.ExtractAssociatedIcon("c:\\temp\\test.docx"))
          {
            using (Bitmap bm = bigIcon32x32.ToBitmap())
            {
              MemoryStream finalStream = new MemoryStream();
              {
                bm.Save(finalStream, ImageFormat.Bmp);
                BmpBitmapDecoder bitmapDecoder = new BmpBitmapDecoder(finalStream,
                            BitmapCreateOptions.None, BitmapCacheOption.None);
                _bitmapFrame = bitmapDecoder.Frames[0];

              }
            }
          }
        }

        return _bitmapFrame;
      }
      catch
      {
        return Binding.DoNothing;
      }
    }

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

Модель просмотра загружает следующую коллекцию «Клиенты - моя модель представления».конструктор.

private List<Customer> _customers = new List<Customer>():
public List<Customer> Customers
{
   get
   {
      return _customers;
   }
}

public class Customer
{
  public String FirstName { get; set; }
  public String LastName { get; set; }
}
...