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