2011-03-11 9 views
0

このGDIコードをWPFコードに変換するにはどうすればよいですか?最高の品質の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のみを使用したいと考えています。

最後に、バインディングを使用してWPF DataGridの列に小さな16x16ピクセルのイメージを表示したいとします。

答えて

1

DataGridセルにビットマップを表示するには、DataGridセルに画像を表示するためにIValueConverterを使用してDataTemplateでDataTemplateColumnを使用できます。

BmpBitmapDecoderのプロパティで再生して、できるだけ良好な画像を実現できます。

XAMLのDataGridの定義を次に示します。
1-私はDataGridに3つの列があり、最初は画像です。
2 Path =を設定します。私がやりたかったのは、コンバータから画像をロードすることだったからです。
3 DataGridはViewModelのCustomersコレクションにバインドされ、最後に完全性の定義が含まれています。

<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(); 
    } 
    } 
} 

View Modelは、次のMy Customers Modelコンストラクタのコレクションを読み込みます。

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; } 
} 
+0

@ザンボニ@Zamboni私はコードをチェックする時間が少なくなっていますが、次の週末に試してみます。確かにその良いコードがあれば、それを解決策としてマークします;-) – msfanboy

+0

@ Zamboniどこで辞書を作成して、どこにbitmapFrameをキャッシュしますか?私はMVVMを使用しています。 – msfanboy

+0

コードの複数の部分でこれらのイメージを使用する必要がある場合は、辞書をよりグローバル/共有の場所に移動してアクセス可能にする必要があります。それ以外の場合は、BitmapFrameを使用するコードの近くにディクショナリを配置する必要があります。 ViewModelからイメージの表示を制御する場合は、この例のコードをViewModelにコピーし、_bitmapFrameをViewModelのImageSource型プロパティに割り当て、ビューからバインドします。 コンバータをイメージを使用する唯一の場所なら、私はおそらくそれをコンバーターに保持しています。 – Zamboni

関連する問題