» »

[c#] picturebox, slika na sliko

[c#] picturebox, slika na sliko

japol ::

V pictureBox2 vstavim sliko iz enega drugega picturebox-a pictureBox1. Sedaj pa rišem na pictureBox2 in želim shraniti to sliko (osnovno vstavljeno sliko in moje risanje na njej). Kako to storim?

Trenutno imam to tako narejeno da mi v bistvu printscreen naredi slike (ko neham risati) in ob koncu risanja vstavi zajeto sliko v pictureBox2.

var bitmap = new Bitmap(pictureBox2.Width, pictureBox2.Height);
            var graphics = Graphics.FromImage(bitmap);
            int x1 = this.Location.X + tabControl1.Location.X + pictureBox2.Location.X;
            int y1 = this.Location.Y + tabControl1.Location.Y + pictureBox2.Location.Y;
            int razlikaX = 8;
            int razlikaY = 45;
            graphics.CopyFromScreen(x1 + razlikaX, y1 + razlikaY, 0, 0, bitmap.Size);
            pictureBox2.Image = bitmap;
            graphics.Dispose();

Ta mi vstavi zajeto sliko in na določeno mesto nazaj v picturebox, razlikaX in razlikaY sta korekciji, da mi sliko res vstavi na isto pozicijo.

Ampak to se mi ne zdi prava rešitev. Potrebujem nekaj drugega.

amacar ::

Bitmap iz pictureboxa1 prekopiraš v začasnega, pa v začasnega dorišeš kaj ti je volja in ga loudaš v picturebox2.

Na hitrco nekaj takšnega (na formi sta dva enaka pictureboxa in en gumb s katerim prekopiraš bitmap v picturebox2):
public partial class Form1 : Form
    {
        Bitmap bmp;
        Graphics gr;
        int x;
        int y;
        public Form1()
        {
            InitializeComponent();
            bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = bmp;
            pictureBox2.Image = bmp;
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            x = e.X;
            y = e.Y;
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            bmp = new Bitmap(pictureBox1.Image);
            gr = Graphics.FromImage(bmp);
            gr.DrawLine(new Pen(new SolidBrush(Color.Black)),x,y,e.X,e.Y);
            pictureBox1.Image = bmp;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            pictureBox2.Image = pictureBox1.Image;
        }

        private void pictureBox2_MouseDown(object sender, MouseEventArgs e)
        {
            x = e.X;
            y = e.Y;
        }

        private void pictureBox2_MouseUp(object sender, MouseEventArgs e)
        {
            bmp = new Bitmap(pictureBox2.Image);
            gr = Graphics.FromImage(bmp);
            gr.DrawLine(new Pen(new SolidBrush(Color.Black)), x, y, e.X, e.Y);
            pictureBox2.Image = bmp;
        }
    }


Sicer pa povej bolj natančno kaj hočeš narediti (kao layer varjanto, kaj drugega...)

Zgodovina sprememb…

  • spremenil: amacar ()

japol ::

Hvala, vendar to že imam. Potrebujem naslednje: glede na tvojo kodo, vstavi sliko iz pictreBox1 in pictureBox2 v Bitmap (oz. v pictureBox3). Se pravi združi obe sliki skupaj in ju prikaži kot eno sliko.

darkolord ::

Združi na kakšen način?

amacar ::

Ob kliku na gumb združi sliko iz picBox1 in picBox2 pa jih naloži v picBox 3, če si seveda to mislil...
Ker v prvem komentarju maš sam dva picBoxa omenjena, potem pa že tretjega.

private void button2_Click(object sender, EventArgs e)
        {
            bmp = new Bitmap(pictureBox1.Image);
            gr = Graphics.FromImage(bmp);
            Bitmap zacasni = new Bitmap(pictureBox2.Image);
            zacasni.MakeTransparent();
            gr.DrawImage(zacasni, 0, 0, pictureBox3.Width, pictureBox3.Height);
            pictureBox3.Image = bmp;
        }

Zgodovina sprememb…

  • spremenil: amacar ()

japol ::

darklord:
1. v picturebox vstavim neko sliko
2. z mousedown,... ukazi na tej sliki rišem črte,...
3. želim imeti novo sliko (ki je sestavljena iz vstavljene slike in črtami,... skupaj)

amacar: Uporabil sem tri pictureboxe zaradi lažje razlage problema. Ta koda mi prikaže osnovno sliko brez mojega risanja, tako da ne bo v redu. Zaradi transparentnosti mi jo pa še popači.

darkolord ::

Imaš nastavljeno barvo za transparenco?

japol ::

Uporabil sem od amacar-ja: zacasni.MakeTransparent();

amacar ::

Na projekt, da vidiš kak zgleda: http://www26.zippyshare.com/v/70235918/...

Sicer pa ne vem kje bi ti sploh imel problem. Sliko naložiš v picturebox1. Potem pa rišeš direkt na bitmap, ki ga pobereš iz pictureboxa1 in ta bitmap loudaš nazaj v picturebox1. Nato ta bitmap shraniš (če ga rabiš kot .jpg recimo) in je.

Zgodovina sprememb…

  • spremenil: amacar ()

japol ::

v Class1 imam:
public void risanje1_MiškaGor(Object sender, MouseEventArgs e)
        {
            if (RisanjeČrte == true)
            {
                 g = f1.pictureBox4.CreateGraphics();
                Pen p = new Pen(Color.Red, 2);
                ControlPaint.DrawReversibleLine(f1.pictureBox4.PointToScreen(začetnaTočka), f1.pictureBox4.PointToScreen(končnaTočka), Color.Black);
                g.DrawLine(p, začetnaTočka, končnaTočka);
                g.Dispose();
            }


V Form1 imam:
        
private void button10_Click(object sender, EventArgs e)
        {
            // prenese sliko:
            pictureBox4.Image = slika2;
        }


in to grafiko "g" mi mora združiti z vstavljeno sliko (se pravi v pictureBox4 sem vstavil sliko in na pictureBox4 tudi rišem). Kako sedaj dobim skupno sliko v na primer pictureBox1? Do sedaj sem to delal s printscreenom.

amacar ::

V tem if stavku nariši direkt na bitmap iz pictureboxa.

v if stavku
Bitmap bmp = new Bitmap(pictureBox4.Image); //vzameš bitmap iz picBox4
Graphics gr = Graphics.FromImage(bmp); //ustvariš Graphics za njega
gr.DrawLine(new Pen(new SolidBrush(Color.Black)),x,y,e.X,e.Y); //narišeš direkt na bitmap
pictureBox4.Image=bmp; //posodobiš picBox4

v onButton
pictureBox1.Image = pictureBox4.Image; //loudaš sliko, iz picBox4 v picBox1

japol ::

amacar: Hvala. Sem popravil, deluje odlično! Iz bitmap v graphics - se vedno tako dela?
if (RisanjeČrte == true)
{
risanje = new Bitmap(f1.pictureBox4.Image);
g = Graphics.FromImage(risanje);
Pen p = new Pen(Color.Red, 2);
g.DrawLine(p, začetnaTočka, končnaTočka);
f1.pictureBox4.Image = risanje;
}
kaj pa v primeru da ne vstavim slike, da samo rišem ( javi error da je risanje = null)?

Zgodovina sprememb…

  • spremenil: japol ()

amacar ::

Če se vedno tak dela ne vem, meni je na tak način najlažje, mogoč pa obstaja tud kak bolj učinkovit način.

Null vrne, ker je pictureBox4.image neinicializiran, če vanj ne prekopiraš nobenga bitmapa.
Pri zagonu programa ustvari en prazen bitmap in ga dodaj pictureBoxu4:
Bitmap bmp = new Bitmap(pictureBox4.Width, pictureBox4.Height);
pictureBox4.Image = bmp;

japol ::

Super, hvala.

Še nekaj: imam ukaz radirka, koda je:
v mouseMove:
if (BrisalecSlike == true)
            {
                if (e.Button == MouseButtons.Left)
                {
                    Bitmap bmp = new Bitmap(f1.pictureBox4.Width, f1.pictureBox4.Height);
                    f1.pictureBox4.Image = bmp;
                    risanje = new Bitmap(f1.pictureBox4.Image); 
                    g = Graphics.FromImage(risanje); 
                    int velikostRadirke = System.Int32.Parse(f1.textBox27.Text);
                    g.FillRectangle(new SolidBrush(Color.White), e.X, e.Y, velikostRadirke, velikostRadirke);
                    Rectangle oblikaRadirke = new Rectangle(e.X, e.Y, velikostRadirke, velikostRadirke);
                    f1.pictureBox4.Image = risanje;
                }
            }

želel bi imeti da med premikanjem radirke prikaže kvadratek, ker s to kodo se ne vidi koliko je velikost kvadratka. primer je radirka v Slikarju, ko izbereš ukaz, se prikaže kvadratek s črno obrobo. To želim imeti.

amacar ::

Tisti Rectangle nariši v paint metodi, zraven ko se mousemove izvaja

To sm na hitro zmetal skup, si lahk pogledaš: http://www4.zippyshare.com/v/31609910/f...

Koda pa recimo takle. (tule je še, da ti črto sproti izrisuje)
Na formi je picturebox, checkBox in nastavljanje velikosti radirke.

public partial class Form1 : Form
    {
        Bitmap bmp;
        Graphics gr;
        int x;
        int y;
        int x1;
        int y1;
        int velikost = 10;
        bool vmesnoRisanje = false;
        public Form1()
        {
            InitializeComponent();
            bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = bmp;
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            x = e.X;
            y = e.Y;
            vmesnoRisanje = true;
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            bmp = new Bitmap(pictureBox1.Image);
            gr = Graphics.FromImage(bmp);
            if (!checkBox1.Checked)
            {
                
                gr.DrawLine(new Pen(new SolidBrush(Color.Black)), x, y, e.X, e.Y);
                vmesnoRisanje = false;
            }
            else
                gr.FillRectangle(new SolidBrush(Color.White), x1 - velikost / 2, y1 - velikost / 2, velikost, velikost);
            pictureBox1.Image = bmp;
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            x1 = e.X;
            y1 = e.Y;
            pictureBox1.Invalidate();
            if (e.Button == MouseButtons.Left && checkBox1.Checked)
            {
                bmp = new Bitmap(pictureBox1.Image);
                gr = Graphics.FromImage(bmp);
                gr.FillRectangle(new SolidBrush(Color.White), x1 - velikost / 2, y1 - velikost / 2, velikost, velikost);
                pictureBox1.Image = bmp;
            }
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (vmesnoRisanje)
            {
                if (checkBox1.Checked)
                    e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Red)), x1 - velikost / 2, y1 - velikost / 2, velikost, velikost);
                else
                    e.Graphics.DrawLine(new Pen(new SolidBrush(Color.Red)), x, y, x1, y1);
            }
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
                vmesnoRisanje = true;
            else
                vmesnoRisanje=false;
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            velikost = (int)numericUpDown1.Value;
        }
    }

japol ::

Se opravičujem ker kasno odgovarjam. Hvala. Sem uredil.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c#] ukaz radirka

Oddelek: Programiranje
91039 (832) japol
»

[c#] Risanje z miško

Oddelek: Programiranje
221351 (1032) japol
»

[c#] Slika iz URL

Oddelek: Programiranje
162420 (2007) MrBrdo
»

C# metoda

Oddelek: Programiranje
61783 (1654) davaman
»

video v c#

Oddelek: Programiranje
241475 (1015) boss-tech

Več podobnih tem