2011-06-29 12 views
0

私のアプリケーションでは、ユーザーからの画像を受け入れています。イメージが指定されたサイズを超える場合、適切なサイズに縮小してデータベースに保存します。私は画像をスケーリングするためにFJCoreライブラリを使用しています。ライブラリはJPEG画像でうまく動作します。しかし、PNG画像はサポートしていません。ライブラリが最近更新されていないようです。 Silverlightでどのようにこれを行うことができますか?シルバーライトでのPNG画像の拡大

答えて

0

新しいImageエレメントを作成し、そのソースをストリームから作成したWriteableビットマップに設定しますが、このImageエレメントをビジュアルツリーに追加しないでください。必要な最終サイズの別のWriteableBitmapを作成し、Image要素とScaleTransformを渡してこのWriteableBitmapでレンダリングを呼び出し、イメージを適切なサイズにリサイズします。次に、2番目のWriteableBitmapを2番目の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;  
    }