2011-06-29 21 views
0

在我的应用程序中,我接受来自用户的图像。如果图像大于指定大小,那么我会缩小到适当的大小并保存在数据库中。我正在使用FJCore库来缩放图像。该库适用于JPEG图像。但它不支持PNG图像。看来图书馆最近没有更新。任何想法如何在Silverlight中完成?在Silverlight中缩放PNG图像

回答

0

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

+0

我还需要将此图像转换为字节并在下次使用这些字节时重新呈现它。这种技术在这种情况下会起作用吗? –

0

我用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;  
    }