Gerar miniatura

Olá pessoal, tudo bom?
Estou desenvolvendo um programa que realiza animações com sequencia de desenhos.
Eu gostaria de implementar o seguinte recurso: tenho um painel no centro onde o usuário desenha as figuras e queria que na barra de ferramentas na parte inferior da tela fosse criada uma miniatura dos desenhos que faço no painel principal.
Alguem ja trabalhou ou desenvolveu esse tipo de ferramenta? Gostaria que vocês me ajudassem com sugestões de como solucionar esse problema.

A lógica parece ser simples: basta eu criar uma cópia da área de desenho e redimensiona-la para mostrar na barra inferior, mas não consegui redimensionar corretamente.

Desde já, grato.

Até mais.

Então cara, to ligado que tem como tu obter a imagem de um painel, porém não sei de cabeça (nada que o google não saiba), porém para redimensionar imagem eu tenho aqui um método que faz certinho.

[code]public static Image applyScale(final ImageIcon img, final int width, final int height, final int hint) {
final int proportionalWidth;
final int proportionalHeight;

	final double containerRate = height / (double) width;
	final double imgRate = img.getIconHeight() / (double) img.getIconWidth();
	if (imgRate > containerRate) {
		proportionalWidth = -1;
		proportionalHeight = height;
	} else {
		proportionalWidth = width;
		proportionalHeight = -1;
	}

	return img.getImage().getScaledInstance(proportionalWidth, proportionalHeight, hint);
}[/code]

ps: hint tu pode usar

  • @see java.awt.Image#SCALE_DEFAULT
  • @see java.awt.Image#SCALE_FAST
  • @see java.awt.Image#SCALE_SMOOTH
  • @see java.awt.Image#SCALE_REPLICATE
  • @see java.awt.Image#SCALE_AREA_AVERAGING

Cara, valeu pela ajuda…tb iria precisar redimensionar imagens…
vou pesquisar aqui tb como gerar uma cópia do painel…se eu conseguir eu coloco a solução aqui…

se alguem souber tb e poder compatilhar, eu ficaria grato…

vlw…

até mais

Mas qual é a classe desse painel? É uma classe do tipo Graphics2D?

pelo que eu vejo vc esta querendo fazer algo que nem o movie maker, adobe premier e coisa do genero… so posso dizer uma coisa… tu vai sofrer pra fazer algo assim… não é tão simples como pensa…

É a classe JPanel…tenho um panel onde fica como área de desenho…

e o usuário pode desenhar figuras…até ai tudo bem…

oque eu quero fazer eh gerar uma cópia dessa área de desenho e mostrar na parte inferior da janela mas numa resolução menor (miniatura) .

cara para este tipo de coisa é melhor vc fazer em C

até gostaria amigo de fazer em C…mas eh um trabalho da faculdade…eh obrigatório desenvolver em java … mas eh bom para adquirir conhecimentos na parte gráfica do java.

Acho que você pode usar o seguinte método:
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Component.html#createImage(int,%20int)

Bom amigo, pelo oque eu entendi, este método ele cria uma imagem… mas ele gera uma copia do conteudo corrente que esta dentro do JPanel?

Estou sem a possibilidade de testar no momento porq estou num pc sem java

Até mais.

É, realmente esse método não funciona do jeito que esperava.

Mas fiz outro teste que funcionou, utilizando também o método que silveta enviou, além de uns outros “truques”. :smiley:

Depois roda na sua máquina pra testar!

[]s

[code]package br.com.teste;

import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

public class CopyWindowContents {
private JFrame window;
JPanel mainPanel;
private SortedMap<String, Component> components;
private Map<String, MouseListener> listeners;

public CopyWindowContents() {
	window = new JFrame("Janela");
	components = new TreeMap<String, Component>();
	listeners = new HashMap<String, MouseListener>();

	mainPanel = new JPanel();
	components.put("component", new JLabel("Esse texto vai ser copiado"));
	components.put("button", new JButton("Copiar"));
	for (Component component : components.values()) {
		mainPanel.add(component);
	}

	mainPanel.setLayout(new GridLayout(2, 2));
	window.setContentPane(mainPanel);

	listeners.put("buttonListener", new MouseAdapter() {
		private int currentCopy = 1;
		
		@Override
		public void mouseClicked(MouseEvent e) {
			super.mouseClicked(e);
			int iWidth = mainPanel.getPreferredSize().width;
			int iHeight = mainPanel.getPreferredSize().height;

			Image bi = getPanelCopy(iWidth, iHeight);

			JLabel copyComponent = new JLabel(new ImageIcon(applyScale(bi,iWidth/2,iHeight/2,Image.SCALE_SMOOTH)));
			copyComponent.setBorder(new BevelBorder(BevelBorder.RAISED));
			components.put("newCopy"+currentCopy, copyComponent);
			mainPanel.add(copyComponent);
			currentCopy++;

			mainPanel.repaint();
			window.pack();
		}
	});

	components.get("button").addMouseListener(
			listeners.get("buttonListener"));

	window.setBounds(100, 100, 200, 500);
	window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	window.pack();
	window.setVisible(true);
}

public Image getPanelCopy(int iWidth, int iHeight){
	BufferedImage bi = new BufferedImage(iWidth, iHeight,
			BufferedImage.TYPE_INT_RGB);
	mainPanel.paint(bi.getGraphics());
	return bi;
}

public static Image applyScale(final Image img, final int width,
		final int height, final int hint) {
	final int proportionalWidth;
	final int proportionalHeight;

	img.getHeight(null);
	final double containerRate = height / (double) width;
	final double imgRate = img.getHeight(null)
			/ (double) img.getHeight(null);
	if (imgRate > containerRate) {
		proportionalWidth = -1;
		proportionalHeight = height;
	} else {
		proportionalWidth = width;
		proportionalHeight = -1;
	}

	return img.getScaledInstance(proportionalWidth,
			proportionalHeight, hint);
}

public static void main(String[] args) {
	new CopyWindowContents();
}

}
[/code]

Olá amigo, instalei o eclipse que vem com o jdk embutido e testei e realmente funcionou…

muito obrigado pela ajuda, quando terminar de desenvolver o programa eu posto ele aqui para vc’s verem.

obrigado a todos que me ajudaram.