Jak zakreslit ramecek okolo obrazku v PictureBox

Samozrejme i zde se mi prokazalo ze mene je nekdy vice a ze na to co potrebuji staci jen nekolik malo prikazu. Konkretne je treba dodrzet tyto zasady:

  1. Malovat zasadne v udalosti Paint prvku PictureBox, protoze pouze tam mate graficky kontext, ktery funguje
  2. Neukladat vytvoreny obrazek do PB, staci vytvorit Graficky kontext (objekt typu Graphics) z obrazku v PB a o zbytek se postaraji reference uvnitr objektu. Navic ja zde pouzivam 2 PB a z nejakeho duvodu kdyz jsem toto udelal tak se mi odmital nacist jiny obrazek do PB1(PB2 byl ten, ktery jsem obkresloval).
  3. Zmensit obrazek do PB na velikost PB – jinak vam obkresli cely obrazek kdyz napriklad pouzivate v PB SizeMode Zoom a obrazek se prispusobuje velikosti PB a uvidite jen levy a horni okraj. Stejne tak kdyby byl obrazek mensi nez PB, nemeli byste obkresleny cely PB.

No a ted na samotny kod. Cele to spociva v techto par radcich:

void pictureBox2_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    VymalujOkraj(g);
    }
    private void VymalujOkraj(Graphics g)
    {
    if (pictureBox2.Image != null)
    {
        Pen p = new Pen(Color.Blue);
        p.Width = 5;
        //-Tyto hodnoty jsou implicitni, neni potreba nastavovat
        //p.PenType = PenType.SolidColor;
        //p.Alignment = PenAlignment.Inset;
        //p.Brush = Brushes.Blue;
        Image img = null;
        img = pictureBox2.Image;
        g.DrawImage(img, new Point(0, 0));
        g.DrawRectangle(p, new Rectangle(0, 0, pictureBox2.Image.Width, pictureBox2.Image.Height));
        Bitmap bmpOutput = new Bitmap(pictureBox2.Image.Width, pictureBox2.Image.Height, g);
        //-Zlikvidujeme nepotrebne objekty a uvolnime tak prostredky
        p.Dispose();
        //-Toto se nelikviduje, protoze pak program zahlasi vyjimku "ArgumentException"
        //g.Dispose();
        //-Toto nikdy nedelej, nebot pak nefunguje zase neco jineho - v mem pripade PB1
        //pictureBox2.Image = bmpOutput;
    }
}

A vysledek pak vypada takto:

Vykresleny ramecek okolo obrazku

Leave a Reply