0

我正在尝试调整用户通过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 方法,在构造函数中设置高度和宽度似乎没有任何效果。

4

3 回答 3

2

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

于 2009-11-10T01:06:41.123 回答
2

你看过WriteableBitmapEx 项目吗?这是一个开源项目,有大量的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();
于 2011-04-28T11:12:40.747 回答
1

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

另请查看ImageMagick

于 2009-11-08T17:55:29.387 回答