Grafika komputerowa interpolacja dwuliniowa

0

Witam wszystkich bardzo serdecznie

mam taki kod

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


import java.io.*;

public class GrafikaZad2 extends JFrame implements MouseListener, ActionListener {
	 private static final long serialVersionUID = 1L;
	    
	    public JTextField poleTekstoweSciezka = new JTextField(30);
	    public JTextField poleTekstoweWymiarX = new JTextField(10);
	    public JTextField poleTekstoweWymiarY = new JTextField(10);
	    
	    PanelWyjsciowy panelWyjsciowy = new PanelWyjsciowy();
	    PanelWejsciowy panelWejsciowy = new PanelWejsciowy();
	    
	    JButton wczytywanieplikuObrazka = new JButton("Wczytaj");
	    JButton skalowanieplikuObrazka = new JButton("Skaluj");
	    JButton zapisz = new JButton("Zapisz");
	    
	    public JPanel panelCalosciowy = new JPanel();
	    //public Graphics2D graphics = (Graphics2D) getGraphics();
	    
	    private int poczatkowaWysokosc;
	    private int poczatkowaSzerokosc;
	        
	    BufferedImage plikObrazu;
	    BufferedImage plikObrazu2;    
	        
	    File obrazWPliku;
	    
	    public GrafikaZad2() {
	            	
	    	// Full screen
	    	setExtendedState(Frame.MAXIMIZED_BOTH);
	    	
	    	setDefaultCloseOperation(EXIT_ON_CLOSE);
	        getContentPane().add(panelCalosciowy);
	        poleTekstoweSciezka.setText("C:\\1.jpg");

	        /**
	         * AKCJE KOMPONENTOW
	         */
	        wczytywanieplikuObrazka.addActionListener(new SluchaczKomponentu());
	        skalowanieplikuObrazka.addActionListener(new SluchaczKomponentu());
	        zapisz.addActionListener(new SluchaczKomponentu());

	        /**
	         * ROZMIESZCZENIE PANELI W OKIENKU
	         */
	        //Panel - calosc, suma paneli mniejszych
	        panelCalosciowy.setLayout(new BorderLayout());

	        
	        //panelWejsciowy.setBorder(BorderFactory.createLineBorder(Color.RED, 3));
	        panelWejsciowy.setToolTipText("Obraz wejsciowy");
	        panelWejsciowy.setLayout(new BorderLayout());
	        panelWejsciowy.setBounds(70, 50, 602, 525);
	        
	        //panelWyjsciowy.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
	        panelWyjsciowy.setToolTipText("Obraz wyjsciowy");
	        panelWyjsciowy.setLayout(new BorderLayout());
	        panelWyjsciowy.setBounds(10, 50, 602, 525);
	        
	        

	        JPanel pierwszyPanel = new JPanel();
	        pierwszyPanel.setLayout(null);
	        pierwszyPanel.add(panelWejsciowy);

	        JPanel drugiPanel = new JPanel();
	        drugiPanel.setLayout(null);
	        drugiPanel.add(panelWyjsciowy);

	        JPanel panelLaczacyObraz = new JPanel();
	        panelLaczacyObraz.setLayout(new GridLayout(1, 0));
	        panelLaczacyObraz.add(pierwszyPanel);
	        panelLaczacyObraz.add(drugiPanel);

	        //TRZECI PANEL - KONTROLNY

	        JPanel trzeciPanel = new JPanel();
	        trzeciPanel.setLayout(new FlowLayout());
	        trzeciPanel.add(poleTekstoweSciezka);
	        trzeciPanel.add(wczytywanieplikuObrazka);

	        JPanel czwartyPanel = new JPanel();
	        czwartyPanel.setLayout(new FlowLayout());

	        czwartyPanel.add(skalowanieplikuObrazka);
	        czwartyPanel.add(poleTekstoweWymiarX);
	        czwartyPanel.add(poleTekstoweWymiarY);
	        czwartyPanel.add(zapisz);


	        JPanel panelLaczacyKontrolki = new JPanel();
	        panelLaczacyKontrolki.setLayout(new FlowLayout());
	        panelLaczacyKontrolki.add(trzeciPanel);
	        panelLaczacyKontrolki.add(czwartyPanel);

	        //Zebranie w 1 calosc :
	        panelCalosciowy.add(panelLaczacyObraz, BorderLayout.CENTER);
	        panelCalosciowy.add(panelLaczacyKontrolki, BorderLayout.SOUTH);

	        addMouseListener(this);
	        setVisible(true);
	    } // koniec konstruktora

	    /**
	     * OBSLUGA PRZYCISKOW
	     */
	    class SluchaczKomponentu implements ActionListener {

