0

GUI にイメージ (フレームワーク要素) があります。そこにイメージがあります。今、この画像でダブルクリックを実行していますが、画像が保存され、デフォルトの画像ビューアーで開かれるようにしたいと考えています。

私のコード:

void image_MouseDown(object sender, MouseButtonEventArgs e)
{
    //Wayaround, cause there is no DoubleClick Event on Image 
    if (e.ChangedButton == MouseButton.Left && e.ClickCount == 2)
    {
        SaveToPng(((Image)sender), "SavedPicture.png");
        Process.Start("SavedPicture.png");
    }
}

void SaveToPng(FrameworkElement visual, string fileName)
{
    var encoder = new PngBitmapEncoder();
    SaveUsingEncoder(visual, fileName, encoder);
}

void SaveUsingEncoder(FrameworkElement visual, string fileName, BitmapEncoder encoder)
{
    RenderTargetBitmap bitmap = new RenderTargetBitmap(
        (int)visual.ActualWidth,
        (int)visual.ActualHeight,
        96,
        96,
        PixelFormats.Pbgra32);
    bitmap.Render(visual);
    BitmapFrame frame = BitmapFrame.Create(bitmap);
    encoder.Frames.Add(frame);

    using (var stream = File.Create(fileName))
    {
        encoder.Save(stream);
    }
}

画像を開くと正常に動作しProcess.Startます。問題は保存です。それは画像を保存します:SavedPicture.pngしかし、ただの黒なので、グラフィックはありません..多分誰かが私のコードで何が間違っているか、またはWPFで画像を保存するより良い方法を知っているかもしれません.

4

3 に答える 3

1

保存する前に画像を表示する必要があります。したがって、使用したい場合は、 をRenderTargetBitmap設定してImage.SourceをロードしてImageからSaveToPng( ActualWidthand をActualHeightnull にすることはできません)。

Image内部に aがある場合Panel:

<Grid x:Name="MyGrid">
    <Image x:Name="MyImage"/>
</Grid>

テスト クラス コンストラクターを設定Image.Sourceし、画像が読み込まれた後にのみ保存します。

public MainWindow()
{
    InitializeComponent();

    BitmapImage bmp = new BitmapImage();
    bmp.BeginInit();
    bmp.UriSource = new Uri("image.png", UriKind.RelativeOrAbsolute);
    bmp.EndInit();
    MyImage.Source = bmp;

}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    RenderTargetBitmap bmp = new RenderTargetBitmap((int)MyGrid.ActualWidth,
            (int)MyGrid.ActualHeight, 96, 96, PixelFormats.Default);

    bmp.Render(MyImage);
    PngBitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bmp));

    using (var stream = System.IO.File.Create("newimage.png"))
    { encoder.Save(stream); }
}

Grid ActualWidth使用したくない場合はActualHeight、 with と height を引数として渡します。

于 2012-05-22T11:07:21.097 に答える
0

記事のように BitmapSource があると仮定すると、Image.Source のタイプによって異なります。

var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create((BitmapSource)image.Source));
using (FileStream stream = new FileStream(filePath, FileMode.Create))
    encoder.Save(stream);

ちなみにRenderTargetBitmapクラスはVisualオブジェクトをビットマップに変換します。チームが推奨する

サンプル http://msdn.microsoft.com/en-us/library/aa969819.aspx

于 2012-05-22T12:11:05.527 に答える
0

問題が解決しました。

私はこれを使用しました:File.WriteAllBytes() binaryformatから画像を保存する

于 2012-05-29T08:38:14.430 に答える