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