2014-01-04 6 views
0

Итак, у меня есть код для сохранения изображения, которое я редактировал, например, с помощью теневой тени, и после того, как я сохраню, я узнаю, что код сохраняет файл только с размером изображения. Что мне нужно, так это сохранить с новым размером с эффектом (изображение должно быть больше по размеру из-за тени под ним, например). Я не знаю, как отредактировать код для сохранения большего изображения. Если изображение статично больше, на самом деле это не проблема. Я не возражаю, если он сохраняет размер изображения + 20 пикселей на каждый размер, например.WPF Save Photo Effect

try 
{ 
    Microsoft.Win32.SaveFileDialog saveDialog = new Microsoft.Win32.SaveFileDialog(); 
    saveDialog.Filter = "JPeg Image(*.JPG)|*.jpg|Bitmap Image(*.BMP)|*.bmp|Png Image(*.PNG)|*.png|Gif Image(*.GIF)|*.gif"; 
    if (saveDialog.ShowDialog().Value == true) 
    { 
     // Save current canvas transform 
     Transform transform = image1.LayoutTransform; 
     // reset current transform (in case it is scaled or rotated) 
     image1.LayoutTransform = null; 

     // Get the size of canvas 
     Size size = new Size(image1.ActualWidth, image1.ActualHeight); 
     // Measure and arrange the surface 
     // VERY IMPORTANT 
     image1.Measure(size); 
     image1.Arrange(new Rect(size)); 

     // Create a render bitmap and push the surface to it 
     RenderTargetBitmap renderBitmap = 
      new RenderTargetBitmap(
      (int)size.Width, 
      (int)size.Height, 
      96d, 
      96d, 
      PixelFormats.Default); 
     renderBitmap.Render(image1); 
     BitmapEncoder encoder = new BmpBitmapEncoder(); 
     string extension = saveDialog.FileName.Substring(saveDialog.FileName.LastIndexOf('.')); 
     switch (extension.ToLower()) 
     { 
      case ".jpg": 
       encoder = new JpegBitmapEncoder(); 
       break; 
      case ".bmp": 
       encoder = new BmpBitmapEncoder(); 
       break; 
      case ".gif": 
       encoder = new GifBitmapEncoder(); 
       break; 
      case ".png": 
       encoder = new PngBitmapEncoder(); 
       break; 
     } 
     // push the rendered bitmap to it 
     encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 
     // Create a file stream for saving image 
     using (System.IO.FileStream fs = System.IO.File.Open(saveDialog.FileName, System.IO.FileMode.OpenOrCreate)) 
     { 
      encoder.Save(fs); 
     } 
     // Restore previously saved layout 
     image1.LayoutTransform = transform; 
    } 

} 
catch (Exception) 
{ 

    throw; 
} 

ответ

0

Пожалуйста, попробуйте использовать FileMode.Create вместо FileMode.OpenOrCreate в вызове System.IO.File.Open()

+0

Я изменил его, но все же это не решило мою проблему ... я не знаю, почему это было бы – xDevil

0

Если вы имеете в виду, что вы добавили «эффект растрового изображения» или «затенение» к изображению в WPF, результат должен быть как они не являются частью процесса компоновки и не учитываются в «ActualWidth/ActualHeight». Можно добавить несколько единиц в создании нового образа:

Size size = new Size(image1.ActualWidth + 20, image1.ActualHeight + 20); 

Если другие свойства Компоновка «image1» объекта верны, то это следует сделать трюк.

EDIT: Я рекомендую использовать новый элемент управления для рендеринга изображения, а не использовать элемент управления, который уже является частью другого визуального дерева. Макет/рендеринг могут иметь всевозможные странные побочные эффекты. Вот фрагмент кода, который работал на падение теневой эффект:

EDIT 2: установить свойство «Эффект» на тот же объект, как и в пользовательском интерфейсе ...

 try 
     { 
      Microsoft.Win32.SaveFileDialog saveDialog = new Microsoft.Win32.SaveFileDialog(); 
      saveDialog.Filter = "JPeg Image(*.JPG)|*.jpg|Bitmap Image(*.BMP)|*.bmp|Png Image(*.PNG)|*.png|Gif Image(*.GIF)|*.gif"; 
      if (saveDialog.ShowDialog().Value == true) 
      { 
       Image image2 = new Image(); 
       image2.Source = image1.Source; 
       Grid container = new Grid(); 
       container.Children.Add(image2); 
       container.Background = new SolidColorBrush(Colors.White); 
       image2.Stretch = Stretch.None; 
       image2.VerticalAlignment = System.Windows.VerticalAlignment.Center; 
       image2.HorizontalAlignment = System.Windows.HorizontalAlignment.Center; 

       // Get the size of canvas 
       Size size = new Size(image2.Source.Width + 20, image2.Source.Height + 20); 
       // Measure and arrange the surface 
       // VERY IMPORTANT 
       container.Measure(size); 
       container.Arrange(new Rect(size)); 

       // BitmapEffect is deprecated and buggy, use Effect instead. 

       // since the effect isn't part of the visual tree but independent, 
       // we can just reuse the same object as on the image in the UI. 
       image2.Effect = image1.Effect; 

       //image2.Effect = new DropShadowEffect 
       //{ 
       // Color = Colors.Black, 
       // ShadowDepth = 5, 
       // BlurRadius = 3, 
       // Opacity = 1 
       //}; 


       // Create a render bitmap and push the surface to it 
       RenderTargetBitmap renderBitmap = 
        new RenderTargetBitmap(
        (int)size.Width, 
        (int)size.Height, 
        96d, 
        96d, 
        PixelFormats.Default); 

       renderBitmap.Render(container); 
       BitmapEncoder encoder = new BmpBitmapEncoder(); 
       string extension = saveDialog.FileName.Substring(saveDialog.FileName.LastIndexOf('.')); 
       switch (extension.ToLower()) 
       { 
        case ".jpg": 
         encoder = new JpegBitmapEncoder(); 
         break; 
        case ".bmp": 
         encoder = new BmpBitmapEncoder(); 
         break; 
        case ".gif": 
         encoder = new GifBitmapEncoder(); 
         break; 
        case ".png": 
         encoder = new PngBitmapEncoder(); 
         break; 
       } 
       // push the rendered bitmap to it 
       encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 
       // Create a file stream for saving image 
       using (System.IO.FileStream fs = System.IO.File.Open(saveDialog.FileName, System.IO.FileMode.OpenOrCreate)) 
       { 
        encoder.Save(fs); 
       } 
      } 

     } 
     catch (Exception) 
     { 

      throw; 
     } 

Кроме того, есть причина почему вы используете буфер обмена для загрузки изображения?

+0

Я пробовал то, что вы рекомендовали, и закончил с этим (обратите внимание, что если я попробую с 20 на обеих линиях аква на правом, меньше, но его все еще только эта строка: http://img138.imageshack.us/img138/5682/ko7h.jpg черные линии всегда появляются в сохраненных файлах, кроме формата PNG. – xDevil

+0

Трудно предсказать результат, не зная точно как создается «image1» и как он связан с остальной частью приложения. Черный - это «фоновый цвет» нового изображения, который невидим в PNG, поскольку он будет «прозрачным» там. В зависимости от контекста image1 есть несколько способов заполнения нового изображения белым (или любым другим цветом) перед визуализацией изображения. –

+0

ну, что я искал, было просто изображение с внешним gl ow эффект вокруг него. – xDevil