2011-06-29 61 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;  
    }