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.

0

Dodatkowo wyjaw jak ta zmienna powstaje.

0

ok wkleje caly kod bedzie moze latwiej o dogadanie sie. obraz1 to zwykly BufferedImage, i jest on ladowany z pliku.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class Glowna {

public static void main(String[] args) {
	JFrame frame = new Ramka();
	frame.setSize(1000,800);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.show();
}

}

class Ramka extends JFrame
{

BufferedImage obraz1, obraz2;

private static final long serialVersionUID = 1L;

public Ramka()
{   
	
	setTitle("Kozieja Karolik, grafika komputerowa-projekt");
	setSize(WIDTH, HEIGHT);
	
	JPanel panel=new 
	JPanel()
	{
	/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

	public void paintComponent(Graphics g)
	{
		//g.setPaint(new GradientPaint(0, 0, new Color(0, 150, 0), 20, 20,
		 //       new Color(50, 150, 50, 80), true));
		//g.setColor(new Color(150,150, 150, 80));
		
		super.paintComponent(g);
		if(obraz1 != null)
			g.drawImage(obraz1, 0, 0,  null);
		if(obraz2 != null)
			g.drawImage(obraz2, 0, 0, null);
	}
	};
	try {
		   UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		  } catch (Exception exception) {
		   exception.printStackTrace();
		   }
	getContentPane().add(panel, BorderLayout.CENTER);
	JMenu fileMenu = new JMenu("File");
	JMenuItem openItem = new JMenuItem("Otworz");
	openItem.addActionListener(new ActionListener()
	{
		public void actionPerformed(ActionEvent event)
		{
			openFile();
		}
	});
	fileMenu.add(openItem);
	JMenuItem exitItem = new JMenuItem("Zakoncz");
	exitItem.addActionListener(new ActionListener()
	{
		public void actionPerformed(ActionEvent event)
		{
			System.exit(0);
		}
		});
		fileMenu.add(exitItem);
		
		JMenu opcjeMenu = new JMenu("Opcje");
		JMenuItem przezrocz = new JMenuItem("Nadaj przezroczystosc");
		przezrocz.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent event)
			{
			
					obraz1=przezroczystosc(50,obraz1);
					repaint();
					/*if (obraz1!=null) {
						obraz2=przezroczystosc(50,obraz2);
					} else {
						obraz1=przezroczystosc(50,obraz1);
						
					//	obraz1=moja(obraz1);
					}
				*/
			}
		
	});
	opcjeMenu.add(przezrocz);
	
	JMenu infoMenu = new JMenu("Info");
	JMenuItem autorzy = new JMenuItem("autorzy");
	przezrocz.addActionListener(new ActionListener()
	{
		public void actionPerformed(ActionEvent event)
		{
			//wstawimy info o nas :)
			
		}
	
});
infoMenu.add(autorzy);
	
	
	


JMenuBar menuBar = new JMenuBar();
menuBar.add(fileMenu);
menuBar.add(opcjeMenu);
menuBar.add(infoMenu);
setJMenuBar(menuBar);
}	
private BufferedImage przezroczystosc(int procent, BufferedImage obraz1)
{   int width=obraz1.getWidth(),height=obraz1.getHeight(); 
	
	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(ale i tak nie dziala:))
	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,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();
		obrazwyj[i][j]=new Color(red,green,blue,255);
		
		
		}
		}
		for(int x=1;x<width;x++)
		{
			for(int y=1;y<height;y++)
			{
			
			argb=obrazwyj[x][y].getRGB();	
			data = model.getDataElements(argb,null);
			raster.setDataElements(x,y,data);
			}
		}	
		return obraz1;
		//repaint();
}

public void openFile()
{
	JFileChooser chooser = new JFileChooser();
	chooser.setCurrentDirectory(new File("."));
	
	chooser.setFileFilter(new
			javax.swing.filechooser.FileFilter()
	{
		public boolean accept(File f)
		{
			String name = f.getName().toLowerCase();
			return name.endsWith(".gif")
			|| name.endsWith(".jpg")
			|| name.endsWith(".jpeg")
			|| name.endsWith(".png")
			|| f.isDirectory();
		}
		
		public String getDescription() {
			// TODO Auto-generated method stub
			return "Image files";
		}
		});
int r = chooser.showOpenDialog(this);
if(r != JFileChooser.APPROVE_OPTION) return;
try
{	
	if (obraz1!=null) {
		obraz2 = ImageIO.read(chooser.getSelectedFile());
	} else {
		obraz1 = ImageIO.read(chooser.getSelectedFile());
		//obraz1=new BufferedImage(obraz1.getWidth(),height,BufferedImage.OPAQUE);
		
	//	obraz1=moja(obraz1);
	}
	}
	
catch (IOException exception)
{
	JOptionPane.showMessageDialog(this, exception);
}
repaint();
}

