Arrumar Código Java

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
}

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

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);
	// ...

Precisamos do código do método newImageIcon.

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

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.

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

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?

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);
	}

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

Exato, entrará em um for pela quantidade de arquivos

Para ter uma ideia

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.

Quanto tempo leva para processar cada imagem?

Irei analisar e posto a resposta

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

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();
								}

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.

Tentou usar Image.SCALE_FAST?

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

Utilizei o modo fast e deu uma melhora,

acho que já é o suficiente obrigado