Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2016, 16:15   #1
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
Восклицание Сохранение рисунка

Добрый день!

Помогите, пожалуйста.
Пользователь нажатием на кнопки рисует на panel квадраты и закрашивает их в разных частях panel. Как можно сохранить полученное изображение? (На форме присутствует SaveFileDialog1)

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
           InitializeComponent();
        }
        Pen myPen = new Pen(Color.Green, 3);
                
        private void button1_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle( 1, 1, 50, 50));
            myGraphics.DrawRectangle(myPen, 1, 1, 50, 50);
        }
        private void button2_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(51, 1, 50, 50));
            myGraphics.DrawRectangle(myPen, 51, 1, 50, 50);
        }
        private void button3_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(101, 1, 50, 50));
            myGraphics.DrawRectangle(myPen, 101, 1, 50, 50);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(151, 1, 50, 50));
            myGraphics.DrawRectangle(myPen, 151, 1, 50, 50);
        }

        private void button5_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(1, 51, 50, 50));
            myGraphics.DrawRectangle(myPen, 1, 51, 50, 50);
        }

        private void button6_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(51, 51, 50, 50));
            myGraphics.DrawRectangle(myPen, 51, 51, 50, 50);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(101, 51, 50, 50));
            myGraphics.DrawRectangle(myPen, 101, 51, 50, 50);
        }

        private void button8_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(151, 51, 50, 50));
            myGraphics.DrawRectangle(myPen, 151, 51, 50, 50);
        }

        private void button9_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(1, 101, 50, 50));
            myGraphics.DrawRectangle(myPen, 1, 101, 50, 50);
        }

        private void button10_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(51, 101, 50, 50));
            myGraphics.DrawRectangle(myPen, 51, 101, 50, 50);
        }

        private void button11_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(101, 101, 50, 50));
            myGraphics.DrawRectangle(myPen, 101, 101, 50, 50);
        }

        private void button12_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(151, 101, 50, 50));
            myGraphics.DrawRectangle(myPen, 151, 101, 50, 50);
        }

        private void button13_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(1, 151, 50, 50));
            myGraphics.DrawRectangle(myPen, 1, 151, 50, 50);
        }

        private void button14_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(51, 151, 50, 50));
            myGraphics.DrawRectangle(myPen, 51, 151, 50, 50);
        }

        private void button15_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(101, 151, 50, 50));
            myGraphics.DrawRectangle(myPen, 101, 151, 50, 50);
        }

        private void button16_Click(object sender, EventArgs e)
        {
            Graphics myGraphics = panel1.CreateGraphics();
            myGraphics.FillRectangle(Brushes.YellowGreen, new Rectangle(151, 151, 50, 50));
            myGraphics.DrawRectangle(myPen, 151, 151, 50, 50);
        }

        private void Save_Click(object sender, EventArgs e)
        {
            
        }
    }
}
Изображения
Тип файла: png Безымянный.png (5.1 Кб, 218 просмотров)
Maray вне форума Ответить с цитированием
Старый 04.08.2016, 08:11   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Сохранить изображение можно создав битмап и скопировав на него рисунок, примерно так:
Код:
private void buttonSavePicture_Click(object sender, EventArgs e)
{
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        Bitmap bitmap = new Bitmap(panel1.Width, panel1.Height);
        panel1.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
        bitmap.Save(saveFileDialog1.FileName);
    }
}
Но скажу прямо, подход к написанию программы безграмотный. Во-первых, все эти обработчики можно заменить на один обработчик, а нужные позиции вычислять в завивимости от свойства Tag соответствующих кнопок, при этом можно вывести формулу с заданием размеров и позиций рисуемых прямоугольничков по неким константа, что позволит впоследствии лишь меняя пару этих константу регулировать всю прорисовку.
Во-вторых, если изачально стоит задача сохранять картинку в файл, то стоит рисовать не на панели явно, а рисовать на битмапе в памяти, а на панели отображать через её Graphics этот битмап в событии Paint самой панели.
phomm вне форума Ответить с цитированием
Старый 04.08.2016, 17:50   #3
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
Восклицание