/**
filtr obrazu
*/

private static final int WIDTH = 400;
private static final int HEIGHT = 400;

}

0

Moim zdaniem w waszym programie są dwa błędy. Przezroczysty ma być rysunek obraz1, zatem rysować trzeba tak:

    if(obraz2 != null)
        g.drawImage(obraz2, 0, 0, null);
    if(obraz1 != null)
        g.drawImage(obraz1, 0, 0,  null);

funkcja przezroczystosc(...) robi mnóstwo (dla mnie niezrozumiałych) rzeczy, ale nie robi rzeczy podstawowej: nie zmienia rysunku obraz1
Sprawdźcie to (nazwa rysunku i jego wymiary są na sztywno zaszyte w kodzie - dopasujcie do własnych potrzeb)

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;

public class TestAlpha extends JFrame implements ActionListener
{
    private javax.swing.Timer timer;
    private int alpha=255;
    private Rysunek rysunek=new Rysunek();
    private int output[]=new int[640*480];
    private MemoryImageSource source=null;
    //------------------------
    public static void main(String[] args)
    {
        new TestAlpha();
    }
    //------------------------
    public TestAlpha()
    {
        setLayout(new BorderLayout(2,2));

        JToolBar tb=new JToolBar();
        JButton b=new JButton(new ImageIcon("Play.gif"));
        b.setActionCommand("Play");
        b.addActionListener(this);
        tb.add(b);
        b=new JButton(new ImageIcon("Stop.gif"));
        b.setActionCommand("Stop");
        b.addActionListener(this);
        tb.add(b);
        add(tb,BorderLayout.NORTH);

        add(rysunek,BorderLayout.CENTER);

        timer=new javax.swing.Timer(1,new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
            	alpha-=16;
            	if(alpha<0)
            	{
                    alpha=255;
                }
                Color color=new Color(255,0,0,alpha);
                for(int i=0;i<output.length;i++)
                {
                    output[i]=color.getRGB();
                }
                source=new MemoryImageSource(640,480,output,0,640);
                rysunek.makeImage(source);
                rysunek.repaint();
            }
        });

        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    //------------------------
    public void actionPerformed(ActionEvent ae)
    {
        String cmd=ae.getActionCommand();
        if(cmd.equalsIgnoreCase("Play"))
        {
            timer.start();
            return;
        }
        if(cmd.equalsIgnoreCase("Stop"))
        {
            timer.stop();
            return;
        }
    }
}
//------------------------------------------------
class Rysunek extends JPanel
{
    private BufferedImage first=null;
    private Image outputImage=null;
    //------------------------
    Rysunek()
    {
        setPreferredSize(new Dimension(640,480));
        try
        {
            first=ImageIO.read(new File("1.jpg"));
        }
        catch(Exception e)
        {
        }
    }
    //------------------------
    public void makeImage(MemoryImageSource source)
    {
        outputImage=createImage(source);
    }
    //------------------------
    public void paintComponent(Graphics g)
    {
        g.drawImage(first,0,0,null);
        if(outputImage!=null)
        {
            g.drawImage(outputImage,0,0,null);
        }
    }
}
0

if(obraz1 != null)
g.drawImage(obraz1, 0, 0, null);
if(obraz2 != null)
g.drawImage(obraz2, 0, 0, null);

ten kawalek kodu zabezpiecza mi tylko wyrzucanie nulla w przypadku nie zaladowania jeszcze obrazka numer 2( ladujesz obraz1, 2 jeszcze nie ma).

co do metody przezroczystosc to jest on w wiekszosci z ksiazki Java II techniki zaawansowane, i obraz1 jest nadpisywany..tylko zmienia obraz w skale szarosci.

pogrzebie z Twoim kodem.

0

Nie zrozumiałeś w czym jest problem pierwszy - wyświetlasz rysunki w złej kolejności.
W metodzie przezroczystosc() zmieniasz tylko raster dla rysunku obraz1, samego rysunku nie zmieniasz.

0

ale to nie jest wazne, na tym etapie laduje do programu tylko jeden obraz. drugi jest null wiec go nie bierze pod uwage w ogóle.

Moze sie myle nie wiem, w takim razie jak wytlumaczysz ze po zmianie przezroczystosci wyswietla mi ten sam obraz tylko w skali szarosci (i ze zmieniona przezroczystoscia [diabel] ), moze czegos nie lapie.

0

