Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Casper-SC
Эксперт .NET
4092 / 1942 / 381
Регистрация: 27.03.2010
Сообщений: 5,345
Записей в блоге: 1
1

Снимок Visual объекта в PNG. Не правильно работает Margin

03.05.2014, 12:28. Просмотров 941. Ответов 7
Метки нет (Все метки)

Народ, что я вообще не догонямба, что за нафик. Делаю снимок кнопки таким кодом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
 
namespace Wpf_WindowElementsToPng
{
    public static class ImageHelper
    {
        public static ImageSource ToImageSource(Brush brush, Size size, Thickness margin, string fileName)
        {
            var bitmap = new RenderTargetBitmap(
                (int)(size.Width),
                (int)(size.Height),
                96, 96, PixelFormats.Pbgra32);
 
            var drawingVisual = new DrawingVisual();
            using (DrawingContext context = drawingVisual.RenderOpen())
            {
                var rect = new Rect(margin.Left, margin.Top,
                    size.Width + margin.Left + margin.Right,
                    size.Height + margin.Top + margin.Bottom);
                context.DrawRectangle(brush, null, rect);
            }
 
            bitmap.Render(drawingVisual);
 
            var encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bitmap));
 
            using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Read))
            {
                encoder.Save(fs);
            }
 
            return bitmap;
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
 
            string file = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),
                "testButton1.png");
 
            var visualObject = (Button) sender;
            var visual = new VisualBrush(visualObject);
 
            ImageHelper.ToImageSource(visual, visualObject.RenderSize, new Thickness(4), file);
 
            Process.Start(file);
        }
    }
XML
1
2
3
4
5
6
7
8
9
<Window x:Class="Wpf_WindowElementsToPng.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="95,67,0,0" VerticalAlignment="Top" Width="216" Click="Button_Click" Height="101"/>
 
    </Grid>
</Window>
В итоге я получаю не кнопку с пустой (прозрачной) областью в 4 пикселя вокруг кнопки, а тупо сдвиг влево вверх. Почему? Где ошибка?
0
Изображения
 
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2014, 12:28
Ответы с готовыми решениями:

CSS Не работает margin-top/margin-left в IE, Firefox
Добрый день! Проблема в коде CSS .check &gt; span{ -webkit-transition: all ease-in-out...

Margin-top и margin-bottom в ie6 не работает
#news1 &gt; p { margin-top:15px; margin-bottom:15px; } пробовал ставить !important эффект...

Не изменяется Margin у динамического объекта
Всем привет, скажите как мне изменить правильно у динамически созданного Rectangle? пытаюсь сделать...

Как получить значения margin у объекта
Как получить значения margin у объекта? Например так задаю: RelativeLayout.LayoutParams...

Не работает margin
Всем привет! Благодарю, что заглянули сюда! Помогите, пожалуйста, начинающему верстальщику. Хотел...

7
NickoTin
Почетный модератор
Эксперт .NET
8657 / 3609 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
03.05.2014, 20:00 2
Лучший ответ Сообщение было отмечено NickoTin как решение

Решение

Дано: кнопка размером 60x20, margin(4)
Ваши действия: создается изображение размером 60x20, в него отрисовывается кнопка по координатам 4,4 размером 60+4+4,20+4+4, (!) с учетом того что область для рисования всего 60x20.

В зависимости от того что требуется (вписать кнопку в область (1), или расширить область с учетом margin не меняя размер кнопки (2)) будут разные алгоритмы пересчетов.
  1. C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
                var bitmap = new RenderTargetBitmap(
                    (int)(size.Width),
                    (int)(size.Height),
                    96, 96, PixelFormats.Pbgra32 );
     
                var drawingVisual = new DrawingVisual();
                using ( DrawingContext context = drawingVisual.RenderOpen() )
                {
                    var rect = new Rect( margin.Left, margin.Top,
                        size.Width - (margin.Left + margin.Right),
                        size.Height - (margin.Top + margin.Bottom) );
                    context.DrawRectangle( brush, null, rect );
                }
  2. Думаю нужен этот.
    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
                var bitmap = new RenderTargetBitmap(
                    (int)(size.Width + margin.Left + margin.Right),
                    (int)(size.Height + margin.Top + margin.Bottom),
                    96, 96, PixelFormats.Pbgra32 );
     
                var drawingVisual = new DrawingVisual();
                using ( DrawingContext context = drawingVisual.RenderOpen() )
                {
                    var rect = new Rect( margin.Left, margin.Top, size.Width, size.Height );
                    context.DrawRectangle( brush, null, rect );
                }
0
Casper-SC
Эксперт .NET
4092 / 1942 / 381
Регистрация: 27.03.2010
Сообщений: 5,345
Записей в блоге: 1
04.05.2014, 12:44  [ТС] 3
Цитата Сообщение от NickoTin Посмотреть сообщение
C#
1
2
(int)(size.Width + margin.Left + margin.Right),
(int)(size.Height + margin.Top + margin.Bottom),
Ничего не изменилось вообще. Вроде бы у меня изначально так и было, не помню зачем удалил.
0
NickoTin
Почетный модератор
Эксперт .NET
8657 / 3609 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
04.05.2014, 15:23 4
  • C#
    1
    2
    
                    (int)(size.Width + margin.Left + margin.Right),
                    (int)(size.Height + margin.Top + margin.Bottom),
    Название: testButton1.png
Просмотров: 39

Размер: 1.8 Кб
    Снимок Visual объекта в PNG. Не правильно работает Margin
  • C#
    1
    2
    
                    (int)(size.Width /*+ margin.Left + margin.Right*/),
                    (int)(size.Height /*+ margin.Top + margin.Bottom*/),
    Название: testButton2.png
Просмотров: 39

Размер: 1.3 Кб
    Снимок Visual объекта в PNG. Не правильно работает Margin

?
1
04.05.2014, 15:23
Casper-SC
Эксперт .NET
4092 / 1942 / 381
Регистрация: 27.03.2010
Сообщений: 5,345
Записей в блоге: 1
04.05.2014, 15:28  [ТС] 5
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
 
namespace Wpf_WindowElementsToPng
{
    public static class ImageHelper
    {
        public static ImageSource ToImageSource(Brush brush, Size size, Thickness margin, string fileName)
        {
            var bitmap = new RenderTargetBitmap(
                (int)(size.Width + margin.Left + margin.Right),
                (int)(size.Height + margin.Top + margin.Bottom),
                96, 96, PixelFormats.Pbgra32);
 
            var drawingVisual = new DrawingVisual();
            using (DrawingContext context = drawingVisual.RenderOpen())
            {
                var rect = new Rect(margin.Left, margin.Top,
                    size.Width + margin.Left + margin.Right,
                    size.Height + margin.Top + margin.Bottom);
                context.DrawRectangle(brush, null, rect);
            }
 
            bitmap.Render(drawingVisual);
 
            var encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bitmap));
 
            using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Read))
            {
                encoder.Save(fs);
            }
 
            return bitmap;
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
 
