Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение нарисованного рисунка 
:(
    Опции темы
Xonxt
Дата 17.3.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: 1
Всего: 1



Знаю, такие темы уже были. Я их смотрел, но они мне или не подошли, или не работают. Так что спрошу еще раз.

Итак. У меня есть, к примеру, объект Panel. На этой панели я с помощью мыши что-нибудь рисую. Теперь я хочу сохранить нарисованное в файл. Как это сделать?

Мне удалось сделать нечто подобное на основе pictureBox. Я сделал CreateGraphics() на pictureBox'e, а затем нарисованное перекидывал на Bitmap, а затем присваивал picture.Box.Image = Bitmap,или что-то в этом роде. Я и сам не понял  smile . Вроде бы работало, но на "холсте" оставалось только то, что я нарисован в последний момент, т.е. от всего нарисованного рисунка оставался либо один пиксель, либо небольшой штрих (если я в этот момент ОЧЕНЬ быстро двигал мышью  smile ).


В общем, помогите советом, либо, как сделать подобное на основе Panel, либо PictureBox.
PM MAIL ICQ Skype   Вверх
mr.DUDA
Дата 17.3.2007, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Обрабатывай событие Paint, в нём создавай новый Bitmap и новый Graphics из этого битмапа, рисуй всё в этот графикс, в конце обработчика диспозь графикс и сохраняй битмап в файл. Затем смело выводи битмап в графикс из PaintEventArgs.Graphics методом DrawImage smile


--------------------
user posted image
PM MAIL WWW   Вверх
Xonxt
Дата 18.3.2007, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: 1
Всего: 1



Ммм... примерно понятно... спасибо.
Но, всё-таки, не помешал бы простенький пример в виде листинга. smile
PM MAIL ICQ Skype   Вверх
Idsa
Дата 18.3.2007, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Вот попытка материализовать мысли mr.DUDA smile :
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;

namespace TestWinApp
{
  public partial class Form1 : Form
  {
    int xDown, yDown;
    Bitmap picture;

    public Form1()
    {
      InitializeComponent();
      picture = new Bitmap(drawPanel.Width, drawPanel.Height);
    }

    private void DrawPanel_MouseDown(object sender, MouseEventArgs e)
    {
      xDown = e.X;
      yDown = e.Y;
    }

    private void DrawPanel_MouseUp(object sender, MouseEventArgs e)
    {
      Graphics g = Graphics.FromImage(picture);
      g.DrawLine(Pens.Aqua, new Point(xDown, yDown), new Point(e.X, e.Y));
      g.Dispose();
      drawPanel.Invalidate();
    }

    private void drawPanel_Paint(object sender, PaintEventArgs e)
    {
      e.Graphics.DrawImage(picture, new Point(0, 0));
    }

    private void button1_Click(object sender, EventArgs e)
    {
      picture.Save("fileName.bmp");
    }
  }
}

На форме: панель drawPanel и кнопка button1.

В программе реализован простенький (очень простенький smile ) графический редактор: зажимаешь левую кнопку мыши, тянешь мышь, отпускаешь кнопку - вуаля, появилась линия. Ну а чтобы сохранить все это "творчество", нажимаем кнопочку и ищем в рабочей директории файл filename.bmp.

P. S. Проект в аттаче.

Это сообщение отредактировал(а) Idsa - 18.3.2007, 01:56

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  TestWinApp.rar 31,12 Kb


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Xonxt
Дата 18.3.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: 1
Всего: 1



Спасибо.
Вот что получилось у меня:

Код

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Resources;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace graph02
{
    public class Form1 : System.Windows.Forms.Form
    {
        private System.ComponentModel.Container components = null;
        private Bitmap pic;
        private Point lastpos;
        private System.Windows.Forms.Panel panel1;
        private Pen mypen;

        public Form1()
        {
            InitializeComponent();
            pic = new Bitmap(panel1.Width, panel1.Height);
        }

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        static void Main() 
        {
            Application.Run(new Form1());
        }

        private void Form1_Load(object sender, System.EventArgs e)
        {
            this.mypen = new Pen(Color.Black, 5);
            this.mypen.EndCap = LineCap.Round;
            this.mypen.StartCap = LineCap.Round;
        }

        private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
             e.Graphics.DrawImage(pic, new Point(0, 0));
        }

        private void panel1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            pic.Save("img.bmp");
        }

        private void panel1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            Graphics G = Graphics.FromImage(pic);
                        
            if(e.Button == MouseButtons.Left)
            {                
                G.DrawLine(Pens.Black, lastpos.X, lastpos.Y, e.X, e.Y);    
                lastpos = new Point(e.X, e.Y);
                G.Dispose();
                panel1.Invalidate();
            }            
        }

        private void panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            lastpos.X = e.X;
            lastpos.Y = e.Y;
        }
    }
}