	        public void actionPerformed(ActionEvent e) {
	            if (((JButton) e.getSource()).getText().equals("Wczytaj")) {

	                if (!panelWejsciowy.isVisible()) {

	                    panelWejsciowy.setVisible(true);
	                    panelWejsciowy.otworzObrazek(poleTekstoweSciezka.getText());
	                } else {
	                	
	                    panelWejsciowy.otworzObrazek(poleTekstoweSciezka.getText());
	                }

	            }

	            if (((JButton) e.getSource()).getText().equals("Skaluj")) {
	            	
	                                        
	                
	                plikObrazu2 = new BufferedImage(Integer.parseInt(poleTekstoweWymiarX.getText()), Integer.parseInt(poleTekstoweWymiarY.getText()),
	                		plikObrazu.getType());
	                panelWyjsciowy.scale(Integer.parseInt(poleTekstoweWymiarX.getText()),Integer.parseInt(poleTekstoweWymiarY.getText()),panelWyjsciowy.getGraphics());
	                
	            }
	            
	            if (((JButton) e.getSource()).getText().equals("Zapisz")) 
	            	panelWyjsciowy.zapiszObrazek(poleTekstoweSciezka.getText());
	            
	        } // action performed
	    } // Koniec sluchacz komponentu

	    @Override
	    public void mouseReleased(MouseEvent arg0) {
	    }

	    @Override
	    public void mouseClicked(MouseEvent arg0) {
	    }

	    @Override
	    public void mouseEntered(MouseEvent arg0) {
	    }

	    @Override
	    public void actionPerformed(ActionEvent arg0) {
	    }

	    @Override
	    public void mouseExited(MouseEvent arg0) {
	    }

	    @Override
	    public void mousePressed(MouseEvent arg0) {
	    }

	    class PanelWejsciowy extends JPanel implements MouseListener {

	        private static final long serialVersionUID = 1L;
	        Graphics2D graphics2d;
	        Graphics2D graphics = null;
	        //File obrazWPliku;

	        public PanelWejsciowy() {
	            super();
	            addMouseListener(this);
	            repaint();
	        }
	        public void otworzObrazek(String sciezkaPliku) {
	            obrazWPliku = new File(sciezkaPliku);
	            try {
	                plikObrazu = ImageIO.read(obrazWPliku);
	            } catch (IOException ex) {
	                JOptionPane.showMessageDialog(this, "Nie mozna otworzyc pliku", "Blad!", JOptionPane.ERROR_MESSAGE);
	            }

	            graphics = plikObrazu.createGraphics();

	            // Wymiary domyslne :
	            poczatkowaWysokosc = plikObrazu.getHeight();
	            poczatkowaSzerokosc = plikObrazu.getWidth();

	            poleTekstoweWymiarX.setText(Integer.toString(poczatkowaSzerokosc));
	            poleTekstoweWymiarY.setText(Integer.toString(poczatkowaWysokosc));

	            repaint();
	        }                
		

	        public void paintComponent(Graphics g) {
	            super.paintComponent(g);

	            graphics2d = (Graphics2D) g;
	            graphics2d.drawImage(plikObrazu, null, 0, 0);


	        }
			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
	    }
 class PanelWyjsciowy extends JPanel implements MouseListener {

	            private static final long serialVersionUID = 1L;

	            public PanelWyjsciowy() {
	                addMouseListener(this);
	                repaint();
	            }

	            public void scale(int k1, int k2, Graphics G) {
	            	Graphics2D graphics2d = (Graphics2D) G;                         
	                graphics2d.drawImage(new BufferedImage(Integer.parseInt(poleTekstoweWymiarX.getText()), Integer.parseInt(poleTekstoweWymiarY.getText()), plikObrazu.getType()),
	                		null, 0, 0);
	        		int[][] colorsOriginal = returnImageColor(plikObrazu);
	        		int[][] interpolated = interpolate(colorsOriginal, k1, k2);
	        		plikObrazu2 = createImage(interpolated);
	        		graphics2d.drawImage(plikObrazu2, null, 0, 0);   
	        	}

