Farbwerte aus jpg auslesen

CarstenC

Grünschnabel
Hallo Leute!

Wär klasse, wenn ihr mir helfen könntet.

Ich habe zwei Probleme, die jedoch relativ ähnlich sind, bzw das Zweite auf dem Ersten aufbaut...

Ich möchte aus einem jpg punktweise die Farbwerte auslesen und in einer Textdatei zusammen mit den Koordinaten speichern.
(konkret habe ich ein Falschfarbenbild eines Gebietes und ich möchte den Farben wieder Messwerte zuordnen).

Das zweite Problem sieht folgendermassen aus:
Um die Besuchshäufigkeit bestimmter Punkte in einem Gebiet zu visualisieren, wird die Farbe dort bei jedem Besuch heller und das Bild schliesslich als jpg abgespeichert.
Ich möchte nun während der Laufzeit den Farbwert an einer beliebigen Koordinate des Bildes auslesen um so zur Laufzeit die Besuchshäufigkeit zu bestimmen.
Ein Problem hierbei dürfte sein, dass, wenn ich das Programm vor dem Ende abbreche, noch keine (jpg) Datei erzeugt ist.

Schönen Gruß und vielen Dank im Voraus!
Carsten
 
Hallo!

Dein erstes Problem könntest du folgendermaßen lösen:

Code:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class ImageExample extends JFrame {

	private ImageIcon icon;
	private JScrollPane scrollPane;
	private JPanel imagePanel;
	private JButton btnSave;
	private JProgressBar progressBar;

	private File outputFile;
	private int dUmMy= 0; //Feld heißt st atus ... die Boardsoftware macht daraus dUmMy ....

	private Thread imageProcessor;

	public ImageExample() {
		super("ImageExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		loadImage(new File("c:/jtable2.png"));
		createImagePanel();

		scrollPane = new JScrollPane();
		scrollPane.setPreferredSize(new Dimension(320, 240));
		scrollPane.setViewportView(imagePanel);
		getContentPane().add(scrollPane, BorderLayout.NORTH);

		btnSave = new JButton("Save");
		btnSave.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//System.out.println("save!");
				String str =
					JOptionPane.showInputDialog(
						(Component) e.getSource(),
						"Geben sie bitte den absoluten Pfad zu Zieldatei an!",
						"Ausgabepfad",
						JOptionPane.INFORMATION_MESSAGE);

				System.out.println(str);
				if (str != null) {

					outputFile = new File(str);
					createImageProcessor();
					imageProcessor.start();
				}

			}
		});
		getContentPane().add(btnSave, BorderLayout.CENTER);

		progressBar = new JProgressBar(0, 100);
		getContentPane().add(progressBar, BorderLayout.SOUTH);

		pack();

		setResizable(false);
		setVisible(true);
	}

	/**
	 * 
	 */
	private void createImageProcessor() {
		imageProcessor = new Thread() {
			public void run() {

				btnSave.setEnabled(false);
				int w = icon.getIconWidth();
				int h = icon.getIconHeight();
				BufferedImage bufImg =
					new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

				bufImg.getGraphics().drawImage(icon.getImage(), 0, 0, null);

				int[] pixels = null;

				pixels = bufImg.getRaster().getPixels(0, 0, w, h, pixels);
				int cnt = 0;
				int maxAdr = w * h;

				Runnable r = new Runnable() {
					public void run() {
						progressBar.setValue(status);
						progressBar.updateUI();
					}
				};

				try {
					BufferedWriter bw =
						new BufferedWriter(new FileWriter(outputFile));

					for (int x = 0; x < w; x++) {
						for (int y = 0; y < h; y++) {
							bw.write(x);
							bw.write(",");
							bw.write(y);
							bw.write(",");
							int adr = x * h + y;
							bw.write(pixels[adr]);
							bw.write("\r\n");
							cnt++;
							if ((cnt % 1000) == 0) {
								cnt = 0;
								status = (int) (100 * ((double) adr / maxAdr));
								SwingUtilities.invokeLater(r);
							}
						}
					}

					bw.flush();
					bw.close();

					JOptionPane.showMessageDialog(null, "Operation Beendet!");
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					btnSave.setEnabled(true);
				}
			}
		};

	}

	/**
	 * 
	 */
	private void createImagePanel() {
		imagePanel = new JPanel() {
			public void paintComponent(Graphics g) {
				g.drawImage(icon.getImage(), 0, 0, this);
			}
		};

		imagePanel.setPreferredSize(
			new Dimension(icon.getIconWidth(), icon.getIconHeight()));
	}

	/**
	 * @param file
	 */
	private void loadImage(File file) {
		try {
			icon = new ImageIcon(ImageIO.read(file));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

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

}

... für dein zweites Problem musst du dir schon selbst Gedanken machen ;-)

Gruß Tom
 
Zurück