zmiana przezroczystosci

0

witam,
mam napisac program ktory pozwoli zmieniac przezroczystosc obrazow. Mam taka metode

private void przezroczystosc(int procent)
    {   int width=obraz1.getWidth(),height=obraz1.getHeight(); 

        BufferedImage filteredImage = new BufferedImage(width,height, obraz1.getType());
        WritableRaster raster = obraz1.getRaster(); //umozliwia operacje na pojedynczych pixelach
        Color obraz[][] = new Color[width][height]; 
        Color obrazwyj[][] = new Color[width][height];
        ColorModel model = obraz1.getColorModel(); //dzieki temu mozemy obsluzyc wiele formatow plikow
        Object data;int argb;
        for(int x=0;x<width;x++)
        {
            for(int y=0;y<height;y++)
            {
            data= raster.getDataElements(x, y, null); //zwraca informacje o kolorze pixela
            argb = model.getRGB(data);
            obraz[x][y]=new Color(argb);

            }
        }

            int i,j,k,l,red,green,blue;

            for(i=0;i<width;i++){
            for(j=0;j<height;j++){
            red=0;green=0;blue=0;

            red+=obraz[i][j].getRed();
            green+=obraz[i][j].getGreen();
            blue+=obraz[i][j].getBlue();

            if(red>255)red=255;if(green>255)green=255;if(blue>255)blue=255;
            if(red<0)red=0;if(green<0)green=0;if(blue<0)blue=0;
            obrazwyj[i][j]=new Color(red,green,blue,1);

            }
            }
            for(int x=1;x<width;x++)
            {
                for(int y=1;y<height;y++)
                {
                //obraz1=obrazwyj;  
                argb=obrazwyj[x][y].getRGB();   
                data = model.getDataElements(argb,null);
                raster.setDataElements(x,y,data);
                }
            }   
        repaint();
    }

i wlasciwie wszystko rozbija sie o linijke:
obrazwyj[i][j]=new Color(red,green,blue,1);
gdzie czwartym argumentem ma byc wartosc przezroczystoci.... jesli bawie sie kolorami wszystko dziala dobrze jednak tak jakby nie bral czwartego argumentu pod uwage, jaki by on nie byl.

z gory dzieki za jakies wskazowki.

0

Hm... niech zgadnę wczytujesz obraz typu jpg/bmp. Te formaty nie obsługują przezroczystości. Lepszą metodą jest przekonwertowanie ich na png i dopiero z tym formatem można pracować na przezroczystości.

0

tak jak poleciles zrobilem, jednak przy png zwraca mi blad nieznanego typu. Sprobowalem takze z gifem, dla tego przypadku dla ustawienia Color(red,green,blue,1) tylko lekko sciemnia obraz, dla 0 nie wyswietla obrazka - wiec niby reaguje ale nie tak jak powinien.

0

U mnie działa

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class TestAlpha extends JFrame
{
    public static void main(String[] args)
    {
        int alfa=255;
        try
        {
            alfa=Integer.parseInt(args[0]);
        }
        catch(Exception e)
        {
        }
        new TestAlpha(alfa);
    }
    //------------------------
    public TestAlpha(int alfa)
    {
        setLayout(new BorderLayout(2,2));
        JPanel panel=new Rysunek(alfa);
        add(panel,BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}
//------------------------------------------------
class Rysunek extends JPanel
{
    private int alfa;
    private Image image=null;
    private Image tlo=null;
    //------------------------
    Rysunek(int alfa)
    {
        this.alfa=alfa;
        setPreferredSize(new Dimension(300,200));
        Color kolor=new Color(0,255,0,alfa);
        int green=kolor.getRGB();
        int red=Color.red.getRGB();
        int[] pixels=new int[50*50];
        for(int i=0;i<pixels.length;i++)
        {
            pixels[i]=green;
        }
        MemoryImageSource source=new MemoryImageSource(50,50,pixels,0,50);
        image=createImage(source);
        pixels=new int[300*200];
        for(int i=0;i<pixels.length;i++)
        {
            pixels[i]=red;
        }
        source=new MemoryImageSource(300,200,pixels,0,300);
        tlo=createImage(source);
    }
    //------------------------
    public void paintComponent(Graphics g)
    {
        g.drawImage(tlo,0,0,null);
        g.drawImage(image,50,50,null);
    }
}

Może podajesz błędną wartość czwartego argumentu - powinien być z zakresu 0-255. Default jest 255.

0

wartosc argumentu jest ok. kod nadal nie dziala i nie wiem jak sobie z nim poradzic :/ moze natknal sie ktos gdzies na rozwiazanie takiego zadania?

0

Podany przeze mnie przykład działa u Ciebie czy nie ?

0

U mnie działa również wtedy gdy tłem jest rysunek odczytany z pliku

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class TestAlpha extends JFrame
{
    public static void main(String[] args)
    {
        int alfa=255;
        try
        {
            alfa=Integer.parseInt(args[0]);
        }
        catch(Exception e)
        {
        }
        new TestAlpha(alfa);
    }
    //------------------------
    public TestAlpha(int alfa)
    {
        setLayout(new BorderLayout(2,2));
        JPanel panel=new Rysunek(alfa);
        add(panel,BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}
//------------------------------------------------
class Rysunek extends JPanel
{
    private int alfa;
    private Image image=null;
    private Image tlo=null;
    //------------------------
    Rysunek(int alfa)
    {
        this.alfa=alfa;
        setPreferredSize(new Dimension(750,406));
        Color kolor=new Color(0,255,0,alfa);
        int green=kolor.getRGB();
        int[] pixels=new int[50*50];
        for(int i=0;i<pixels.length;i++)
        {
            pixels[i]=green;
        }
        MemoryImageSource source=new MemoryImageSource(50,50,pixels,0,50);
        image=createImage(source);
        tlo=new ImageIcon("images/ayers.jpg").getImage();
    }
    //------------------------
    public void paintComponent(Graphics g)
    {
        g.drawImage(tlo,0,0,null);
        g.drawImage(image,50,50,null);
    }
}

Tajemnicze

setPreferredSize(new Dimension(750,406));

jest dopasowane do rozmiarów użytego rysunku.

0

tak, ogolnie chodzi i dziekuje za zainteresowanie, ale chyba zle okreslilem moj problem. Mam zmieniac przezroczystosc wczytanych jpgow(badz innych formatow) - nakladanie dwoch zdjec z mozliwoscia zmiany przezroczystosci obu obrazow. Poczytalem troche, ze sa problemy z kodowaniem kolorow i dlatego najpierw trzeba pobrac wszystkie kolory z pixeli tak jak to jest zrobione w programie na samej gorze. Tylko jak w tym wypadku bawic sie przezroczystoscia?

edit:

ok, wstawilem linie:
obraz1=new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);

na poczatku metody przezroczystosc. I sama przezroczystosc chodzi jednak zmienia mi obraz w odcienie szarosci

0

jakies sugestie?

0

Próbowałem sie pobawić, ale nie mogę dojść jakiej klasy jest zmienna obraz1.

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