【问题标题】:Silverlight Image(s) upload doesn't have a pixelWidth or pixelHeigthSilverlight 图片上传没有 pixelWidth 或 pixelHeigth
【发布时间】:2013-08-26 18:10:57
【问题描述】:

我在从用户桌面打开多个图像文件,然后将这些图像转换为按比例缩小的大小,然后显示在 UI 上(完成所有转换之后)时遇到问题。我找不到确切的问题,但我观察到的是,点击“OpenFileDialog”框控件上的“打开”按钮与我必须阅读这些文件的时间之间似乎有 5 秒的限制(s)。我使用了 6 个大小为 9-11MB 的文件,在另一种情况下,我使用了 50 个 1-2MB 的文件,并且在所有情况下,该过程都会读取到 5 秒过期。它也永远不会在同一张图像上失败,因此图像不会导致问题,这会让我进一步相信它不是文件计数问题。如果我只用几个小文件测试这个过程,它会在 1 秒内发生并且没有失败,我在 UI 上看到所有图像。这就是为什么我猜测它是一个时间问题。我知道 silverlight 在用户与控件(按钮)交互时和显示“OpenFileDialog”框之前可以经过多长时间之间存在安全异常,但这个时间限制似乎不同,但我找不到任何文档。

这是我正在使用的代码。这似乎是一个非常普遍的食谱,但为了完整性而发布。错误发生就行了

var bitmap = new WriteableBitmap(bitmapImage);

它失败的原因是因为bitmapImage pixelWidth/Height == 0。这是完整的代码。

private const int MaxPixelSize = 500;

    public byte[] Convert(FileInfo fileInfo, FileTypes fileType, DateTime startTime)
    {
        byte[] result = null;

        using (var stream = fileInfo.OpenRead())
        {
            DateTime EndTime = DateTime.Now;
            if (fileType == FileTypes.JPG || fileType == FileTypes.BMP || fileType == FileTypes.PNG)
            {
                var bitmapImage = new BitmapImage();
                bitmapImage.SetSource(stream);

                double scaleX = 1;
                double scaleY = 1;
                if (bitmapImage.PixelWidth > MaxPixelSize)
                {
                    scaleX = MaxPixelSize / (double)bitmapImage.PixelWidth;
                }

                if (bitmapImage.PixelHeight > MaxPixelSize)
                {
                    scaleY = MaxPixelSize / (double)bitmapImage.PixelHeight;
                }
                var scale = Math.Min(scaleX, scaleY);

                var bitmap = new WriteableBitmap(bitmapImage);
                var resizedBitmap = bitmap.Resize((int)((double)bitmapImage.PixelWidth * scale), (int)((double)bitmapImage.PixelHeight * scale), WriteableBitmapExtensions.Interpolation.Bilinear);

                using (var scaleStream = new MemoryStream())
                {
                    var encoder = new JpegEncoder();
                    var image = resizedBitmap.ToImage();
                    encoder.Encode(image, scaleStream);

                    result = scaleStream.GetBuffer();
                }
            }
            else
            {
                result = new byte[stream.Length];
                stream.Read(result, 0, (int)stream.Length);
            }
        }

        return result;
    }

欢迎任何帮助或建议。

谢谢,

院长

【问题讨论】:

  • 找到一个类似的线程:stackoverflow.com/questions/15406315/…
  • 我看到了那个,那个解决方案对我不起作用。首先,当代码在 5 秒窗口内处理时,我能够获得 pixelWidth 和 Height,所以我认为我不需要使用该方法。其次,我尝试了该方法,但它甚至没有命中 ImageOpened 事件。不确定设置位图的 URI 或源之间是否有区别。我只能访问源,因为我使用的是来自用户计算机的文件,而不是可以在程序集中进行路径的东西。

标签: c# silverlight-5.0 multifile-uploader


【解决方案1】:

如果bitmapImage.ImageOpened事件被执行,你可以获得有效的pixelWidth和height。 当bitmapImage.SetSource(stream)被执行时,会调用这个事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2023-03-17
    • 2018-02-17
    • 1970-01-01
    • 2018-05-02
    • 2021-08-14
    相关资源
    最近更新 更多