Arrumar Código Java

18 respostas Resolvido
eclipse
Kassioburgadon

Bom dia Pessoal,

Queria fazer um ajuste nesse código, para explicar, ele lê a imagem no diretorio “file”
Icon pega altura e largura definida do usuario
e depois transforma em bufferedImage de novo.

Teria alguma forma de deixar mais rápido?
O que está em “*” onde fica mais lento

try {
	bufferedImage = ImageIO.read(file);
	
	**icon= new ImageIcon(bufferedImage.getScaledInstance(pwb,phb,Image.SCALE_SMOOTH));**
	bi = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(),BufferedImage.TYPE_INT_RGB);
	Graphics g = bi.createGraphics();
	
	icon.paintIcon(null, g, 0, 0);
	g.setColor(Color.WHITE);
	g.dispose();
} catch (Exception e2) {
	// TODO: handle exception
}

18 Respostas

Lucas_Camara

Posta o código do método newImageIcon pra gente ver.

Kassioburgadon
public void capturarImagem(int i) {
	file= new File("Project/" + lblNewLabel_2.getText() + "/img/" + comboBox_2.getItemAt(i));
	
	lblNewLabel_2.getText() = Pasta do projeto 
	comboBox_2.getItemAt(i) = Nome do arquivo "img.jpeg"
}

ai por diante é o mesmo código

