Arrumar Código Java

18 respostas Resolvido
eclipse
K

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

L

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

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

Precisamos do código do método newImageIcon.

K

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

L

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.

K

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

L

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?

K

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

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

K

Exato, entrará em um for pela quantidade de arquivos

Para ter uma ideia

L

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.

D

Quanto tempo leva para processar cada imagem?

K

Irei analisar e posto a resposta

K

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

K

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

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.

K

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