# Wie binde ich Fit Datei ein****



## Eklaf (7. August 2010)

Hi alle ich hätte da mal ne frage 

Ich muß ein Programm schreiben das Fit dateien lädt und sie darstellt.

Fit Dateien sind rohe bild Dateien und ich hab keine ahnung wie ich die in ein Panel oder sonst was bekomme auseredem muß ich die Konstanten aus der Datei auslesen wenn ich einen Hex Editor nutze seh ich die Konstanten hab aber keine Ahnung wie ich die heraus bekomme wenn ich nen Button drücke.

Bei den Anhängen ist ein Beispielbild zum Testen und verstehen.

Bin für Vorschläge offen


----------



## mccae (7. August 2010)

Huhu,

Na ja, zuallerst würde ich schauen, ob es bereits eine Java Library gibt, die diese Dateien ausliest. (FIT Dateien kenne ich nicht, mir sind nur FITS Dateien geläufig).

Wenn du das Rad doch neu erfinden musst, dann würde ich mir die Spezifikation zum Dateityp ansehen, lesen und verstehen.

Danach kannst du einen eigenen Reader schreiben.

Gruß,
Martin


----------



## Eklaf (10. August 2010)

Hast recht sind FITS Dateien mein  Fehler wie bringe ich die in ein Panel und wie bekomme ich die Daten aus dem Header?

Bin für jede Hilfe dankbar 

Gruß, Bernd


----------



## RoCMe (10. August 2010)

Hallo!

Die magischen Worte "java" und "fits" bei google, führte hierhin:

http://fits.gsfc.nasa.gov/fits_libraries.html

*denk* NASA? *öhm* Na dann...



> Java
> nom.tam.fits classes
> 
> A Java FITS library has been developed which provides efficient -- at least for Java -- I/O for FITS images and binary tables. The Java libraries support all basic FITS formats and gzip compressed files. Support for access to data subsets is included and the HIERARCH convention may be used.
> ...


----------



## Eklaf (20. August 2010)

Okay ich hab das durchgelesen und paar sachen versucht bekomme es aber nicht zum laufen mache das zu kurz kann mir ev wer helfen? Will das bei klick eines Buttons die Fits datei in ein panel eingefügt wird und der Header ausgelesen wir


----------



## Eklaf (5. September 2010)

Also die Sommerferien sind so gut wie rum und ich bin noch immer nicht weiter kann mir denn keiner helfen ich hab mir das Programm nochmal angeschaut aber ich bekomme das nicht hin das ich bei klick eines Buttons das FITS Bild in ein Panel einfüge wenn mir jemand weiterhilft wäre ich echt sehr dankbar.


----------



## RoCMe (10. September 2010)

Hi!

Etwas mehr Eigeninitiative ist hier schon gefragt... Was genau hast du denn ausprobiert, und woran hakt es? Fehlermeldung? Ist- und Soll-Verhalten?

Dir wird hier keiner einfach so ein Programm schreiben. Bei konkreten Problemen helfen wir aber gerne...


----------



## Eklaf (12. September 2010)

Okay stimmt hab zuwenig infos gegeben mein Fehler sry

1. Meine Pogrammierkenntnisse umfassen das programmieren von schleifen und widgets mehr leider noch nicht. Leider kann ich API noch garnicht nutzen da wir das noch nicht durchgenommen haben aber ich lese gerade das Buch "Java von kopf bis Fuß" aber wenn wer noch vorschläge hat bin für alles dankbar.

2. was ich versucht habe: Ich habe versucht das Programm zum laufen zu bringen.

kommen wir zu meinen Problemen dabei ich markiere die farbig.

Bei dem rot markierten wir ein Fits Objekt erzeugt wenn ich das richtig verstehe und ich bekomme das nicht hin das an der Stelle eine Fits Datei erzeugt bzw geladen wird.

