【问题标题】:Scaling PNG images in silverlight在silverlight中缩放PNG图像
【发布时间】:2011-06-29 09:13:58
【问题描述】:

在我的应用程序中,我正在接受来自用户的图像。如果图像超过指定大小,那么我将缩小到适当的大小并保存在数据库中。我正在使用FJCore 库来缩放图像。该库适用于 JPEG 图像。但它不支持PNG图像。图书馆似乎最近没有更新。知道如何在 Silverlight 中做到这一点吗?

【问题讨论】:

    标签: silverlight-4.0 png image-scaling


    【解决方案1】:

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

    【讨论】:

    • 我还需要将此图像转换为字节,并在下次使用这些字节时重新渲染。这种技术在这种情况下会起作用吗?
    【解决方案2】:

    我使用 WriteableBitmapEx 项目来实现这一点。如果有人需要,这里是代码。

    private void ShowCustomImageButton_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openDialog = new OpenFileDialog();
            openDialog.Multiselect = false;
            openDialog.Filter = "PNG Files|*.PNG";
            bool? userClickedOK = openDialog.ShowDialog();
            if (userClickedOK == true)
            {                
                BitmapImage image = new BitmapImage();
                // get image that user has selected.
                image.SetSource(openDialog.File.OpenRead());
                WriteableBitmap wrtbmp = new WriteableBitmap(image);
                // resize image if needed.
                wrtbmp = wrtbmp.Resize(64, 64, WriteableBitmapExtensions.Interpolation.NearestNeighbor);
                var img = wrtbmp.ToImage();
                // convert image into file stream.
                Stream filestram = img.ToStream();
                filestram.Position = 0;
                using (filestram)
                {
                    // convert file stream into memory stream.
                    var memoryStream = new MemoryStream();
                    byte[] aryBuffer = new byte[16384];
                    int nRead = filestram.Read(aryBuffer, 0, aryBuffer.Length);
                    while (nRead > 0)
                    {
                        memoryStream.Write(aryBuffer, 0, nRead);
                        nRead = filestram.Read(aryBuffer, 0, aryBuffer.Length);
                    }
                    // use following line to convert in bytes and save into database.
                    memoryStream.ToArray();
                    imgCustomImage.Source = CreateBitmapImage(memoryStream);
                }                        
            }
        }
    
        private BitmapImage CreateBitmapImage(MemoryStream memoryStream)
        {
            if ((memoryStream == null) || (memoryStream.Length == 0))
                return null;         
    
            var image = new BitmapImage();
            image.SetSource(memoryStream);
            return image;      
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      相关资源
      最近更新 更多