Diskuze: C# Mazání obrázků

C# .NET .NET (C# a Visual Basic) C# Mazání obrázků American English version English version

Avatar
Lukáš Křehula
Redaktor
Avatar
Lukáš Křehula:

Zdarec, mám takovej problém s mazáním obrázků. Mám to udělané tak, že k nějaké určíté položce lze přidat 1 obrázek, který se vykreslí do panelu. Mám ale problém v tom, že když ten obrázek chci smazat a vytvořit novej, píše mi to chybu že obrázek je již používán. Jak ho lze "odpoužívat" když to řeknu takhle? :D
Díky

 
Odpovědět 30.6.2014 20:40
Avatar
Lukáš Křehula
Redaktor
Avatar
Lukáš Křehula:

Používám Image proměnnou, aby se při každém změnění nějaké položky změnil i obrázek. Ale hlavní je asi akce při zmáčknutí buttonu na přidání/editaci obrázku

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "Image Files(*.BMP;*.JPG;*.GIF;*.PNG)|*.BMP;*.JPG;*.GIF;*.PNG";
    if(ofd.ShowDialog() == DialogResult.OK)
    {
        image = null;
        panel2.Invalidate();
        if (File.Exists(Vinohrad.ImageDirectory + "\\" + name + ".jpeg"))
            File.Delete(Vinohrad.ImageDirectory + "\\" + name + ".jpeg");
        Image img = Image.FromFile(ofd.FileName);
        img = ScaleImage(img, panel2.Width, panel2.Height);
        image = img;
        image.Save(Vinohrad.ImageDirectory + "\\" + name + ".jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
        panel2.Invalidate();
    }
}

Fce ScaleImage

public static Image ScaleImage(Image image, int maxWidth, int maxHeight)
{
    var ratioX = (double)maxWidth / image.Width;
    var ratioY = (double)maxHeight / image.Height;
    var ratio = Math.Min(ratioX, ratioY);

    var newWidth = (int)(image.Width * ratio);
    var newHeight = (int)(image.Height * ratio);

    var newImage = new Bitmap(newWidth, newHeight);
    Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
    return newImage;
}

Vykreslování

            private void panel2_Paint(object sender, PaintEventArgs e)
{
    try
    {
        e.Graphics.Clear(Color.White);
        e.Graphics.DrawImage(image, 0, 0);
    }
    catch
    { }
}
Editováno 30.6.2014 20:55
 
Nahoru Odpovědět 30.6.2014 20:54
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Lukáš Křehula
Jan Vargovský:

Stačí uvolnit ten img. Všechno co implementuje IDisposable by mělo být v using bloku.

using(Image img = Image.FromFile(ofd.FileName))
{
   ...
}
 
Nahoru Odpovědět 30.6.2014 20:57
Avatar
Lukáš Křehula
Redaktor
Avatar
Lukáš Křehula:

Děkuji ti mnohokrát :)))

 
Nahoru Odpovědět 30.6.2014 21:05
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.