Bei dem gelb markierten wird der Header ausgelesen aber auch das bekomm ich ich nicht hin da ich kein bezug zu dem bild erzeugen kann und keine Ahnung habe wie ich die einzelnen Daten herausbekomme.



> /*
> * @(#)ReadFits.java   $Revision: 1.5 $  $Date: 2007-01-04 09:32:23 $
> *
> * Copyright (C) 1999 European Southern Observatory
> ...


----------



## Franz Degenhardt (14. September 2010)

Mit API arbeiten tut man eigentlich die ganze Zeit, mit einer fremden API zu arbeiten ist da nicht viel anders.


```
FitsFile file = null;
for (int na=0; na<argv.length; na++) {
try {
file = new FitsFile(argv[na]);
```
In den markierten Zeilen geht es um folgendes:
Erzeugen eines FitsFile-Objektes mit dem Konstruktor, der einen String - vermutlich der Dateiname der der Fitsdatei - entgegennimmt.
Dieses Objekt kann dann schon einiges in Richtung Fits. Was genau verrät die API. 

Ich würde mir zum Anfangen ein paar Testmethoden bauen, die ohne gui einfach die Fitsdatei parsen und mit den Fits Objekten rumspielen.
Und keine Angst vor fremden APIs haben, alleine mithilfe des Contentassistent (strg+Leertaste in den meisten IDEs) und sprechenden Methodennamen kann man meist in fremden APIs arbeiten ohne gross zu lesen.


----------



## Eklaf (14. September 2010)

habe das jetzt mal versucht aber ich kapiers nicht

zuerst der button klick da erzeuge ich ein objekt und eine referenz auf ein Unterprogramm wo das bild dann gelade werden soll und zurück gegeben wird und dann in das label eingefügt wird er mosert aber an den roten stellen was auch verständlich ist da ich keine ahnung habe wie ich das deklarieren soll.


```
public void actionPerformed(ActionEvent e)
    {
        if (e.getSource()== menueDateiBildLaden)
        {
            Unterklassen.Fits fits =new Unterklassen.Fits();
            FitsBild=fits.laden();
            lblBild.add(FitsBild);
        }}
```

und hier ist das Unterprogramm:
auch hier mosert er an den rotmarkierten stellen warum er bei dem Dateinamen mosert verstehe ich nicht hab es auch mit dem gesamten pfad versucht aber auch das mag er nicht.
beim return mosert er vermutlich da ich die class als void gemacht habe aber hab keine ahnung was ich der sonst für nen wert geben soll?


```
package Unterklassen;

public class Fits 
{
	public void laden()
	{
		Fits f = new Fits(m45_0488.fit);
		return f;
	}
}
```


----------



## Franz Degenhardt (14. September 2010)

Habe gerade mal in die fits libs reingeschaut, jfits ist mir vom Namen her am sympatischsten.
Die Javadoc dazu gibt es hier: http://www.hq.eso.org/~pgrosbol/fits_java/docs/org/eso/fits/FitsFile.html.
Wie vermutet kann man den Konstruktor mit einem String, der einen Pfad + Dateinamen in Javaschreibweise enthält, verwenden.


```
public class Fits 
{
    public FitsFile laden()
    {
        String fitsdatei = "c:/folder/m45_0488.fit";
        FitsFile f = new FitsFile(fitsdatei);
        return f;
    }
}
```

Um obigen Code zu testen, würde ich mir eine Testklasse anlegen, die ohne gui oder sonstiges genau die Methode aufruft und die Funktionalität überprüft, z.B. ob das zurückgegebene FitsFile Objekt in Ordnung ist.
Ist dies mit der Testklasse sichergestellt, kann man einen Schritt weiter gehen. FitsFile kann noch nicht besonders viel. Ohne zu wissen was fits ist, scheint die Methode getHDUnit am funktionalsten zu sein (der auskommentierte code von dir geht auch in die Richtung HDUnit dann über die Header). 
Irgendwann soll etwas mit einem Bild passieren. Den Weg durch die API von FitsFile bis zu einem Bildobjekt würde ich komplett in Testmethoden nachvollziehen, bei denen man sich in kurzen trial and error zyklen Stück für Stück durch die API durchkämpft.

Hast du ein ordentliches IDE für Java?

edit: compiler fehler ausgemertzt, habe gerade kein ide zur hand.


----------



## Eklaf (23. September 2010)

Ich programmiere mit eclipse und einer Jigloo erweiterung die ich aber nicht viel nutze da ich sie nicht so gut finde oder was meinst du mit IDE?

hab das Programm mal in einer extra classe versucht weiß aber nicht so recht was ich da für ein Paket importieren soll drum geht es noch nicht


----------



## Franz Degenhardt (23. September 2010)

Eclipse ist ein gutes IDE (Integrated development environment).
Bei der Arbeit mit externen Bibliotheken wie jfits läd man sich die entsprechenden Bibliotheken herunter und legt sie lokal ab, z.B. in einem Ordner 'lib' innerhalb deines Eclipseprojektes oder irgendwo auf der Platte. Dann fügt man die Bibliothek dem Projekt als Java-Bibliothek hinzu, rechtsklick auf Projekt -> buildpath (ich betreibe alle Programme die mit entwickeln zu tun haben auf englisch, da die deutsche Übersetztung meist irreführend ist).

Anschliessend fügt man benötigte Importstatements entweder per ctrl-shift-o hinzu oder mit ctrl-shift-m während man eins der neuen Objekte selektiert hat. 

Alternativ rtfm der neuen Bibliothek. Oder starten mit einem einfachen fertigen Beispiel dort stehen die Imports schon drinn.


----------



## Franz Degenhardt (23. September 2010)

jfits lib-jar: http://www.hq.eso.org/~pgrosbol/fits_java/jfits-0.94.jar
Testdatei: http://www.hq.eso.org/~pgrosbol/fits_java/TestFits.java
How add jar in eclipse: http://www.wikihow.com/Add-JARs-to-Project-Build-Paths-in-Eclipse-(Java)

Ausgabe für deine fits-Datei:

```
-- Test FITS files --------
FITS file has 1 HDUnits
  0: >NONE< of type >Image< with 22 keywords and 30308580 bytes of data
   Keywords:
     SIMPLE(B)= true
     BITPIX(I)= 16
     NAXIS(I)= 2
     NAXIS1(I)= 4770
     NAXIS2(I)= 3177
     MIPS-HI(I)= 15763
     MIPS-LO(I)= 0
     MIPS-X1(I)= 0
     MIPS-Y1(I)= 0
     MIPS-X2(I)= 0
     MIPS-Y2(I)= 0
     MIPS-BIX(I)= 1
     MIPS-BIY(I)= 1
     MIPS-CCD(I)= 0
     MIPS-FL(I)= 0
     MIPS-SX(I)= 4770
     MIPS-SY(I)= 3177
     MIPS-NOR(R)= 1.0
     MIPS-CST(R)= 0.0
     DATE-OBS(D)= 2010-01-03T00:00:00
     UT-START(S)= '22:53:36'
     EXPTIME(R)= 20.0

  Check data matrix - compute mean and rms
  Dimension of matrix: 2
   Axis 0: 4770,  0.0,  0.0,  1.0
   Axis 1: 3177,  0.0,  0.0,  1.0


 Npixel,row,col: 15154290, 3177, 4770
  Mean: 1133.8451, rms: 190.09262, Time: 0.11422508 S/Mp, Pixels: 15154290
-- Test finished -----------------
```


----------



## Eklaf (4. Oktober 2010)

Erstmal möchte ich danke sagen die beschreibungen haben mir weitergeholfen ich hab die Bibliothek implementiert und seit dem zeigt es mir in der TestFits auch keine Fehler mehr an allerdings habe ich keine ahnung wie ich das TestFits auf die Datei verweise.

Bekomme die Fehlermeldung 

```
Error: must have at least one argument
```


----------



## Franz Degenhardt (7. Oktober 2010)

Freut mich, dass du weitergekommen bist. 
In Eclipse kann man den Run-Dialog noch konfigurieren um dort z.b. Kommandozeilenargumente zu übergeben. Screenshots erklären das am besten finde ich: http://www.cs.colostate.edu/helpdocs/eclipseCommLineArgs.html

Die Fehlermeldung die du siehst, wird in der Mainmethode erzeugt, für den Fall, dass keine Argumente übergeben werden. Das Codestück kannst du ja mal näher begutachten.

TestFits sieht vor, den Pfad zu der Fitdatei als Parameter zu übergeben. In der Mainmethode wird der Wert dann entgegengenommen und verwendet. D.h. dort kannst du natürlich dann eingreifen und den Wert anderswo herholen, hart kodieren, configdatei oä.

edit:
im rundialog zu konfigurierender Wert(in Windows Slash statt Backslash verwenden):

c:/meinOrdner/meineFitsdatei.txt


----------



## Eklaf (14. Februar 2011)

Hallo nochmal ich muß dieses Thema leider nochmal aufgreifen.

Ich bekomme das Bild nicht angezeigt in meinem Programm


```
package Oberfaechen;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.*;

import java.io.File;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

import org.eso.fits.FitsTestHDU;

import Hilfsklassen.*;


public class OberflaecheMain extends JFrame implements ActionListener,MouseListener
{
	int iXPos=0, iYPos=0;
	
	
	private JFrame mainFrame;
	private JPanel pnlMain,pnlPos,pnlBild;
	private JMenuBar menueLeiste;
	private JMenu menueDatei,menueAusgleichsrechnung,menueHilfe;
	private JMenuItem menueHilfeDokumentation,menueHilfeInfo,menueARDrucken,menueARLaden,menueARSpeichern,menueARStarten,
			menueProgBeenden,menueBildLaden;
	private JLabel lblXPos,lblYPos,lblLeer;
	
	DateiLaden dateiLaden=new DateiLaden();
	FitsTestHDU fitsTest =new  FitsTestHDU();
	File fileDateiPfad;
//	ImageDisplay display;
	

public void los()
{
	try 
	{
	mainFrame=new JFrame("Astronomie Software");
	mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	
	menueLeiste=new JMenuBar();
	mainFrame.getContentPane().add(BorderLayout.NORTH,menueLeiste);
	
		menueDatei=new JMenu("Datei");
		menueLeiste.add(menueDatei);
		
			menueBildLaden=new JMenuItem("Bild laden");
			menueDatei.add(menueBildLaden);
			menueBildLaden.addActionListener(this);
			
			menueProgBeenden=new JMenuItem("Programm beenden");
			menueDatei.add(menueProgBeenden);
			menueProgBeenden.addActionListener(this);
		
		menueAusgleichsrechnung=new JMenu("Ausgleichsrechnung");
		menueLeiste.add(menueAusgleichsrechnung);
		
			menueARStarten=new JMenuItem("Ausgleichsrechnung starten");
			menueAusgleichsrechnung.add(menueARStarten);
			menueARStarten.addActionListener(this);
			
			menueARSpeichern=new JMenuItem("Ausgleichsrechnung speichern");
			menueAusgleichsrechnung.add(menueARSpeichern);
			menueARSpeichern.addActionListener(this);
			
			menueARLaden=new JMenuItem("Ausgleichsrechnung laden");
			menueAusgleichsrechnung.add(menueARLaden);
			menueARLaden.addActionListener(this);
			
			menueARDrucken=new JMenuItem("Ausgleichsrechnung drucken");
			menueAusgleichsrechnung.add(menueARDrucken);
			menueARDrucken.addActionListener(this);
			
		menueHilfe=new JMenu("Hilfe");
		menueLeiste.add(menueHilfe);
			
			menueHilfeInfo=new JMenuItem("Info");
			menueHilfe.add(menueHilfeInfo);
			menueHilfeInfo.addActionListener(this);
			
			menueHilfeDokumentation=new JMenuItem("Dokumentation");
			menueHilfe.add(menueHilfeDokumentation);
			menueHilfeDokumentation.addActionListener(this);
			
	pnlMain=new JPanel();
	pnlMain.setLayout(new BoxLayout(pnlMain, BoxLayout.Y_AXIS));
	
	pnlPos=new JPanel();
	pnlPos.setLayout(new BoxLayout(pnlPos, BoxLayout.X_AXIS));
	
		lblXPos= new JLabel("X Position: "+iXPos);
		lblXPos.setSize(200, 20);
		
		lblLeer=new JLabel("          ");
		
		lblYPos=new JLabel("Y Position: "+iYPos);
		lblYPos.setSize(200, 20);
		
		pnlPos.add(lblXPos);
		pnlPos.add(lblLeer);
		pnlPos.add(lblYPos);
		
	//display = new ImageDisplay();
	pnlBild=new JPanel();
	pnlBild.setSize(600, 400);
	pnlBild.setBackground(Color.blue);
	//pnlBild.addMouseListener(this);	
	
	pnlMain.add(pnlPos);
	pnlMain.add(pnlBild);
	
	mainFrame.getContentPane().add(BorderLayout.CENTER,pnlMain);
	
	mainFrame.setSize(1024, 768);
	mainFrame.setVisible(true);
	}
	catch(Exception e)
	{
		System.out.println("Fehler: "+e.getMessage());
	}
}

	public void actionPerformed(ActionEvent e)
	{
		if (e.getSource()== menueBildLaden)
		{
			dateiLaden.setDateipfad();
		}
		if (e.getSource()== menueARStarten)
		{			
			OberflaecheAuswertung OberflaecheAusw = new OberflaecheAuswertung();	
			OberflaecheAusw.los();
			fitsTest.los(dateiLaden.getDateipfad(),OberflaecheAusw,dateiLaden);
		}
		if (e.getSource()== menueHilfeInfo)
		{
			OberflaecheInfo OberflaecheInfo = new OberflaecheInfo();
			OberflaecheInfo.los();
		}
		if (e.getSource()== menueProgBeenden)
		{
			System.exit(0);
		}
	}
	public void mouseClicked(MouseEvent mk) 
	{	
		if (mk.getSource()== pnlBild)
		{
			
		}
		}
	public void mouseEntered(MouseEvent mk) 
		{	
		}
	public void mouseExited(MouseEvent mk) 
		{	
		}
	public void mousePressed(MouseEvent mk) 
		{
			
		}
	public void mouseReleased(MouseEvent e) 
		{	
		}
	}
```

Hier möchte ich das Bild einfügen:


```
//display = new ImageDisplay();
	pnlBild=new JPanel();
	pnlBild.setSize(600, 400);
	pnlBild.setBackground(Color.blue);
	//pnlBild.addMouseListener(this);
```

Und hier möchte ich gerne die Position meines Mauszeigers auf dem Bild wiedergeben


```
pnlPos=new JPanel();
	pnlPos.setLayout(new BoxLayout(pnlPos, BoxLayout.X_AXIS));
	
		lblXPos= new JLabel("X Position: "+iXPos);
		lblXPos.setSize(200, 20);
		
		lblLeer=new JLabel("          ");
		
		lblYPos=new JLabel("Y Position: "+iYPos);
		lblYPos.setSize(200, 20);
		
		pnlPos.add(lblXPos);
		pnlPos.add(lblLeer);
		pnlPos.add(lblYPos);
```

Ich wäre für Hilfe echt dankbar


----------



## Eklaf (3. März 2011)

Kann mir keiner weiterhelfen? Ich komme echt nicht weiter. Sonst muß ich mir jetzt echt professionelle Hilfe holen


----------