Цитата:
Сообщение от phomm Посмотреть сообщение
Во-вторых, если изачально стоит задача сохранять картинку в файл, то стоит рисовать не на панели явно, а рисовать на битмапе в памяти, а на панели отображать через её Graphics этот битмап в событии Paint самой панели.
Поняла, спасибо! А как конкретно можно осуществить вот этот пункт?
Maray вне форума Ответить с цитированием
Старый 15.08.2016, 19:40   #4
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

Попробовала вот так
Код:
Bitmap b = new Bitmap(this.Size.Width, this.Size.Height);
            Graphics g = Graphics.FromImage(b);
            g.CopyFromScreen(this.Location, new Point(0, 0), this.Size);
            b.Save("C:\\a.bmp");
Но, к сожалению, изображение получается вот такое. А нужно вот так.
Координаты panel1 - (23,12)
Размер panel1 - (194;194)
Изображения
Тип файла: png Фигура 'O'.png (2.5 Кб, 304 просмотров)
Тип файла: png Безымянный.png (1.0 Кб, 304 просмотров)
Maray вне форума Ответить с цитированием
Старый 16.08.2016, 17:07   #5
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Сохранить изображение можно создав битмап и скопировав на него рисунок, примерно так:
Код:
private void buttonSavePicture_Click(object sender, EventArgs e)
{
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        Bitmap bitmap = new Bitmap(panel1.Width, panel1.Height);
        panel1.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
        bitmap.Save(saveFileDialog1.FileName);
    }
}
Но скажу прямо, подход к написанию программы безграмотный. Во-первых, все эти обработчики можно заменить на один обработчик, а нужные позиции вычислять в завивимости от свойства Tag соответствующих кнопок, при этом можно вывести формулу с заданием размеров и позиций рисуемых прямоугольничков по неким константа, что позволит впоследствии лишь меняя пару этих константу регулировать всю прорисовку.
Во-вторых, если изачально стоит задача сохранять картинку в файл, то стоит рисовать не на панели явно, а рисовать на битмапе в памяти, а на панели отображать через её Graphics этот битмап в событии Paint самой панели.
Вот, попробовала сделать. Изображение получается, но не совсем так как надо. В цикле if нужно, чтобы при true рисовался зеленый квадрат, а при false белый квадрат. А у меня в результате получается, если первая переменная была true, то сетка зеленых квадратов, если false, то сетка белых квадратов

Код:
        private void button17_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() != DialogResult.OK)
                return;
            Bitmap bm = new Bitmap(panel1.Width, panel1.Height);
            Pen p1 = new Pen(Color.Green, 1);
            Pen p2 = new Pen(Color.White, 1);
            for (var i = 0; i < buttons.Count; i++)
                if (rB[i].F == true)
                {
                    panel1.DrawToBitmap(bm, new Rectangle(CalculateXByIndex(i), CalculateYByIndex(i), CellSize, CellSize));
                }
                else
                {
                    panel1.DrawToBitmap(bm, new Rectangle(CalculateXByIndex(i), CalculateYByIndex(i), CellSize, CellSize));
                }
             bm.Save(saveFileDialog1.FileName);}
Изображения
Тип файла: png 5456.png (1.4 Кб, 253 просмотров)
Тип файла: png 545.png (1.4 Кб, 271 просмотров)
Maray вне форума Ответить с цитированием
Старый 16.08.2016, 17:11   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вам же дали готовый код, почему вы им не хотите воспользоваться?
вы цитируете одно, но делаете зачем-то все совсем иное.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сохранение рисунка paintbox и его редактирование elviss77 Мультимедиа в Delphi 5 25.06.2014 12:21
Сохранение нарисованного рисунка в графический файл Lawrence Общие вопросы .NET 5 09.09.2010 16:23
Загрузка рисунка Ilya9999 Microsoft Office Excel 9 27.05.2010 21:52
Смещение рисунка skrudjmagdak Общие вопросы Delphi 5 27.03.2010 15:23
Delphi: «Сохранение» рисунка Jean-Esther Помощь студентам 5 01.03.2009 17:21