在Silverlight 3中调整上载的图像大小

时间:2009-11-08 17:32:30

标签: silverlight image silverlight-3.0 resize image-resizing

我正在尝试调整用户通过OpenFileDialog控件提交的Silverlight 3中的图像大小。我可以获取文件的内容并将其放入WriteableBitmap对象中,然后将其显示在屏幕上,就可以很好地显示在Image控件中。 Image控件甚至会调整大小以适合我的图像控件的大小。这很棒。

问题是内存中的图像仍然是原始的全分辨率图像,我需要在内存中调整它的大小,因为我需要在每个像素的基础上执行一系列昂贵的操作。到目前为止,我有以下代码......

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();

        btnUploadPhoto.Click += new RoutedEventHandler(UploadPhoto_Click);
    }

    private void UploadPhoto_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "Image files (*.png;*.jpg;*.gif;*.bmp)|*.png;*.jpg;*.gif;*.bmp";

        if (dialog.ShowDialog() == true)
        {
            WriteableBitmap bitmap = new WriteableBitmap(500, 500);
            bitmap.SetSource(dialog.File.OpenRead());

            imgMainImage.Source = bitmap;

            txtMessage.Text = "Image size: " + bitmap.PixelWidth + " x " + bitmap.PixelHeight;
        }
    }
}

问题是WriteableBitmap类上没有Resize方法,并且在构造函数中设置高度和宽度似乎没有任何影响。

3 个答案:

答案 0 :(得分:2)

您可以做的是创建一个新的Image元素,并将其源设置为从流创建的可写位图。不要将此Image元素添加到可视树中。创建所需最终大小的另一个 WriteableBitmap。然后在此WriteableBitmap上调用Render,传递Image元素和ScaleTransform以将图像调整为适当的大小。然后,您可以使用第二个WriteableBitmap作为第二个Image元素的源,并将其添加到可视树中。然后,您可以允许第一个Image和WriteableBitmap对象获取GCed,以便重新获得内存。

答案 1 :(得分:2)

你看过WriteableBitmapEx project了吗?这是一个开源项目,为WriteableBitmap类提供了大量的扩展方法。以下是您调整大小的方法:

BitmapImage image = new BitmapImage();
image.SetSource(dialog.File.OpenRead());

WriteableBitmap bitmap = new WriteableBitmap(image);
WriteableBitmap resizedBitmap = bitmap.Resize(500, 500, WriteableBitmapExtensions.Interpolation.Bilinear);

// For uploading
byte[] data = resizedBitmap.ToByteArray();

答案 2 :(得分:1)

我使用FJCore取得了一些成功,它是来自Occipital的开源C#成像工具包。包括内存调整大小功能。

另请查看ImageMagick