C#: afișarea imaginilor și eliberarea resurselor
Încarcă o imagine într-un PictureBox C# fără să păstrezi fișierul blocat. Controlează înlocuirea imaginii, proporțiile și eliberarea resurselor grafice.
În acest material
Imaginile ocupă resurse care trebuie eliberate, iar Image.FromFile poate menține fișierul deschis cât timp obiectul trăiește. Pentru o galerie locală, citim imaginea sursă, construim o copie Bitmap și eliberăm sursa. PictureBox deține apoi copia afișată, pe care o eliminăm când o înlocuim sau închidem formularul.
Cum lucrezi cu exemplul
Exemplul complet se compilează ca Windows Forms App pe .NET Framework 4.8, cu C# 7.3. Deschide Lesson.csproj din arhivă în Visual Studio pe Windows. Rulează scenariile descrise mai jos; verificarea compilării nu înlocuiește testarea ferestrei și a dispozitivelor folosite.
Descarcă sursele și instrucțiunile.
Ideea și pașii de implementare
SizeMode.Zoom păstrează proporțiile și încadrează imaginea în control. StretchImage poate deforma fotografia și nu este potrivit când proporțiile contează. Mai întâi construim noul bitmap; abia după succes înlocuim imaginea veche. Astfel o selecție invalidă nu golește inutil interfața.
Filtrul acceptă PNG și JPEG. Limita de dimensiune a fișierului reduce încărcările accidentale, dar nu este o protecție completă pentru imagini ostile cu dimensiuni decodate enorme. Exemplul folosește resurse locale de încredere, pregătite pentru proiect, și verifică suplimentar dimensiunile înainte de copiere.
Exemplu și rezultat așteptat
Încarci o imagine de 800×600 într-o zonă de 500×300. Zoom o afișează fără deformare, lăsând spațiu lateral dacă este necesar. Încarci apoi altă imagine: prima copie este eliberată. Anularea dialogului păstrează imaginea curentă.
Fișier PNG → Sursă Image temporară → Copie Bitmap în PictureBox → Înlocuire → Dispose vechi.Mărește schema ↗
Codul complet
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LessonForm());
}
}
class LessonForm : Form
{
readonly PictureBox picture=new PictureBox {Dock=DockStyle.Fill,SizeMode=PictureBoxSizeMode.Zoom};
public LessonForm() {
Text="Imagini"; ClientSize=new Size(600,400);
var open=new Button {Text="Alege imagine",Dock=DockStyle.Top,Height=35};
open.Click += (sender,e) => {
using(var dialog=new OpenFileDialog {Filter="Imagini|*.png;*.jpg;*.jpeg"}) {
if(dialog.ShowDialog(this)!=DialogResult.OK) return;
try {
if(new FileInfo(dialog.FileName).Length>5000000) throw new ArgumentException("Fisier prea mare");
Bitmap next;
using(var source=Image.FromFile(dialog.FileName)) {
if(source.Width>4000 || source.Height>4000) throw new ArgumentException("Dimensiuni prea mari");
next=new Bitmap(source);
}
Image old=picture.Image; picture.Image=next; if(old!=null) old.Dispose();
} catch(ArgumentException) { MessageBox.Show(this,"Imagine invalida sau prea mare."); }
catch(IOException) { MessageBox.Show(this,"Fisierul nu poate fi citit."); }
catch(UnauthorizedAccessException) { MessageBox.Show(this,"Acces refuzat."); }
catch(OutOfMemoryException) { MessageBox.Show(this,"Imaginea nu poate fi decodata."); }
}
};
Controls.Add(picture); Controls.Add(open);
}
protected override void Dispose(bool disposing) {
if(disposing && picture.Image!=null) { picture.Image.Dispose(); picture.Image=null; }
base.Dispose(disposing);
}
}
Greșeli și limite
Nu apela Dispose pe o imagine pe care încă o afișează un control. Nu atribui aceeași instanță mai multor proprietari care o eliberează independent. Nu păstra sute de bitmap-uri la dimensiune completă pentru miniaturi. Pentru o galerie mare, încarcă la cerere și limitează numărul imaginilor păstrate.
Exersează
Deschide două imagini alternativ de zece ori, apoi verifică dacă poți redenumi fișierele sursă. Încearcă un fișier text redenumit .png: trebuie să primești refuz, iar imaginea veche să rămână. Redimensionează fereastra și verifică proporțiile. Explică de ce închiderea dialogului nu eliberează automat bitmap-ul afișat.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: meniuri și alegerea fișierelor prin dialog
Lecția următoare: C#: desene persistente cu Paint și Invalidate.
Referință: documentația Microsoft.
Întrebări frecvente
De ce copiez imaginea sursă?
Pentru a decupla bitmap-ul afișat de fișierul deschis temporar prin FromFile.
Zoom și StretchImage fac același lucru?
Nu. Zoom păstrează proporțiile, iar StretchImage poate deforma imaginea.
Când eliberez imaginea veche?
După ce ai înlocuit-o cu succes și când formularul care o deține se închide.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.