	        	// zamiast dzialac na obrazie dzialasz na tablicy intow zawierajacych kolory
	        	public int[][] returnImageColor(BufferedImage plikObrazu) {
	        		int[][] out = new int[plikObrazu.getWidth()][plikObrazu.getHeight()];
	        		for(int i = 0; i < out.length; i++) {
	        			for(int j = 0; j < out[0].length; j++) {
	        				int f = plikObrazu.getRGB(i,j);
	        				//out[i][j] = in.getRGB(i, j);
	        				out[i][j] = f;
	        			}
	        		}
	        		return out;
	        	}
	        	// tablica wartosci rgb o wielkosci obrazu wejsciowego, k1 k2 wspolczynniki powiekszenia/pomniejszenia
	        	public  int[][] interpolate(int[][] in, int k1, int k2) {
	        		int[][] out = new int[(k1 * in.length)][(k2 * in[0].length)];
	        		double ratiox, ratioy;
	        		ratiox = (double)(in.length-1)/(out.length-1);
	        		ratioy = (double)(in[0].length-1)/(out[0].length-1);
	        		System.out.println("KaEla: " + ratiox + "x" + ratioy);
	        		// punkty pomiedzy
	        		double x, y;
	        		// alfa beta
	        		double a, b;
	        		// punkty z ktorych bedziemy brac
	        		int x0, x1, y0, y1,rgb2;
	        		//int A, B, C, D;
	        		Color A,B,C,D,rgb;
	        		double r3,g3,b3,r1,g1,b1,r2,g2,b2;
	        		for(int i = 0; i < out[0].length; i++) {
	        			for(int j = 0; j < out.length; j++) {
	        				x = j * ratiox;
	        				y = i * ratioy;
	        				x0 = (int)Math.floor(x);
	        				y0 = (int)Math.floor(y);
	        				x1 = x0 + 1;
	        				y1 = y0 + 1;
	        				a = x - x0;
	        				b = y - y0 ;
	        				// warunki graniczne
	        				if(x1 >= in.length) 
	        					x1 = in.length - 1;
	        				if(y1 >= in[0].length)
	        					y1 = in[0].length - 1;
	        				
	        				A = new Color(in[x0][y0]);
	        				B = new Color(in[x1][y0]);
	        				C = new Color(in[x0][y1]);
	        				D = new Color(in[x1][y1]);
	        				
	        				r1 = (1-a)*A.getRed() + a*B.getRed();
	        				r2 = (1-a)*C.getRed() + a*D.getRed();
	        				r3 = (1-b)*r1 + b*r2;
	        				
	        				g1 = (1-a)*A.getGreen() + a*B.getGreen();
	        				g2 = (1-a)*C.getGreen() + a*D.getGreen();
	        				g3 = (1-b)*g1 + b*g2;
	        				
	        				b1 = (1-a)*A.getBlue() + a*B.getBlue();
	        				b2 = (1-a)*C.getBlue() + a*D.getBlue();
	        				b3 = (1-b)*b1 + b*b2;
	        				
	        				rgb = new Color((int)r3,(int)g3,(int)b3);
	        				rgb2 = rgb.getRGB();
	        				out[j][i] = rgb2;
	        			}
	        		}
	        		return out;
	        	}
	        	
	        	public BufferedImage createImage(int[][] in) {
	        		BufferedImage out = new BufferedImage(in.length, in[0].length, BufferedImage.TYPE_INT_RGB);
	        		for(int i = 0; i < in.length; i++) {
	        			for(int j = 0; j < in[0].length; j++) {
	        				out.setRGB(i, j, in[i][j]);
	        			}
	        		}
	        		return out;
	        	}
	        
	public void zapiszObrazek(String sciezkaPliku) 
	{
	obrazWPliku = new File(sciezkaPliku);
	boolean poprawnie=false;
	
		try {
			ImageIO.write(plikObrazu2, "bmp", obrazWPliku);
			poprawnie=true;
			} 
	    catch (IOException ex) 
	    	{		        
	    	JOptionPane.showMessageDialog(null, "Nie mozna zapisac pliku", "Blad!", JOptionPane.ERROR_MESSAGE);
	    	}			
				    
	    if (poprawnie)
	    	JOptionPane.showMessageDialog(null, "Zapisano!");		    		    
	    
	}

    public void paintComponent(Graphics G) {
        super.paintComponent(G);

    }

    
	
	

    

	@Override
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
 }
 public static void main(String[] args) {
     new GrafikaZad2();
 }

	
	
}


 

Ciągle wyskakuja mi błedy Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
jednak nie moge sobie z tym poradzic od 5 dni ...
bardzo proszę o pomoc i z góry dziekuje

0

Możesz zwiększyć rozmiar sterty dostępny dla JVM (java -Xmsrozmiar GrafikaZad2), ale u Ciebie to nie pomoże. Błąd jest tu:

int[][] out = new int[(k1 * in.length)][(k2 * in[0].length)];

Otworzyłem obrazek o rozmiarze 19091273 i kliknąłem w przycisk Skaluj. Okazuje się, że tworzysz tablicę o rozmiarze 36442811620529, zatem potrzebujesz na nią
364428116205294 = 23 622 652 178 596 bajtów. Chyba nie masz tyle pamięci.

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