Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > PictureBox


Автор: PaZ1T1V 21.3.2008, 15:18
Народ, у меня снова проблемы:((( помогите решить
 smile 
знаю, 4то один топик - один вопрос, но ....

вопрос1 

можно ли симитировать рисование кистью, наприммер как в mspaint, fotoshop & etc ???

вопрос 2

как сохранить битмап ?? (знаю 4то ета тема уже поднималась )пишу так,


Код


SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            openFileDialog1.InitialDirectory = "C:\\Temp";
            saveFileDialog1.Filter = "bitmap file (*.bmp)|*.bmp";
            saveFileDialog1.FilterIndex = 1;
            saveFileDialog1.RestoreDirectory = true;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image=new Bitmap(pictureBox1.Width,pictureBox1.Height);
                System.Drawing.Graphics w = Graphics.FromImage(pictureBox1.Image);
                pictureBox1.Invalidate();
                pictureBox1.Image.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
            }



 но вместо того 4то нарисовал сохраняется "черный квадрат", в прямом смысле етого слова

вопрос 3

если вызываю колор диалог или перекрываю свою форму 4ем нибудь, то все то, 4то я нарисовал пропадает, как ето исправить

Народ хелпМеПлиз(!!!)

ЗЫ модераторы сильно меня не пенайте плиз, знаю 4то нарушаю уставы форума...

                           Заранее спасибо всем принявшим у4астие в разрешении моих проблем smile)  

Автор: vponomarov 21.3.2008, 19:01
ты все делаешь правильно, но есть один существенный вопрос: как же ты рисуешь? кода-то нигде нет smile 
если ты переодпределил метод Paint объекта pictureBox1, то в приведенном коде сохранения вместо pictureBox1.Invalidate(); нужно написать что-то типа pictureBox1_Paint(null, null); и все будет ок.

Автор: PaZ1T1V 21.3.2008, 19:10
Цитата(vponomarov @ 21.3.2008,  19:01)
ты все делаешь правильно, но есть один существенный вопрос: как же ты рисуешь? кода-то нигде нет smile 
если ты переодпределил метод Paint объекта pictureBox1, то в приведенном коде сохранения вместо pictureBox1.Invalidate(); нужно написать что-то типа pictureBox1_Paint(null, null); и все будет ок.

рисую ..... хм простецки 

 private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            Pen newPen = myPen;
            myGraphix = pictureBox1.CreateGraphics();
            
            if (buttonclicked == 1)
            {
                mouseX = e.X;
                mouseY = e.Y;
                penStyle();
                myGraphix.DrawLine(newPen, mouseX, mouseY, mouseX + 1, mouseY + 1);
            }
            if (buttonclicked == 3)
            {
                mouseX = e.X;
                mouseY = e.Y;
                penStyle();
                myGraphix.DrawLine(newPen, mouseX, mouseY, mouseX + 1, mouseY + 1);
                label2.Text = "X = " + mouseX.ToString();
                label3.Text = "Y = " + mouseY.ToString();
            }
        }

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            Pen newPen = myPen;
            myGraphix = pictureBox1.CreateGraphics();
            
            if (buttonclicked == 1)
            {
                if (e.Button == MouseButtons.Left)
                {
                penStyle();
                myGraphix.DrawLine(newPen, mouseX, mouseY, e.X, e.Y);
                mouseX = e.X;
                mouseY = e.Y;
                label2.Text = "X = " + mouseX.ToString();
                label3.Text = "Y = " + mouseY.ToString();
                }
                
            }
        }

Автор: vponomarov 21.3.2008, 19:21
нк раз так, то по-моему нужно сохранять картинку таким образом:
Код

SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            openFileDialog1.InitialDirectory = "C:\\Temp";
            saveFileDialog1.Filter = "bitmap file (*.bmp)|*.bmp";
            saveFileDialog1.FilterIndex = 1;
            saveFileDialog1.RestoreDirectory = true;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
            }

Автор: PaZ1T1V 21.3.2008, 19:31
хм, так вообще дебаг вызывается счо словами 

object reference not set to an instance of an object 

