Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/40: Рейтинг темы: голосов - 40, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 15

Сохранение содержимого Canvas в PNG

28.10.2015, 23:28. Показов 8056. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!Пишу редактор графов,хочу добавить возможность сохранения созданного графа в качестве картинки. Граф находится в Canvas..Перечитала информацию в интернете,как сохранить содержимое Canvas в формате PNG,написала вот такой код, но при попытке сохранить,вылетает ошибка

Необработанное исключение типа "System.ArgumentOutOfRangeException" в PresentationCore.dll
Дополнительные сведения: Значение параметра должно быть больше 0.

Подскажите,пожалуйста,что я делаю не так.

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
 private void btnSaveAs_Click(object sender, RoutedEventArgs e)
        {
            Microsoft.Win32.SaveFileDialog saveimg = new Microsoft.Win32.SaveFileDialog();
            Canvas can = new Canvas();
            saveimg.DefaultExt = ".PNG";
            saveimg.Filter = "Image (.PNG)|*.PNG";
            if (saveimg.ShowDialog() == true)
            {
                ToImageSource(can, saveimg.FileName);
            }
        }
 
        public static void ToImageSource(Canvas canvas, string filename)
        {
            RenderTargetBitmap bmp = new RenderTargetBitmap(
            (int)canvas.Width, (int)canvas.Height, 96d, 96d, PixelFormats.Pbgra32);
            canvas.Measure(new Size((int)canvas.Width, (int)canvas.Height));
            canvas.Arrange(new Rect(new Size((int)canvas.Width, (int)canvas.Height)));
            bmp.Render(canvas);
            PngBitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bmp));
            using (FileStream file = File.Create(filename))
            {
                encoder.Save(file);
            }
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2015, 23:28
Ответы с готовыми решениями:

Сохранение canvas в png
Есть div, из содержимого этого div формируется canvas,потом я пытаюсь сохранить это в png $("#s_img1").click(function (){ ...

*.png canvas alpha blend
Доброго времени суток! Я хотел бы вывести на canvas png изображение, сохранив при этом alpha blending и transparenтность. Стоит...

Как сохранить содержимое CANVAS в .PNG
Добрый день! Нужно сохранить содержимое CANVAS в .PNG (на компьютер пользователя). Пробовал функцию canvas2image, но в ней очень большой...

5
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
31.10.2015, 12:13
Alexa8, укажи, где именно возникает ошибка. И даже если ошибки не будет, то сохранённое изображение будет пустым, потому что ты сохраняешь вновь созданный в 4 строке canvas, на котором ничего нет.
0
0 / 0 / 0
Регистрация: 21.10.2015
Сообщений: 15
31.10.2015, 14:13  [ТС]
ViterAlex, ошибка
"Необработанное исключение типа "System.ArgumentOutOfRangeException" в PresentationCore.dll
Дополнительные сведения: Значение параметра должно быть больше 0."

возникает в строке. В таком случае, как правильнее сделать это сохранение?

C#
1
2
RenderTargetBitmap bmp = new RenderTargetBitmap(
            (int)canvas.Width, (int)canvas.Height, 96d, 96d, PixelFormats.Pbgra32);
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
01.11.2015, 00:23
Ага. Ну поскольку ты создал новый canvas и не задал его размер, то его размеры равны нулю
0
2 / 2 / 0
Регистрация: 15.06.2018
Сообщений: 2
16.06.2019, 01:23
Заманался по форумам лазить искать код, спасибо автору.


Выкладываю готовый вариант. Отличие в том что в канвасе нужно использовать ActualWidth и ActualHeight.


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
private void Menu_Click_SaveImage(object sender, RoutedEventArgs e)
        {
            Microsoft.Win32.SaveFileDialog saveimg = new Microsoft.Win32.SaveFileDialog();
            //Canvas can = new Canvas();  // канвас уже есть
            saveimg.DefaultExt = ".PNG";
            saveimg.Filter = "Image (.PNG)|*.PNG";
            if (saveimg.ShowDialog() == true)
            {
                ToImageSource(DragArena, saveimg.FileName);  //DragArena  - имя имеющегося канваса
            }
        }
 
        public static void ToImageSource(Canvas canvas, string filename)
        {
            RenderTargetBitmap bmp = new RenderTargetBitmap( (int)canvas.ActualWidth, (int)canvas.ActualHeight, 96d, 96d, PixelFormats.Pbgra32);
            canvas.Measure(new Size((int)canvas.ActualWidth, (int)canvas.ActualHeight));
            canvas.Arrange(new Rect(new Size((int)canvas.ActualWidth, (int)canvas.ActualHeight)));
            bmp.Render(canvas);
            PngBitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bmp));
            using (FileStream file = File.Create(filename))
            {
                encoder.Save(file);
            }
        }
1
2 / 2 / 0
Регистрация: 15.06.2018
Сообщений: 2
16.06.2019, 11:50
Это еще не все, качество фигня у изображения. Сохраним в 300dpi


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
 public static void ToImageSource2(Canvas canvas, string filename)
        {
 
            canvas.LayoutTransform = null;  //обнуляем маштабировние если было
 
 
            //качество изображения
            double dpi = 300;
            double scale = dpi / 96;
 
            Size size = canvas.RenderSize;
            RenderTargetBitmap image = new RenderTargetBitmap((int)(size.Width* scale), (int)(size.Height* scale), dpi, dpi, PixelFormats.Pbgra32);
            canvas.Measure(size);
            canvas.Arrange(new Rect(size)); // This is important      
 
 
 
 
            image.Render(canvas);
            PngBitmapEncoder encoder = new PngBitmapEncoder();  //конвертируем в png формат
            encoder.Frames.Add(BitmapFrame.Create(image));
            using (FileStream file = File.Create(filename))
            {
                encoder.Save(file);
            }
        }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.06.2019, 11:50
Помогаю со студенческими работами здесь

Использование PNG, подключить, загрузить, отрисовать на Canvas
Нужен добрый совет. Раньше на форуме натыкался на код, в котором загружалась и использовалась PNG картинка. Помню что пробовал у себя...

Отправка содержимого CANVAS на E-Mail
Добрый вечер! Срочно нужно решить проблему: есть рисовалка на CANVAS и кнопка отправки. Нужно изображение из CANVAS отправить на...

Отправка содержимого <canvas> на сервер
Как отправить содержимое &lt;canvas&gt; (HTML 5) на сервер?

Преобразование содержимого Canvas в Image
Доброго времени суток! Я занимаюсь разработкой программы, отображающей различные графики, на языке C# с помощью WPF. Столкнулся с...

Сохранение в png
&lt;?php $im = imagecreatefrompng('text1.png'); $black = imagecolorallocate($im, 0x00, 0x00, 0x00); // Путь к ttf файлу шрифта ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru