UWAGA! Promocja dla firm - MICROSOFT OFFICE 365  na 12 miesiecy ZA DARMO! Tylko na CentrumXP.pl!
Wielka promocja Office 365 na CentrumXP.pl!
Do góry Skomentuj

Przeglądarka zdjęć w C#

Przeglądarka zdjęć w C#

Autor: Marcin Hałaczkiewicz Opublikowano: 30 kwietnia 2007 Odsłon: 61 287

Tym razem napiszemy prostą przeglądarkę plików graficznych. Będzie ona obsługiwać kilka popularnych formatów takich jak jpeg, gif czy bmp. Aby ją stworzyć wykorzystamy kontrolkę PictureBox. Nauczymy się również wykorzystywać kółko myszki, gdyż aplikacja będzie je wykorzystywać do powiększenia.

Po standardowym utworzeniu nowego projektu (np. o nazwie Zdjecia), wybieramy menu Project a w nim Add Class. W oknie, które się otworzy wpisujemy nazwę klasy - MyPictureBox.

Nowo utworzona klasa będzie naszą własną kontrolką. Posłuży do wyświetlania obrazków, jednak w odróżnieniu od zwykłego PictureBoxa będzie wyposażona w paski przewijania, jeśli zdjęcie będzie za duże. Aby było to możliwe wyprowadzimy MyPictureBox z klasy Panel. Przechodzimy do pliku MyPictureBox.cs. Aby były dostępne standardowe kontrolki "okienkowe" u góry dopisujemy:

using System.Windows.Forms;

Następnie wyprowadzamy naszą klasę z klasy Panel, wewnątrz którego będzie wyświetlany PictureBox. Teraz klikamy prawym przyciskiem w Solution Explorer na pliku MyPictureBox.cs i wybieramy opcję View Designer. W nowo otwartym oknie dodajemy z Toolboxa kontrolkę PictureBox. W okienku z właściwościami zmieniamy jej nazwę na pic, a następnie klikamy na dowolnym pustym miejscu głównego okna. Dzięki temu w oknie Properties pojawią się właściwości naszej klasy (czyli po części Panelu). Ustawiamy pole AutoScroll na true. Spowoduje to wyświetlanie pasków przewijania, jeśli obrazek nie będzie się cały mieścił wewnątrz panelu. Zmieniamy również BackColor na Black oraz  Dock na Fill. Dzięki ostatniej operacji po umieszczeniu naszej kontrolki wewnątrz formy, wypełni ona całą jej powierzchnię.

Powróćmy do widoku kodu. Zauważmy, że przybyła nam nowa funkcja InitializeComponents. Zapisane jest w niej to, co stworzyliśmy za pomocą graficznego interfejsu. Stwórzmy konstruktor bezparametrowy i w jego wnętrzu umieśćmy wywołanie tej funkcji.

public MyPictureBox()
{
    InitializeComponent();
    this.Controls.Add(pic);
}

Ostatnią linijkę dopisaliśmy, gdyż chcemy, aby PictureBox był kontrolką "należącą" do Panelu, a nie żeby istniał równolegle obok niego. Gdybyśmy tego nie zrobili, żadne zdjęcie by się nie wyświetliło. Następnie wewnątrz klasy dopisujemy stałą:

const int MAXZOOM = 5;

Określa ona maksymalną krotność przybliżenia/oddalenia. Zajmijmy się teraz pisaniem własnych funkcji. Pierwszą z nich będzie LoadFromFile.

