Samozřejmě i zde se mi prokázalo že méně je někdy více a že na to co potřebuji stačí jen několik málo příkazů. Konkrétně je třeba dodržet tyto zásady:
- Malovat zásadně v události
PaintprvkuPictureBox, protože pouze tam máte grafický kontext, který funguje - Neukládat vytvořený obrázek do PB, stačí vytvořit Grafický kontext (objekt typu
Graphics) z obrázku v PB a o zbytek se postarají reference uvnitř objektu. Navíc já zde používám 2 PB a z nějakého důvodu když jsem toto udělal tak se mi odmítal načíst jiný obrázek do PB1 (PB2 byl ten, který jsem obkresloval). - Zmenšit obrázek do PB na velikost PB – jinak vám obkreslí celý obrázek když například používáte v PB
SizeModeZooma obrázek se přizpůsobuje velikosti PB a uvidíte jen levý a horní okraj. Stejně tak kdyby byl obrázek menší než PB, neměli byste obkreslený celý PB.
No a teď na samotný kód. Celé to spočívá v těchto pár řádcích:
C#
void pictureBox2_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
DrawBorder(g);
}
private void DrawBorder(Graphics g)
{
if (pictureBox2.Image != null)
{
Pen p = new Pen(Color.Blue);
p.Width = 5;
//-Tyto hodnoty jsou implicitni, neni potreba nastavovat
Image image = null;
image = pictureBox2.Image;
g.DrawImage(image, new Point(0, 0));
g.DrawRectangle(p, new Rectangle(0, 0, pictureBox2.Image.Width, pictureBox2.Image.Height));
Bitmap outputBitmap = 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"
//-Toto nikdy nedelej, nebot pak nefunguje zase neco jineho - v mem pripade PB1
}
}