Единственная проблема: при самом рисовании из-за Invalidate() изображение дрожит. Сам посмотри. Куда посоветуешь переместить Invalidate()? А то если я помещу его в MouseUp, то нарисованную линию видно только когда отпустишь мышь, а это не есть хорошо!

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  graph02.rar 35,37 Kb
PM MAIL ICQ Skype   Вверх
Idsa
Дата 18.3.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



"Дрожание" изображения - извечная проблема. Попробуй поставить свойство DoubleBuffered для формы в true. Если поможет, - хорошо, если же нет... нужно думать над оптимизацией.

Кстати, насчет оптимизации... по-моему не стоит сохранять изображение в MouseUp: накладненько однако smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Xonxt
Дата 18.3.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: 1
Всего: 1



Гм.. у формы нет такого параметра DoubleBuffered.. Можно поподробнее?

Это сообщение отредактировал(а) Xonxt - 18.3.2007, 15:31
PM MAIL ICQ Skype   Вверх
Idsa
Дата 18.3.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Есть! Посмотри в дизайнере в окне свойств, или напиши в конструкторе формы this.DoubleBuffered, или в MSDN глянь. 


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
agl
Дата 18.3.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 25.6.2006

Репутация: нет
Всего: 3



У тебя наверно vs 2005, в 2003 ничего подобного вроде нету. 
PM   Вверх
Idsa
Дата 18.3.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(agl @  18.3.2007,  17:17 Найти цитируемый пост)
У тебя наверно vs 2005, в 2003 ничего подобного вроде нету. 

Я не пойму, почему некоторые не переходят на 2005-ю студию?! Все никак денег (80 рублей smile) не накопите?!

А вообще, конечно, странно: я DoubleBuffered юзал еще в Delphi 7.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
agl
Дата 18.3.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 25.6.2006

Репутация: нет
Всего: 3



Дык, у кого привычка, у кого в заведениях стоят ещё старые студии. А при чем тут 80 рублей? Это цена пиратского диска smile, так я вообще не с России, ваши цены для меня не актуальны  smile . Интересно, а разница между ними очень большая? Тяжёлый переход то?
PM   Вверх
Idsa
Дата 18.3.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(agl @  18.3.2007,  18:20 Найти цитируемый пост)
Это цена пиратского диска

Тссс... smile

Цитата(agl @  18.3.2007,  18:20 Найти цитируемый пост)
Интересно, а разница между ними очень большая? Тяжёлый переход то?

Переход на 2005 студию может подразумевать переход на фреймворк 2.0 или 3.0. Об особенностях как второго, так и третьего фреймворка написано немало статей. От себя могу сказать, что усовершенствования 2.0 принципиальны, а вот переход на 3.0 ИМХО можно отложить до 3.5 (и студии 2007).

P. S. До меня только что дошло, что мы оффтопим smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Xonxt
Дата 18.3.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: 1
Всего: 1



Закончу оффотп тем, что в Университете мы работаем с 2003, поэтому, дома я работаю, соответственно, тоже с 2003.
А в 2003 такого свойства как DoubleBuffered нету, а оно там реализуется как-то по-другому. Надо книжку почитать )
PM MAIL ICQ Skype   Вверх
Idsa
Дата 19.3.2007, 03:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(agl @  18.3.2007,  17:17 Найти цитируемый пост)
У тебя наверно vs 2005, в 2003 ничего подобного вроде нету. 

Точно. Сейчас глянул в MSDN: действительно, DoubleBuffered появился только во втором фреймворке.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mr.DUDA
Дата 19.3.2007, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



В 2003 у формы есть SetStyle(ControlStyles.DoubleBuffered), если я правильно помню.


--------------------
user posted image
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.