wycinanie z obrazka i wklejanie do innego

0

cześć!
mam do napisania projekt na zajęcia z programowania w javie.
mam pomysł, teraz myślę, jak to rozwiązać...

nie potrafię sobie poradzić z teoretycznie prostą operacją... jak wyciąć kawałek obrazka z jednego zdjęcia i wkleić (w odpowiednia miejsce) do innego...

próbuję z java advanced imaging, ale nie mogę sobie poradzić...

proszę o pomoc.
czy istnieją jakieś metody typu:

cutOff(x1, y1, x2, y2, obrazek1)
pasteInto(x1, y1, obrazek1)
?

z góry dzięki...

0

nie. nie ma takich metod w standardowym api.

jednak można obrazek przekonwertować na tablic dwuwymiarową i napisać odpowiednie metody. to dość prosty algorytm.

0
tigr napisał(a)

cześć!
nie potrafię sobie poradzić z teoretycznie prostą operacją... jak wyciąć kawałek obrazka z jednego zdjęcia i wkleić (w odpowiednia miejsce) do innego...

Ja bym się zabrał do tego tak:
Utworzyłbym nowy pusty obrazek o pożądanych przeze mnie wymiarach (dla obrazka do "wycięcia"), a następnie wywołał createGraphics() na jego rzecz. Następnie za pomocą drawImage wyrenderowałbym na nim potrzebny fragment z obrazka źródłowego. Mając już wycięty obrazek ponownie wywołałbym createGraphics() na rzecz tym razem obrazka docelowego i potraktować go jak miejsce do malowania. Następnie ponownie za pomocą metody drawImage wyrenderowałbym cały wycięty obrazek w odpowiednim miejscu docelowego obrazka. I po wywołaniu dispose() obrazek powinien być gotowy do wyświetlenia lub zapisania w pliku.
Być może przydatne byłoby ustawienie odpowiednich warunków przenoszenia danych przez setRenderingHints(), ale to jest sprawa do doświadczalnego sprawdzenia jakie opcje będą najkorzystniejsze.
Funkcje graficzne zawarte w bibliotece AWT pozwalają spokojnie zbudować narzędzie o możliwościach Photoshopa. Wątpliwa może być co najwyżej wydajność (brak akceleracji sprzętowej) lub jakość poszczególnych efektów graficznych.

0

Klasa BufferedImage ma wszystko czego potrzebujesz. BufferedImage posiada metode getSubimage(int x, int y, int width, int height), co ona robi wydaje sie oczywiste.
Po wycieciu odpowiedniego fragmentu wystarczy narysowac go na obrazu docelowym, czyli cos takiego:

Buffered image src = ...
Buffered image target = ...

BufferedImage tmp = src.getSubImage(20,20,50,50);

Graphics g = target.getDrawGraphics();
g.drawImage(tmp,50,50,50,50,null);

Pisalem zpamieci wiec moga byc bledy.

0

Dlaczego standardowo jak mam BufferedImage to color jest czarny?

I nie umiem tego zmienić?

RYsuje coś sobie po tym obrazie, po czym wyświetlam w panelu ale zawsze tło jest czarne!
Jak to zmienić i dlaczego może się tak dziać?

0

BufferedImage, to opakowany Raster (tablica piksli). W Javie tablice liczbowe są inicjowane zerami, a kolor (0,0,0) jest czarny.

0

No ok, dużo mi to wyjaśnia
ale jak to zmienić.

Bo próbowałem 'setColor()',
i jakieś dwie inne metody ale to nic nie pomagało

0

Możesz wyjaśnić czemu rysujesz po BufferedImage, a nie po panelu. Po panelu jest prościej i banalnie się ustawia kolor tła.
Przy rysunkach wymagających skomplikowanych obliczeń (np. fraktale) stosowałem taki sposób: przed pierwszym rysowaniem (image==null) tworzyłem odpowiednio dużą, jednowymiarową tablicę int[] pixels, wypełniałem ją kolorem tła (metoda getRGB() w klasie Color), potem zmieniałem zgodnie z wynikami obliczeń kolory pewnych piksli. Na końcu

   MemoryImageSource source=new MemoryImageSource(...);
   image=createImage(source);

W metodzie paintComponent rysowałem drawImage(image,...). Konieczność odrysowania (bo użytkownik np. zmienił rozmiar okna lub wyciągnął okno na wierzch) nie pociągała konieczności wykonania obliczeń.

0

Ponieważ robię animację, myślałem, że takie rysowanie jest dużo szybsze.

A innym powodem jest to, że robię zoom w aplikacji.

Realizuje to tak, że trzymam oryginalny obraz, na którym jest animacja w BufferedImage.
Potem wycinam kawałek, i rysuje odpowiednio na panelu, który mi sam powiększa do odpowiedniej wielkości.
jedynym problemem jest tutaj, że przy powiększeniach, moje elementu kule nie są okrągłe a postrzępione z lin, taki zygzak

0

Poprzednio opisałem jak stworzyć Image z tablicy piksli.
Znalazłem na dysku klasę (nie moją), która robi BufferedImage z Image.

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import javax.imageio.*;
import java.io.*;
//----------------------------
public class ImageToBuff
{
    public static BufferedImage toBufferedImage(Image image)
    {
        BufferedImage bi=null;
        boolean hasAlpha=hasAlpha(image);
        GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
        try
        {
            int transparency=Transparency.OPAQUE;
            if (hasAlpha)
            {
                transparency=Transparency.BITMASK;
            }
            GraphicsDevice gs=ge.getDefaultScreenDevice();
            GraphicsConfiguration gc=gs.getDefaultConfiguration();
            bi=gc.createCompatibleImage(image.getWidth(null),image.getHeight(null),transparency);
        }
        catch (HeadlessException e)
        {
            // The system does not have a screen
        }

        if (bi==null)
        {
            // Create a buffered image using the default color model
            int type=BufferedImage.TYPE_INT_RGB;
            if (hasAlpha)
            {
                type=BufferedImage.TYPE_INT_ARGB;
            }
            bi=new BufferedImage(image.getWidth(null),image.getHeight(null),type);
        }

        // Copy image to buffered image
        Graphics g=bi.createGraphics();

        // Paint the image onto the buffered image
        g.drawImage(image,0,0,null);
        g.dispose();

        return bi;
    }
    //------------------------
    public static boolean hasAlpha(Image image)
    {
        if (image instanceof BufferedImage) 
        {
            BufferedImage bi=(BufferedImage)image;
            return bi.getColorModel().hasAlpha();
        }
        // Use a pixel grabber to retrieve the image's color model;
        // grabbing a single pixel is usually sufficient
        PixelGrabber pg=new PixelGrabber(image,0,0,1,1,false);
        try
        {
            pg.grabPixels();
        }
        catch (InterruptedException e)
        {
        }

        // Get the image's color model
        ColorModel cm=pg.getColorModel();
        return cm.hasAlpha();
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1