2012-05-22 3 views
0

У меня есть изображение (Frameworkelement) в моем графическом интерфейсе. Там есть изображение. Теперь я выполняю двойной щелчок на этом изображении, и я хочу, чтобы Изображение сохраняет себя и будет открываться с помощью образа изображения по умолчанию.Сохранение изображений из Image Control не работает

Мой код:

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.

ответ

0

Проблема решена.

Я использовал это: File.WriteAllBytes() сохранить изображение из binaryformat

1

Необходимо, чтобы изображение отображалось до его сохранения. Итак, если вы хотите использовать RenderTargetBitmap, просто установите Image.Source и загрузите Image перед сохранением с SaveToPng (ActualWidth и ActualHeight не должно быть null).

Пример:

Если у вас есть Image Внутри 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); } 
} 

Если вы не " t хотите использовать GridActualWidth и ActualHeight просто передайте ваши и высоту в качестве аргументов.

+0

отображается изображение. Мне не нужно использовать RenderTargetBitmap, я спросил, есть ли более простые и лучшие способы. Не могли бы вы предоставить некоторый пример кода, что на самом деле означает с установкой Image.Source в RenderTargetBitmap? Спасибо – eMi

+0

ну и результат тот же .. Он сохраняет «newimage.png», но когда я открываю его с любым Imageviewer, его просто или просто черным - без контента. – eMi

+0

ok решил проблему сейчас, я использовал 'File.WriteAllBytes()' – eMi

0

В зависимости от типа Image.Source, при условии, что у вас есть BitmapSource как в статье должно быть вдоль этих линий:

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

по классу способ RenderTargetBitmap заключается в Преобразует визуальный объект в растровое изображение. его рекомендуется командой

образца http://msdn.microsoft.com/en-us/library/aa969819.aspx

+0

просто из любопытства, какая команда? – gliderkite

Смежные вопросы