public void LoadFromFile(string txt)
{
    try
    {
        pic.Load(txt);
    }
    catch
    {
        MessageBox.Show("Nie można odczytać pliku", "Błąd",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
    pic.Size = pic.Image.Size;
    pic.SizeMode = PictureBoxSizeMode.CenterImage;
    dopasuj();
}

Próbuje ona wczytać grafikę z pliku, a gdy to się nie powiedzie wyświetla komunikat o błędzie. Następnie ustawia rozmiar PictureBoxa na rozmiar wyświetlanego obrazka. Ostatnia funkcja dopasuj jeszcze nie istnieje. Będzie ona wyświetlać zdjęcie w odpowiednim miejscu. Jeśli nie będzie się ono mieścić wewnątrz kontrolki to ulokuje je w lewym górnym rogu. Gdy kontrolka będzie większa niż grafika, to funkcja ją wycentruje. Oto treść funkcji:

private void dopasuj()
{
    if (pic.Width < this.Width &&
        pic.Height<this.Height)
    {
        pic.Location = new System.Drawing.Point(
            (this.Width - pic.Width) / 2,
            (this.Height - pic.Height) / 2);
    }
    else
    {
        pic.Location = new System.Drawing.Point(0, 0);
    }
}

Chcielibyśmy móc powiększać i pomniejszać obrazki, w związku z czym wyposażymy klasę MyPictureBox w funkcje ZoomIn oraz ZoomOut. Oto ich kod:

public void ZoomIn()
{
    if (pic.Image == null) return;
    if (pic.Width >= MAXZOOM * pic.Image.Width ||
        pic.Height >= MAXZOOM * pic.Image.Height)
    {
        return;
    }
    pic.Width = (int)(pic.Width + pic.Image.Width / MAXZOOM);
    pic.Height = (int)(pic.Height + pic.Image.Height / MAXZOOM);
    pic.SizeMode = PictureBoxSizeMode.StretchImage;
    dopasuj();
}


public void ZoomOut()
{
    if (pic.Image == null) return;
    if (pic.Width =< pic.Image.Width / MAXZOOM ||
        pic.Height =< pic.Image.Height / MAXZOOM)
    {
        return;
    }
    pic.Width = (int)(pic.Width - pic.Image.Width / MAXZOOM);
    pic.Height = (int)(pic.Height - pic.Image.Height / MAXZOOM);
    pic.SizeMode = PictureBoxSizeMode.StretchImage;
    dopasuj();
}

Funkcje działają analogicznie, więc omówię tylko ZoomIn Na początku sprawdzamy czy jakiś obrazek jest wyświetlany, a następnie czy któryś z rozmiarów PictureBoxa nie przekroczył odpowiedniego rozmiaru obrazka pomnożonego przez MAXZOOM (odpowiada to maksymalnemu powiększeniu), jeśli tak - funkcja kończy działanie. W przeciwnym wypadku wymiary PictureBoxa są powiększane o 1/5 w stosunku do oryginału. Następnie sposób wyświetlania ustalany jest na "rozciągnij", co wywołuje efekt zooma. Na końcu przy pomocy funkcji dopasuj wyświetlamy obrazek w odpowiednim miejscu, czyli na środku lub w lewym górnym rogu.

Pozostało nam jeszcze do oprogramowania jedno zdarzenie. Będzie ono kontrolować położenie obrazka podczas zmieniania rozmiaru kontrolki. Jego jedynym zadaniem będzie wywoływanie funkcji dopasuj. Tak więc tworzymy dla naszej klasy zdarzenie Resize. Robimy to oczywiście w graficznym edytorze. Wybieramy naszą klasę przez kliknięcie na szarym miejscu, a następnie w oknie właściwości klikamy żółty piorunek i tam znajdujemy Resize i klikamy 2 razy. Wewnątrz funkcji wpisujemy:

private void MyPictureBox_Resize(object sender, EventArgs e)
{
    dopasuj();
}

Tak oto stworzyliśmy własną kontrolkę, którą możemy teraz stosować. Przechodzimy do pliku z formą i zmieniamy właściwość Text na Zdjęcia. Po zbudowaniu projektu (klawisz F6) w toolboxie pojawi się nasza kontrolka.

Wybieramy ją i wstawiamy do formy. Nazywamy ją obrazek. .Następnie wybieramy kontrolkę MenuStrip i dodajemy ją do projektu. Należy zwrócić uwagę, aby dodać menu do formy, a nie do obrazka. Najlepiej przeciągnąć MenuStrip na górny pasek formy. W miejscu Type Here wpisujemy Plik, pod spodem Otwórz. Następnie obok Plik wpisujemy Opcje, a niżej Zoom In i Zoom Out.

Wybieramy teraz opcję Otwórz i klikamy na niej 2 razy, dzięki czemu zostanie utworzone zdarzenie Click. We wnętrzu funkcji wpisujemy:

private void otwórzToolStripMenuItem_Click(object sender, EventArgs e)
{
    OpenFileDialog dialog = new OpenFileDialog();
    dialog.ShowDialog();
    if (dialog.FileName != "")
        obrazek.LoadFromFile(dialog.FileName);
}

Zdarzenie to wykorzystuje OpenFileDialog do pobrania nazwy pliku i jeśli jakiś plik został wybrany to zostaje on otworzony. OpenFileDialog omawiałem już kilkukrotnie, więc nie będę zagłębiał się w szczegóły.

Pozostały nam jeszcze opcje Zoom In i Zoom Out. Tworzymy zdarzenia identycznie jak dla Otwórz. Wewnątrz wpisujemy tylko ZoomiIn() lub ZoomOut() - odpowiednio dla odpowiednich opcji menu.

Na końcu dorzucimy obsługę kółka myszki, za pomocą którego będziemy zmieniać powiększenie obrazka. Odpowiedzialne jest za to zdarzenia MouseWheel. Niestety nie ma go na liście zdarzeń w edytorze graficznym, więc dodamy je ręcznie. Zrobimy to w konstruktorze formy. Po funkcji InitializeComponent wpisujemy:

this.MouseWheel+=

Następnie naciskamy 2 razy tabulator, spowoduje to automatyczne wygenerowanie odpowiedniej funkcji. W jej wnętrzu wpisujemy:

if (e.Delta == 120)
    obrazek.ZoomIn();
else if (e.Delta == -120)
    obrazek.ZoomOut();

We właściwości e.Delta ukryta jest informacja o tym czy kółko zostało przesunięte. Jeśli wartość ta wynosi 120, to kółko przeskoczyło jeden "ząbek" do przodu, jeśli -120, to do tyłu. W zależności od tego czy kółko poszło w przód czy w tył, przybliżamy lub oddalamy obraz.

Tak oto ukończyliśmy kolejny program. Możemy go śmiało używać do oglądania zdjęć z wakacji z aparatu cyfrowego lub do różnych obrazków z Internetu.

Zobacz również

Komentarze

W jaki sposób mamy zadeklarować, że nasza kontrolka bedzie dziedziczyc po klasie Panel? Tzn. Nie rozumiem następujacego stwierdzenia: " wyprowadzimy MyPictureBox z klasy Panel". Proszę o wyjasnienie. Dzieki
Michał , 6 sierpnia 2007, 10:57
Spoko kurs
Michał, 6 sierpnia 2007, 11:12
Jak nacisniemy prawym przyciskiem myszy na na pliku MyPictureBox.cs to nie ma opcji View Designer. Co mam zrobic? Prosze o pomoc.
Michał, 6 sierpnia 2007, 17:47
I co kolego Michał: udało się? Też stanąłem na wyprowadzaniu z klasy Panel...
Mateusz, 9 sierpnia 2007, 13:10
Poczytajcie sobie o dziedziczeniu. W tym przykładzie wystarczy napisać: class MyPictureBox : Panel
digiboy, 10 sierpnia 2007, 14:15
Wiem, że to tylko przegladarka ale brakuje mi tu zapisu a tak to ok.
Aga , 24 listopada 2007, 21:48
W funkcji ZoomOut powinno być "<=" zamiast "=<".
Karol, 22 stycznia 2008, 10:22
Czy ma ktoś może źródła tego programu gdyż mam problemy i chciałbym zobaczyć gdzie popełniłem błąd. Będę wdzięczny za udostępnienie.
David, 1 marca 2008, 12:20
Ja mam, napisz na werewolf21@o2.pl to podrzuce.

simi, 9 października 2008, 11:09
Bardzo fajny programik jak na początek przerobienie go zajeło mi ok godzinke z przerwami Jak na początek z językiem C# jestem zadowolony.

Łukasz, 14 listopada 2008, 20:31
Mam prośbę czy ktoś mógłby mi przesłac kod tego programu nie za bardzo mi to działa a właśnie takiego czegoś szukam :)
ori, 19 stycznia 2010, 20:45
Przydałby się kod źródłowy
A., 19 stycznia 2010, 20:47
class Zdjęcia : Panel i wyświetla się View Designer
Okti, 25 czerwca 2010, 12:34
Nie rozumiem jednej rzeczy, zrobiłam wszystko krok po kroku i stanęłam na tym, że nie wyświetla mi się nowy komponent... Ma ktoś jakiś pomysł?
Okti, 25 czerwca 2010, 13:19
Czy ktoś może ma jeszcze ten program, bo robię wszystko krok po kroku, a mimo to coś mi nie działa.
Ryba, 27 września 2010, 20:00
żeby dodać kontrolkę trzeba wejść w tools >> options >> windows form designer i ustawić Auto Toolbox Populate na true.
Jaś, 28 maja 2011, 15:57
witam robiłam krok po kroku i coś mi nie wychodzi mógłby mi ktoś posłać kod źródłowy byłabym wdzięczna.
BAs, 22 stycznia 2012, 10:08

Dodaj swój komentarz

Zasady publikacji komentarzyZasady publikacji komentarzy

Redakcja CentrumXP.pl nie odpowiada za treść komentarzy publikowanych na stronach Portalu
i zastrzega sobie prawo do usuwania wypowiedzi, które:

  • zawierają słowa wulgarne, obraźliwe, prowokujące i inne naruszające dobre obyczaje;
  • są jedynie próbami reklamowania stron internetowych (spamowanie poprzez umieszczanie linków);
  • przyczyniają się do złamania prawa bądź warunków licencyjnych oprogramowania (cracki, seriale, torrenty itp.);
  • zawierają dane osobowe, teleadresowe, adresy mailowe lub numery GG;
  • merytorycznie nie wnoszą nic do dyskusji lub nie mają związku z tematem komentowanego newsa, artykułu bądź pliku.

Autor:

Komentarz:

Dodaj komentarz