Z logiką u Ciebie na bakier. Jeśli korzystasz tylko z jednego rysunku i raz go wyświetliłeś w stanie nieprzezroczystym, a potem w tym samym miejscu wyświetlasz go jako przezroczysty, to nie możesz zobaczyć żadnej zmiany w wyglądzie: przez przezroczysty przebija pierwotny nieprzezroczysty.

0

problem powraca:/ chcialem go sam rozwiazac ale nie dam rady. Wiem ze mozna uzyc AlphaComposite ale chodzi o to ze ja musze obsluzyc przezroczystosc jak najbardziej samodzielnie. rozumiem bogdans Twoj kod ma zmniejszac przezroczystoc obrazku po kazdym nacisnieciu klawisza ale..nie dziala :) W moim kodzie wszystko rozbija sie o linie
obraz1=new BufferedImage(obraz1.getWidth(),height,BufferedImage.TYPE_INT_ARGB);
A w ARGB oznacza mozliwosc zmiany kanalu alpha, jednak gdy zaincjalizuje zmienna a pozniej przypisze do niej zaladwoany plik to program albo robi mi obszar w odcieniach szarosci albo w ogóle.
czas mija, google przegrzebane a problem nadal jest

0

Napisałem program demonstrujący przezroczystość. W pewnych przypadkach nie działa - Java nie potrafi otworzyć niektórych plików PNG.

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;
import java.util.*;

