Java - Práce s obrázky (64.díl)

Napsal O webu (») 18. 10. 2008 v kategorii Programování, přečteno: 7486×
obrazky/java_logo.png

Práce s obrázky

V programu často pracujeme s rastry. Java nativně pracuje s formáty JPG, PNG a GIF. Rastry mohou být připojovány jak z lokálního zdroje, tak ze vzdáleného počítače prostřednictvím URL. Metody pro práci s rastry nalezneme ve třídách ImageIO, BufferedImage, ImageIcon. Tato problematika je poměrně rozsáhlá, Java disponuje řadou nástrojů pro práci s rastry, omezíme se jen na velmi stručný popis základních možností, především s postupem pro načtení a uložení rastru. Práce s rastrem představuje zpravidla dva kroky: první tvoří jeho načtení, druhý jeho zobrazení.

Načtení rastru

Načtení rastru lze provést několika způsoby. Ukážeme dvě varianty, první s využitím třídy BufferedImage, druhou s využitím třídy ImageIcon().
  • Načtení rastru z lokálního zdroje
    Načtení nejprve provedeme z lokálně umístěného souboru. Nejprve vytvoříme instanci třídy fle a inicializujeme ji cestou k souboru. Připomeňme, že při zápisu cesty musíme používat dvojitá lomítka, při použití jednoho lomítka by se jednalo o ESCAPE sekvenci.

    File f=new File(C:\\zajic.png);
    Vytvoříme odkaz na instanci třídy BufferedImage

    BufferedImage im;
    Rastr načteme statickou metodou třídy ImageIO.read(File f) a inicializujeme s ním odkaz im.

    im=ImageIO.read(f);
    Druhou možnost představuje využití třídy ImageIcon. Vytvoříme novou instanci třídy ImageIcon, v konstruktoru ji inicializujeme souborem s rastrem, konstruktor očekává na vstupu objekt typu String. Metodou toString() získáme název souboru.

    ImageIcon i=new ImageIcon(f.toString());
    V dalším kroku vytvoříme odkaz na instanci třídy Image a inicializujeme ji prostřednictvím metody getImage() načteme rastr.

    Image im=i.getImage();

  • Načtení rastru ze vzdáleného zdroje
    Při načítání rastru ze vzdáleného zdroje vytvoříme novou instanci třídy URL, kterou inicializujeme odkazem na rastr.

    url=new URL("http://adresa");
    Další postup je stejný jako v předchozím případě

    im=ImageIO.read(url);

    Zobrazení rastru

    Poté, co je rastr načten, je nutné ho zobrazit. Zpravidla se používá komponenta JPanel. Zobrazování rastru probíhá v předefnované metodě paintComponent() za použití metody drawImage(). Metoda je přetížena, je k dispozici celkem 6 prototypů této metody. Nejjednodušší varianta vypadá takto:

    boolean drawImage(Image img,int x,int y, ImageObserver observer)
    Metoda neupravuje velikost rastru, rastr se na komponentu nemusí vejít celý, v takovém případě je zobrazena pouze levá horní část rastru. Pokud bychom chtěli rastr zobrazit celý, můžeme buď formulář zvětšit, nebo umístit JPanel na JScrollPane. Proměnná img představuje odkaz na načtený rastr, x, y souřadnice levého horního rohu rastru na komponentě, observer objekt, který je uvědoměn, je -li rastr načten. V našem případě bude kód pro vykreslení vypadat takto:

    public void paintComponent(Graphics g)
    {
    g.drawImage(im,0,0,this);
    }

    Druhý prototyp, který uvedeme, obsahuje parametry width/height, které umožní stanovit novou velikost rastru. Rastr tedy můžeme dodatečně zvětšit či zmenšit.
    boolean drawImage(Image img, int x, int y, int sirka, int vyska, ImageObserver observer)

    Uložení rastru

    Rastr můžeme uložit za použití statické metody ImageIO.write(). Její prototyp vypadá takto:

    write(RenderedImage im, String format, File soubor)

    Autor: Filip Koval
  • Štítky: Java
    Facebook Twitter Topčlánky.cz Linkuj.cz

    Komentáře

    Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
    Daniel z IP 89.102.208.*** | 26.5.2010 12:46
    A jak?
    Daniel z IP 89.102.208.*** | 26.5.2010 12:46
    A jak?
    Pavel z IP 147.228.209.*** | 19.12.2009 01:46
    Už jsem to vyřešil.
    | 17.12.2009 17:11
    bohužel takto nedokážu poradit.

    MM
    Pavel z IP 147.228.209.*** | 17.12.2009 17:07
    No ono to celé má něco přes 1200 řádek, takže to asi nepůjde. Jednoduše mám jFrame a v něm JPanel a chci do něj obrázek - už jsem prošel několik tutoriálů, ale stejně se mi to nedaří. Dík za odpověď
    | 17.12.2009 15:15
    Dobrý den,
    pokud mě nasměrujete někam, kde bych se na kod mohl podívat, zavzpomínám na předchozí ročníky na VŠB. smile
    S pozdravem
    MM
    Pavel z IP 147.228.183.*** | 17.12.2009 14:31
    Ahoj, mohl by jste mi někdo prosím poradit jak načíst obrázek do JPanelu bez použití nové třídy přímo v aktuální třídě. Vytvořil jsem si file s obrázkem a načetl ho do bufferu, ale nedaří se mi ho vykreslit. Děkuji


    Nový komentář

    Téma:
    Jméno:
    Notif. e-mail *:
    Komentář:
      [b] [obr]
    Odpovězte prosím číslicemi: Součet čísel jedenáct a dvanáct