то есть , помоему не находит ссылку откуда сохранять :(((

Автор: vponomarov 21.3.2008, 19:57
в конструкторе формы проипиши: pictureBox1.Image=new Bitmap();
ну или что-то типа того smile 

Автор: PaZ1T1V 21.3.2008, 20:04
написал pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height); , но все то же самое (, то есть сохраяет не рисунок, 4то я нарисовал а опять все тот же 4ерный квадрат  

Автор: vponomarov 21.3.2008, 21:10
вот рабочий вариант:
Код

        public Form1()
        {
            InitializeComponent();

            mouseX = 0;
            mouseY = 0;

            pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics myGraphix = Graphics.FromImage(pictureBox1.Image);
            myGraphix.Clear(Color.White);
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            Pen newPen = Pens.Black;
            Graphics myGraphix = Graphics.FromImage(pictureBox1.Image);//pictureBox1.Image.CreateGraphics();
            Graphics myGraphix1 = pictureBox1.CreateGraphics();
            mouseX = e.X;
            mouseY = e.Y;
            myGraphix.DrawLine(newPen, e.X, e.Y, e.X + 1, e.Y + 1);
            myGraphix1.DrawLine(newPen, e.X, e.Y, e.X + 1, e.Y + 1);
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            Pen newPen = Pens.Black;
            Graphics myGraphix = Graphics.FromImage(pictureBox1.Image);
            Graphics myGraphix1 = pictureBox1.CreateGraphics();
            if (e.Button == MouseButtons.Left)
            {
                myGraphix.DrawLine(newPen, mouseX, mouseY, e.X, e.Y);
                myGraphix1.DrawLine(newPen, mouseX, mouseY, e.X, e.Y);
                mouseX = e.X;
                mouseY = e.Y;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.InitialDirectory = "C:\\Temp";
            saveFileDialog1.Filter = "bitmap file (*.bmp)|*.bmp";
            saveFileDialog1.FilterIndex = 1;
            saveFileDialog1.RestoreDirectory = true;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
            }
        } 

кривовато, но работает smile

Добавлено через 3 минуты и 51 секунду
о, а вот вариант по-лучше:
Код

public Form1()
        {
            InitializeComponent();

            mouseX = 0;
            mouseY = 0;

            pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics myGraphix = Graphics.FromImage(pictureBox1.Image);
            myGraphix.Clear(Color.White);
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            Pen newPen = Pens.Black;
            Graphics myGraphix = Graphics.FromImage(pictureBox1.Image);//pictureBox1.Image.CreateGraphics();
            mouseX = e.X;
            mouseY = e.Y;
            myGraphix.DrawLine(newPen, e.X, e.Y, e.X + 1, e.Y + 1);
            pictureBox1_Paint(null, null);
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            Pen newPen = Pens.Black;
            Graphics myGraphix = Graphics.FromImage(pictureBox1.Image);
            if (e.Button == MouseButtons.Left)
            {
                myGraphix.DrawLine(newPen, mouseX, mouseY, e.X, e.Y);
                mouseX = e.X;
                mouseY = e.Y;
                pictureBox1_Paint(null, null);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.InitialDirectory = "C:\\Temp";
            saveFileDialog1.Filter = "bitmap file (*.bmp)|*.bmp";
            saveFileDialog1.FilterIndex = 1;
            saveFileDialog1.RestoreDirectory = true;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
            }
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Graphics myGraphix = pictureBox1.CreateGraphics();
            myGraphix.DrawImage(pictureBox1.Image, 0, 0);
        }

Автор: PaZ1T1V 21.3.2008, 21:28
гы, не работает во ета стро4ка, 

Graphics myGraphics.FromImage(pictureBox1.Image);

дебажет со словами зна4ение не может быть равно нулю (Value cannot be null)

Автор: vponomarov 21.3.2008, 21:37
вот это написал?
Код

public Form1()
        {
            InitializeComponent();

            mouseX = 0;
            mouseY = 0;

            pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics myGraphix = Graphics.FromImage(pictureBox1.Image);
            myGraphix.Clear(Color.White);
        }


у меня все воркает...

Добавлено через 1 минуту и 44 секунды
ты же говорил, что предыдущий пример заработал, но опять выдавал черный квадрат!

Автор: PaZ1T1V 21.3.2008, 22:41
Ура, сейв заработал, но теперь стал дебажить Лоад 

помоги еще раз плиз

вот код 

Код


private void openDialog()
        {
            pictureBox1.Image = null;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.InitialDirectory = "C:\\Temp";
            openFileDialog1.Filter = "bitmap files (*.bmp)|*.bmp";
            openFileDialog1.FilterIndex = 1;
            openFileDialog1.RestoreDirectory = true;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {              
                Image myImage = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                Graphics myGraphics = Graphics.FromImage(myImage);
                Rectangle rect_dest = new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height);
                Rectangle rect_srch = new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height);
                myGraphics.DrawImage(myImage, rect_dest, rect_srch, GraphicsUnit.Pixel);
                this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                this.pictureBox1.Image = myImage;
                pictureBox1_Paint(null,null);
            }
        }



заранее благодарен

Автор: rubbiroid 21.3.2008, 23:33
эээ... а саму картинку кто грузить будет?
Код

Image myImage = new Bitmap(openFileDialog1.FileName);

Автор: Dennnis 24.3.2008, 15:47
Лучше всего в данном случае пользоваться двойной буферизацией:

Код



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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        private BufferedGraphicsContext context;
        private BufferedGraphics buffer;
        private Graphics graphics;


        public Form1()
        {
            InitializeComponent();

            context = BufferedGraphicsManager.Current;
            Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);
            buffer = context.Allocate(this.CreateGraphics(), rect);
            graphics = buffer.Graphics;
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            buffer.Render(e.Graphics);
        }

        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            //Рисуем в graphics что угодно
            graphics.DrawRectangle(Pens.Red, 10, 10, 100, 100);
            //Обязательно
            this.Refresh();
        }

    }
}



Автор: vponomarov 24.3.2008, 16:01
Dennnis, двойная буфферизация вещь без сомнения хорошая, но в данном случае от нее пользы никакой smile 

Автор: Dennnis 24.3.2008, 16:04
Да я просто не туда написал smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)