0

最近、私はWindows Presentation Foundationで遊んで、チェスのバリエーションを作成することにしました。すべてが完了しましたが(私は信じています)、PNGファイルを画像コントロールとして設定する方法が見つからないため、長い時間がかかります。これは、問題の影響を受ける模範的なクラスです。

public class Field
{
    public Image Image { get; set; }

    public Image GetImage(String keyName)
    {
        ResourceDictionary imagesDictionary = new ResourceDictionary();
        imagesDictionary.Source = new Uri("file:/[...]/ImagesDictionary.xaml");
        var var = imagesDictionary[keyName];
        Image image = (Image) imagesDictionary[keyName];
        return image;
    }

    public void RefreshImage()
    {
        if (Unit.Subclass.CompareTo("Bishop").Equals(0))
        {
            if (Unit.Player.IsWhite)
            {
                this.Image = this.GetImage("WhiteBishop");
            }
            ...
    }

}

My ImagesDictionary.xamlファイル:

<ResourceDictionary>
    <ImageSource x:Key="BlackBishop">BlackBishop.png</ImageSource>
    <ImageSource x:Key="WhiteBishop">WhiteBishop.png</ImageSource>
    ...
</ResourceDictionary>

そして問題は、GetImageの出力を変換する方法がわからないことです

(System.Windows.Media.Imaging.BitmapFrameDecode)

(System.Windows.Controls.Image)

何か案は?

4

3 に答える 3

1

System.Windows.Media.Imaging.BitmapFrameはImageSourceから派生しています。

あなたはこれを行うことができるはずです:

this.Image = new Image();
this.Image.Source = this.GetImage("WhiteBishop");

また

this.Image.Source = this.GetImage("WhiteBishop").Source;

BitmapFrameDecodeが、ImageSourceからではなく、System.Windows.Imaging.Imageから本当に派生している場合。

-ジェシー

于 2012-06-13T15:01:12.150 に答える
0

OK、これが改善されたGetImageSourceです(名前はその本当の目的を反映するように変更されました)。

    /// <summary>
    /// Get an ImageSource from the ResourceDictionary  referred to by the
    ///     <paramref name="uriDictionary"/>.
    /// </summary>
    /// <param name="keyName">The ResourceDictionary key of the ImageSource
    ///     to retrieve.</param>
    /// <param name="uriDictionary">The Uri to the XAML file that holds
    ///     the ResourceDictionary.</param>
    /// <returns><c>null</c> on failure, the requested <c>ImageSource</c>
    ///     on success.</returns>
    /// <remarks>If the requested resource is an <c>Image</c> instead of
    ///     an <c>ImageSource</c>,
    /// then the <c>image.Source</c> is returned.</remarks>
    public static ImageSource GetImageSource(String keyName, Uri uriDictionary)
    {
        if (String.IsNullOrEmpty(keyName))
            throw new ArgumentNullException("keyName");
        if (null == uriDictionary)
            throw new ArgumentNullException("uriDictionary");

        ResourceDictionary imagesDictionary = new ResourceDictionary();
        imagesDictionary.Source = uriDictionary;
        var var = imagesDictionary[keyName];
        Object blob = imagesDictionary[keyName];
        Debug.WriteLine(String.Format(
            "error: GetImageSource( '{0}', '{1}' )"
            + " value is: {2}",
            keyName,
            uriDictionary,
            (null == blob) ? "null" : blob.GetType().FullName));
        if (null != blob)
        {
            if (blob is ImageSource)
            {
                return blob as ImageSource;
            }
            if (blob is Image)
            {
                Image image = blob as Image;
                return image.Source;
            }
            if (blob is System.Drawing.Image)
            {
                System.Drawing.Image dImage = blob as System.Drawing.Image;
                MemoryStream mem = new MemoryStream();
                dImage.Save(mem, System.Drawing.Imaging.ImageFormat.MemoryBmp);
                mem.Position = 0;
                BitmapDecoder decode = new BmpBitmapDecoder(
                    mem,
                    BitmapCreateOptions.None,
                    BitmapCacheOption.None);
                return decode.Frames[0];
            }
            Debug.WriteLine(String.Format(
                "error: GetImageSource( '{0}', '{1}' )"
                + " can't handle type: {2}",
                keyName,
                uriDictionary,
                blob.GetType().FullName));
        }
        return null;
    }

そしてそれを使用するには、これを行います:

String packText = String.Format("pack://application:,,,/{0};component/{1}",
    Assembly.GetEntryAssembly().FullName,
    "ImageDictionary.xaml");
Uri imageUri = new Uri(packText);
// or if you prefer:
// Uri imageUri = new Uri("file:///.../ImageDictionary.xaml");
//

ImageSource source = GetImageSource(imageKey, imageUri);

if (null != source)
{
    this.Image.Source = source;
}
else
{
    // bail ...
}

ケースはDrawing.Image、を使用していても、BMP、PNG、JPG、GIFなどを処理しBmpBitmapDecoderます。ただし、XAML画像は非常にきれいに伸びますが、伸びないことに注意してDrawing.Imageください。

-ジェシー

于 2012-06-14T22:40:47.397 に答える
0
Dim img As New BitmapImage

Using mem As New System.IO.MemoryStream(<InputArrayHere>)
    img.BeginInit()
    img.StreamSource = mem
    img.EndInit()
End Using

return img
于 2013-01-11T05:44:57.817 に答える