gpt4 book ai didi

silverlight - 在 Silverlight 3 中使用 WriteableBitmap 调整图像大小

转载 作者:行者123 更新时间:2023-12-04 19:23:54 25 4
gpt4 key购买 nike

这是我使用 Silverlight 的第一天。我正在尝试构建一个应用程序的原型(prototype),该应用程序(以及其他功能)应该能够调整用户提供的图像的大小。它应该能够一次处理和显示多个调整大小的图像。我尝试过的最明显的方法似乎“泄漏”了内存,因为原始位图仍然以某种方式被引用,这导致 Silverlight 在一段时间后分配数百兆字节的内存。我只想能够一张一张地加载图像,调整它们的大小并保留小版本。

准确地说,我尝试了以下方法:

  • 创建 System.Windows.Controls.Image 的列表'(并缩放它们)。我并不惊讶这没有奏效。
  • 创建由图像画笔填充的矩形列表。我也不意外。
  • 将位图渲染成 System.Windows.Media.Imaging.WriteableBitmap .我希望这会表现良好;我假设位图实际上只是直接绘制的,没有以任何方式引用。但是,内存消耗另有说明。

  • 以下是相关代码的片段:
    // create image source
    Stream stream = file.OpenRead();
    BitmapImage bmpImg = new BitmapImage();
    bmpImg.SetSource(stream);
    stream.Close();

    // create temporary image from it
    Image tmpImg = new Image();
    tmpImg.Source = bmpImg;

    // this is required by WriteableBitmap
    tmpImg.Measure(new Size(100, 100));
    tmpImg.Arrange(new Rect(0, 0, 100, 100));

    // prepare scaling to 100x100
    ScaleTransform scaleTrans = new ScaleTransform();
    double scale = (double)100 / (double)Math.Max(bmpImg.PixelHeight, bmpImg.PixelWidth);
    scaleTrans.CenterX = 0;
    scaleTrans.CenterY = 0;
    scaleTrans.ScaleX = scale;
    scaleTrans.ScaleY = scale;

    // render
    WriteableBitmap writeableBitmap = new WriteableBitmap(100, 100);
    writeableBitmap.Render(tmpImg, scaleTrans);
    writeableBitmap.Invalidate();

    // final image
    Image img = new Image();
    img.Source = writeableBitmap;

    我希望我没有错过任何愚蠢的东西,但它看起来对我来说还可以并且做正确的事情(除了内存问题)。还请记住,代码质量不应该是生产质量;这只是一个快速而肮脏的原型(prototype)。

    我注意到我并不孤单。我在 Silverlight 中发现了与图像处理相关的问题。我也知道我可以使用一些第三方库,在服务器上进行处理或自己编写一些东西,但令我惊讶的是 Silverlight 不提供任何基本的图像处理功能。考虑到 Silverlight 的定位,这似乎不是一个不常见的要求。

    最佳答案

    你看过WriteableBitmapEx project ?这是一个开源项目,拥有大量的 WriteableBitmap 扩展方法。类(class)。以下是调整大小的方法:

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

    关于silverlight - 在 Silverlight 3 中使用 WriteableBitmap 调整图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1230205/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com