public class TestGrabber extends JFrame implements ActionListener
{
    private javax.swing.Timer timer;
    private JPanel panel;
    private int licznik;
    private int maxLicznik;
    private int pixels[];
    private MemoryImageSource source=null;
    private JButton start=new JButton(new ImageIcon("images/Play.gif"));
    private JButton openFirst=new JButton(new ImageIcon("images/Open.gif"));
    private JButton openSecond=new JButton(new ImageIcon("images/Open.gif"));
    private JFileChooser fc=new JFileChooser(".");
    protected BufferedImage img1=null;
    protected BufferedImage img2=null;
    protected Image courtain;
    private int width=0;
    private int height=0;
    private PixelGrabber pg=null;
    private JTextField firstFile=new JTextField(60);
    private JTextField secondFile=new JTextField(60);
    private File f=null;
    private JSpinner delay=new JSpinner(new SpinnerNumberModel(1,1,100,1));
    private JSpinner skok=new JSpinner(new SpinnerNumberModel(32,1,255,1));
    //------------------------
    public static void main(String[] args)
    {
        Spolszczenie.set();
        new TestGrabber();
    }
    //------------------------
    public TestGrabber()
    {
        setTitle("Test przezroczystości");
        setLayout(new BorderLayout(2,2));

        JToolBar tb=new JToolBar();

        openFirst.setActionCommand("First");
        openFirst.setToolTipText("Wybór rysunku pod spodem");
        openFirst.addActionListener(this);
        tb.add(openFirst);

        openSecond.setActionCommand("Second");
        openSecond.setToolTipText("Wybór rysunku na wierzchu");
        openSecond.addActionListener(this);
        tb.add(openSecond);

        tb.addSeparator();

        start.setActionCommand("Start");
        start.setToolTipText("Pokaz narastania przezroczystości");
        start.setEnabled(false);
        start.addActionListener(this);
        tb.add(start);

        tb.addSeparator();
        tb.add(new JLabel("Opóźnienie (w ms):"));
        tb.addSeparator();
        tb.add(delay);
        tb.addSeparator();
        tb.add(new JLabel("Skok przezroczystości:"));
        tb.addSeparator();
        tb.add(skok);

        add(tb,BorderLayout.NORTH);

        panel=new Panelik(this);
        add(panel,BorderLayout.CENTER);

        PanelInfo info=makePanelInfo();
        add(info,BorderLayout.SOUTH);

        fc.setFileFilter(new javax.swing.filechooser.FileFilter()
        {
            public boolean accept(File f)
            {
                String name=f.getName().toLowerCase();
                return name.endsWith(".gif") || name.endsWith(".jpg") || name.endsWith(".jpeg")
                       || name.endsWith(".png") || f.isDirectory();
            }
            public String getDescription()
            {
                return "Pliki graficzne";
            }
        });
        fc.setMultiSelectionEnabled(false);

        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    //------------------------
    private PanelInfo makePanelInfo()
    {
        Vector<Pozycja> pozycje=new Vector<Pozycja>();
        Font f=new Font("monospaced",Font.PLAIN,12);

        JLabel l=new JLabel(" Rysunek pod spodem: ");
        l.setFont(f);
        firstFile.setEditable(false);
        Pozycja p=new Pozycja(l,firstFile);
        pozycje.add(p);

        l=new JLabel("Rysunek na wierzchu: ");
        l.setFont(f);
        secondFile.setEditable(false);
        p=new Pozycja(l,secondFile);
        pozycje.add(p);

        PanelInfo pi=new PanelInfo(800,pozycje,true,BorderFactory.createLineBorder(Color.black),5);
        return pi;
    }
    //------------------------
    private void setButtons()
    {
        if(img1!=null & img2!=null)
        {
            width=img2.getWidth();
            height=img2.getHeight();
            final int[] original=new int[width*height];
            pg=new PixelGrabber(img2,0,0,width,height,original,0,width);
            try
            {
                pg.grabPixels();
            }
            catch(Exception e)
            {
                My.say(e.toString(),this);
                return;
            }
            pixels=new int[width*height];

            int czas=((Integer)delay.getValue()).intValue();
            timer=new javax.swing.Timer(czas,new ActionListener()
            {
                public void actionPerformed(ActionEvent ae)
                {
                    int alpha;
                    int rgb;
                    for(int i=0;i<pixels.length;i++)
                    {
                        rgb=original[i]&0xffffff;
                        alpha=(original[i]>>24)&0xff;
                        pixels[i]=rgb+((alpha*licznik)/maxLicznik<<24);
                    }
                    source=new MemoryImageSource(width,height,pixels,0,width);
                    courtain=createImage(source);
                    panel.repaint();
                    licznik-=1;
                    if(licznik<0)
                    {
                        timer.stop();
                    }
                }
            });
            start.setEnabled(true);
            panel.repaint();
        }
    }
    //------------------------
    public void actionPerformed(ActionEvent ae)
    {
        String cmd=ae.getActionCommand();
        if(cmd.equalsIgnoreCase("Start"))
        {
            licznik=((Integer)skok.getValue()).intValue();
            maxLicznik=((Integer)skok.getValue()).intValue();
            timer.start();
            return;
        }
        if(cmd.equalsIgnoreCase("First"))
        {
            if(fc.showOpenDialog(this)==JFileChooser.APPROVE_OPTION)
            {
                try
                {
                    f=fc.getSelectedFile();
                    img1=ImageIO.read(f);
                    firstFile.setText(f.getAbsolutePath());
                }
                catch(Exception e)
                {
                    My.say(e.toString(),this);
                    return;
                }
            }
            else
            {
                return;
            }
            setButtons();
            return;
        }
        if(cmd.equalsIgnoreCase("Second"))
        {
            if(fc.showOpenDialog(this)==JFileChooser.APPROVE_OPTION)
            {
                try
                {
                    f=fc.getSelectedFile();
                    img2=ImageIO.read(f);
                    secondFile.setText(f.getAbsolutePath());
                }
                catch(Exception e)

                    My.say(e.toString(),this);
                    return;
                }
            }
            else
            {
                return;
            }
            setButtons();
            return;
        }
    }
}
//------------------------------------------------
class Panelik extends JPanel
{
    private TestGrabber parent;
    //------------------------
    public Panelik(TestGrabber parent)
    {
        super();
        this.parent=parent;
        setPreferredSize(new Dimension(800,600));
    }
    //------------------------
    public void paintComponent(Graphics g)
    {
        if(parent.img1!=null)
        {
            g.drawImage(parent.img1,0,0,null);
            if(parent.courtain!=null)
            {
                g.drawImage(parent.courtain,0,0,null);
            }
        }
    }
}

Funkcja My.say() pochodzi z mojej klasy narzędziowej

    public static void say(String msg,Component c)
    {
        JLabel l=new JLabel(msg);
        l.setHorizontalAlignment(SwingConstants.CENTER);
        JOptionPane.showMessageDialog(c,l,"",JOptionPane.INFORMATION_MESSAGE);
    }
0

no kamien milowy pokonany:) w nagrode za wasze meczarnie umieszczam rozwiazanie - wystarczy przekonwertowac plik wejsciowy do typu TYPE_INT_ARGB ktory obsluguje przezroczystosc, jest to wykonywane w metodzie convert:

 public BufferedImage convert(Image im)
	 {
	    BufferedImage bi = new BufferedImage(im.getWidth(null),im.getHeight(null),BufferedImage.TYPE_INT_ARGB);
	    Graphics bg = bi.getGraphics();
	    bg.drawImage(im, 0, 0, null);
	    bg.dispose();
	    return bi;
	 }

a pozniej bawic sie z algorytmem(na razie na sztywno)
jak zrobie juz kod ze slidebarami do zmiany przezroczystosci to zamieszcze kod moze komus sie przyda

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