0

ユーザーがコントロールを介して送信した Silverlight 3 の画像のサイズを変更しようとしていますOpenFileDialog。ファイルの内容を取得してWriteableBitmapオブジェクトに配置し、それを画面上のImageコントロールに表示できます。コントロールは、画像コントロールのImageサイズに合わせてサイズを変更することもできます。これは素晴らしいことです。

問題は、メモリ内の画像がまだ元のフル解像度の画像であることです。ピクセルごとに実行する必要がある高価な操作がたくさんあるため、メモリ内でサイズを変更する必要があります。これまでのところ、次のコードがあります...

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();

        btnUploadPhoto.Click += new RoutedEventHandler(UploadPhoto_Click);
    }

    private void UploadPhoto_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "Image files (*.png;*.jpg;*.gif;*.bmp)|*.png;*.jpg;*.gif;*.bmp";

        if (dialog.ShowDialog() == true)
        {
            WriteableBitmap bitmap = new WriteableBitmap(500, 500);
            bitmap.SetSource(dialog.File.OpenRead());

            imgMainImage.Source = bitmap;

            txtMessage.Text = "Image size: " + bitmap.PixelWidth + " x " + bitmap.PixelHeight;
        }
    }
}

問題は、WriteableBitmap クラスに Resize メソッドがなく、コンストラクターで高さと幅を設定しても効果がないように見えることです。

4

3 に答える 3

2

できることは、新しい Image 要素を作成し、そのソースをストリームから作成された書き込み可能なビットマップに設定することです。この Image 要素をビジュアル ツリーに追加しないでください。必要な最終サイズの別のWriteableBitmap を作成します。次に、この WriteableBitmap で Render を呼び出し、Image 要素と ScaleTransform を渡して、画像を適切なサイズに変更します。次に、2 番目の WriteableBitmap を 2 番目の Image 要素のソースとして使用し、それをビジュアル ツリーに追加できます。次に、最初の Image オブジェクトと WriteableBitmap オブジェクトを GC して、メモリを取り戻すことができます。

于 2009-11-10T01:06:41.123 に答える
1

私はFJCoreを使用してある程度の成功を収めました。これは、Occipital のオープン ソース C# イメージング ツールキットです。インメモリのサイズ変更機能が含まれています。

ImageMagickもチェックしてください。

于 2009-11-08T17:55:29.387 に答える