Tenho um codigo que faz o seguinte, ele pega a imagem da webcam e coloca em um JLabel, e após isso ele manda para outro jPanel em outro Jlabel que salva como imagem, ao salvar ele reduz consideravelmente a qualidade da imagem que foi capturada. gostaria de saber como é possível melhorar isso. segue código:
Este é o comando para pegar a imagem da camera e colocar no jlabel:
FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
Buffer buffer = fgc.grabFrame();
BufferToImage bti = new BufferToImage((VideoFormat) buffer.getFormat());
Image image = bti.createImage(buffer);
BufferedImage imageresize = new BufferedImage(330, 280, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = imageresize.createGraphics();
g2d.setComposite(AlphaComposite.Src);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawImage(image, 0, 0, 330, 280, null);
g2d.dispose();
this.setImageButton(this.lbfoto1, imageresize);
Este comando é para mandar a foto que esta no jlabel para outro jpanel onde vai para um jlabel:
foo.getLbfotoo1().setIcon(lbfoto1.getIcon());
esse comando é o que salva a o jframe como uma imagem para após imprimir:
public static BufferedImage getScreenShot(Component componente) {
BufferedImage image = new BufferedImage(componente.getWidth(), componente.getHeight(), BufferedImage.TYPE_INT_RGB);
componente.paint(image.getGraphics());
Graphics graphics = image.getGraphics();
componente.printAll(graphics);
graphics.dispose();
return image;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//pega a imagem de buffer e salva no caminho especifico
public static void SaveScreenShot(Component componente, String filename) throws Exception {
int cont = 1;
BufferedImage img = getScreenShot(componente);
//verifica se tem imagem no caminho abaixo
File file = new File("C:\\imagens\\Fotos\\" + filename + cont + ".png");
// se existe, soma mais um e salva uma nova imagem
while (file.exists()) {
cont++;
file = new File("C:\\imagens\\Fotos\\" + filename + cont + ".png");
}
//se nao existir
if (!file.exists()) {
//JOptionPane.showMessageDialog(componente, "foto nao existe,copiando");
ImageIO.write(img, "png", file);
}
}
Este comando é o que imprime a imagem ja salva:
public PrintImage() {
////busca no diretório abaixo a foto;
String diretorio = "C:\\imagens\\Fotos\\";
File file = new File(diretorio);
File afile[] = file.listFiles();
File rootDirectory = new File(diretorio);
Integer totalFiles = rootDirectory.listFiles().length;
File lastFile = new File("Fotografia modelo 1 - " + totalFiles + ".png");
System.out.println(lastFile.getName());
//////////////////////////////////////////////////////////////////////////////
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
pras.add(MediaSizeName.JAPANESE_POSTCARD);
// pras.add(OrientationRequested.PORTRAIT);
pras.add(new Copies(1));
PrintService pss[] = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.PNG, pras);
if (pss.length == 0) {
JOptionPane pane_foto = new JOptionPane("Erro Ao Imprimir, Verifique Impressora");
final JDialog dialog_foto = pane_foto.createDialog(null, "Cabine Fotográfica");
Timer timer_foto = new Timer(2000,
new ActionListener() {
public void actionPerformed(ActionEvent evt) {
dialog_foto.dispose();
}
});
timer_foto.setRepeats(false);
timer_foto.start();
dialog_foto.show();
dialog_foto.setUndecorated(false);
timer_foto.stop();
System.exit(0);
}
if (pss.length != 0) {
PrintService ps = pss[0];
System.out.print("Imprimindo na impressora: \n" + ps);
DocPrintJob job = ps.createPrintJob();
FileInputStream fin = null;
try {
fin = new FileInputStream(diretorio + lastFile.getName());
} catch (FileNotFoundException ex) {
new arquivoLog("Erro FileNotFoundException: " + ex +" Arquivo não encontrado");
JOptionPane pane_foto = new JOptionPane("O sistema não pode encontrar o arquivo especificado, Verifique!");
final JDialog dialog_foto = pane_foto.createDialog(null, "Cabine Fotográfica");
Timer timer_foto = new Timer(2000,
new ActionListener() {
public void actionPerformed(ActionEvent evt) {
dialog_foto.dispose();
}
});
timer_foto.setRepeats(false);
timer_foto.start();
dialog_foto.show();
dialog_foto.setUndecorated(false);
timer_foto.stop();
}
Doc doc = new SimpleDoc(fin, DocFlavor.INPUT_STREAM.PNG, null);
try {
job.print(doc, pras);
} catch (PrintException ex) {
new arquivoLog("Erro PrintException: " + ex+ " Impressora não encontrada!");
JOptionPane.showMessageDialog(null, "Impressora não encontrada!");
}
try {
//Thread.sleep(1000);
fin.close();
} catch (IOException ex) {
new arquivoLog("Erro IOException: " + ex);
JOptionPane.showMessageDialog(null, "Ocorreu um Erro, entre em contato com o suporte!");
}
}
}
Porém ao renderizar a imagem ela perde qualidade e tamanho em mb, como posso fazer a substituição da biblioteca?
eu transfiro de um frame para outro pois ele faz mais de uma captura da webcam, ai ele salva em um outro jframe, que terá um fundo e na frente as imagens capturadas da webcam, e dps de elas estarem capturadas ele salva como imagem e manda imprimir.
o problema esta na hora que eu transfiro para outro jframe eu acho, pois ali que esta o buffer, mas não sei como resolver.
este sistema uso para cabine de fotos. mas preciso melhorar a foto que é salva pois na impressão é notavel a diferença.