namespace Wpf_WindowElementsToPng
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            string file = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),
                "testButton1.png");
 
            var visualObject = (Button) sender;
            var visual = new VisualBrush(visualObject);
 
            ImageHelper.ToImageSource(visual, visualObject.RenderSize, new Thickness(4), file);
 
            Process.Start(file);
        }
    }
}
XML
1
2
3
4
5
6
7
8
9
<Window x:Class="Wpf_WindowElementsToPng.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="95,67,0,0" 
                VerticalAlignment="Top" Width="216" Click="Button_Click" Height="101"/>
    </Grid>
</Window>
Ну не нработает у меня и всё, просто тупо сдвиг влево вверх.
0
NickoTin
Почетный модератор
Эксперт .NET
8657 / 3609 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
04.05.2014, 15:48 6
Casper-SC, в первом Вашем фрагменте сравните строчки 22 и 23 с тем что у меня.

Добавлено через 17 минут
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    public static class ImageHelper
    {
        public static ImageSource ToImageSource ( Brush brush, Size size, Thickness margin, string fileName )
        {
            var bitmap = new RenderTargetBitmap(
                // увеличивается размер полотна с учетом отступов слева/справа и сверху/снизу
                (int)(size.Width + margin.Left + margin.Right),
                (int)(size.Height + margin.Top + margin.Bottom),
                96, 96, PixelFormats.Pbgra32 );
 
            var drawingVisual = new DrawingVisual();
            using ( DrawingContext context = drawingVisual.RenderOpen() )
            {
                // у rect'а область задается без отступов справа и снизу, только смещение и размер
                var rect = new Rect( margin.Left, margin.Top, size.Width, size.Height );
                context.DrawRectangle( brush, null, rect );
            }
 
            bitmap.Render( drawingVisual );
 
            var encoder = new PngBitmapEncoder();
            encoder.Frames.Add( BitmapFrame.Create( bitmap ) );
 
            using ( var fs = new FileStream( fileName, FileMode.Create, FileAccess.Write, FileShare.Read ) )
            {
                encoder.Save( fs );
            }
 
            return bitmap;
        }
    }
1
Casper-SC
Эксперт .NET
4092 / 1942 / 381
Регистрация: 27.03.2010
Сообщений: 5,345
Записей в блоге: 1
04.05.2014, 15:53  [ТС] 7
Кстати, именно правильно полностью заработало только так:
C#
1
var rect = new Rect(margin.Left, margin.Top, size.Width, size.Height);
Что к чему???

Добавлено через 55 секунд
Цитата Сообщение от Casper-SC Посмотреть сообщение
Что к чему???
А, после добавления своего прошлого сообщения увидел обновление Вашего сообщения
0
NickoTin
04.05.2014, 15:56     Снимок Visual объекта в PNG. Не правильно работает Margin
  #8

Не по теме:

Цитата Сообщение от Casper-SC Посмотреть сообщение
А, после добавления своего прошлого сообщения увидел обновление Вашего сообщения
А ведь стоило просто внимательно прочитать моё первое сообщение п. 2...

0
04.05.2014, 15:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2014, 15:56
Привет! Вот еще темы с ответами:

Margin не работает в IE
Сразу к делу: переношу верстку в CakePHP, все сработало, единственное что переносится не правильно...

Не работает margin
Всем привет, почему-то не могу убрать margin 8 (по умолчанию) на margin 0 для тега body. Гугл не...

Не работает Margin
Пишу в xml такой код: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;LinearLayout ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.