try {
	bufferedImage = ImageIO.read(file);
	// ...
Lucas_Camara

Precisamos do código do método newImageIcon.

Kassioburgadon

Ele é do próprio Java,
ele pega a Imagem capturada pelo o bufferedImage

Lucas_Camara

Ah sim. É que estava tudo junto newImageIcon, por isso achei que era um método.

Então, essa lentidão, vai depender do tamanho da imagem que vc está lendo.

Kassioburgadon

Tem alguma forma para ser realizado via Html?

int altura = 500;
int largura = 500;
String x = "<html><img src=\"file:"+file.toString()+"\" width="+largura+" height="+altura+">";
lblNewLabel.setText(x);

Dessa forma o processo é rapido.
Em vez de ele setar Imagem ou Icone, ele joga o script

Lucas_Camara

Vi essa outra forma de fazer: https://stackoverflow.com/a/4216635. Faz um teste para ver como fica.

Só pra entender melhor, o que é exatamente essa funcionalidade?

Kassioburgadon

Ele pega a imagem do arquivo, e meio que corta a imagem para pegar o código de barra, Qr Code e OCR, quando ele encontrar o arquivo ele usa a função de baixo.

Nesse caso de eu ter 10.000 imagens ele irá cortar todas elas para ser salvo os itens em uma pasta, e meio difiicl de explicar pq o código é grande

getBar(comboBox_2.getItemAt(i), label_bar, label_bar2, bi, bar[0], bar[1], bar[2], bar[3], op);

public void getBar(String Arquivo, JLabel label, JLabel label2,
			BufferedImage image, int x, int y, int w, int h, int imagem2)
			throws NotFoundException, ChecksumException, FormatException,
			IOException {

		try {

			image = this.bi;
			File file = null;
			image = image.getSubimage(x, y, w, h);
			Graphics graphics = image.getGraphics();
			graphics.dispose();
			ImageIcon Img = new ImageIcon(image);
			Img = new ImageIcon(Img.getImage().getScaledInstance(
					label.getWidth(), label.getHeight(), Image.SCALE_SMOOTH));
			Arquivo = Arquivo.substring(0, Arquivo.length() - 4);
		//	String xx;

			if (label == label_bar) {
				file = new File("Project\\" + lblNewLabel_2.getText()
						+ "\\bar\\" + Arquivo + "Barcode.png");
				ImageIO.write(image, "png", file);
				if (imagem2 == 1) {
					
					//label.setText(xx);
					label.setIcon(Img);
					// label2.setText("");
					label2.setText(agassys.barcode.Barcode(image));
				}
				if (imagem2 == 0) {
					table.setValueAt(agassys.barcode.Barcode(image),
							comboBox_2.getItemCount() - (arquivo + 1), 2);

				}

			}
			if (label == label_qr) {
				file = new File("Project\\" + lblNewLabel_2.getText()
						+ "\\qrcode\\" + Arquivo + "Qrcode.png");
				ImageIO.write(image, "png", file);
				if (imagem2 == 1) {
					label.setIcon(Img);
					//label.setText(xx);
					// label2.setText("");
					label2.setText(agassys.barcode.QrCode(image));
				}
				if (imagem2 == 0) {
					table.setValueAt(agassys.barcode.QrCode(image),
							comboBox_2.getItemCount() - (arquivoq + 1), 1);
				}

			}
			if (label == label_ocr) {
				file = new File("Project\\" + lblNewLabel_2.getText()
						+ "\\ocr\\" + Arquivo + "Ocrcode.png");
				ImageIO.write(image, "png", file);
				if (imagem2 == 1) {
					//label.setText(xx);
					label.setIcon(Img);
					// label2.setText("");

					label2.setText(getOcr(file));
				}
				if (imagem2 == 0) {
					table.setValueAt(getOcr(file), comboBox_2.getItemCount()
							- (arquivoo + 1), 3);
				}

			}
		} catch (Exception e) {
			// TODO: handle exception
			// //system.out.println(e);
			label2.setText("Não Encontrado");
			erro = erro + 1;
		}

		// return agassys.barcode.Todos(image);
	}
Lucas_Camara

Entendi a preocupação com a lentidão. Então isso irá processar várias imagens de uma vez, certo?

Kassioburgadon

Exato, entrará em um for pela quantidade de arquivos

Para ter uma ideia

Lucas_Camara

O que vc pode fazer é paralelizar esse for. Com java 8 dá para fazer algo assim:

ForkJoinPool customThreadPool = new ForkJoinPool(10);
customThreadPool.submit(() -> {
	listFiles.parallelStream().forEach(f -> {
		// seu código aqui
	});
}).get();

Isso irá distribuir a execução em threads.

darlan_machado

Quanto tempo leva para processar cada imagem?

Kassioburgadon

Irei analisar e posto a resposta

Kassioburgadon

Depende da Imagem, quando é 200 dpi ele é bem rápido, chega ser melhor de 0,5 por imagem,

Quando começa a ser 350 dpi + chega a ser 1,5 segundos

Kassioburgadon

Será que o conceito que informou dará o mesmo resultado que esse?

Eu tinha realizado a separação por Thread,

Então ele irá processar os 3 simultaneamente

if (BarcodeButton.isEnabled() && checkb.isSelected()) {
									new Thread() {
										public void run() {
											int i3 = 0;

											for (i3 = 0; i3 < comboBox_2
													.getItemCount(); i3++) {
												try {

													capturarImagem(i3);
													getBarcodeProgress(0, i3);
													arquivo = arquivo + 1;

												} catch (Exception e2) {
													// TODO: handle exception
												}

											}
											arquivo = 0;
										}
									}.start();
								}

								if (QrcodeCapture.isEnabled() && chckbq.isSelected()) {
									new Thread() {
										public void run() {
											int i3 = 0;

											for (i3 = 0; i3 < comboBox_2
													.getItemCount(); i3++) {
												try {

													capturarImagem(i3);

													getqrProcess(0, i3);

													arquivoq = arquivoq + 1;

												} catch (Exception e2) {
													// TODO: handle exception
												}

											}
											arquivoq = 0;
										}
									}.start();
								}

								if (OcrCapture.isEnabled() && checo.isSelected()) {
									new Thread() {
										public void run() {
											int i3 = 0;

											for (i3 = 0; i3 < comboBox_2
													.getItemCount(); i3++) {
												try {

													capturarImagem(i3);

													getOcrProcess(0, i3);
													arquivoo = arquivoo + 1;

												} catch (Exception e2) {
													// TODO: handle exception
												}

											}
											arquivoo = 0;
										}
									}.start();
								}
darlan_machado

Cara, se for no melhor caso, todas as imagens (10 mil) serão processadas em 5000 segundos, o que já é muito tempo.
No pior caso, você triplica isso…
Nunca trabalhei com imagens no java.

K
Solucao aceita

Tentou usar Image.SCALE_FAST?

Se você está reduzindo de tamanho pode ser que não precise interpolação bilinear etc e tal.

Kassioburgadon

Utilizei o modo fast e deu uma melhora,

acho que já é o suficiente obrigado

Criado 22 de fevereiro de 2019
Ultima resposta 25 de fev. de 2019
Respostas 18
Participantes 4