Wie binde ich Fit Datei ein****

Eklaf

Mitglied
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 :confused:;)
 

Anhänge

  • m45_0488.rar
    16 MB · Aufrufe: 36
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
 
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
 
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.

eap.fits

Includes an applet and application for viewing and editing FITS files. Also includes a general purpose package for reading and writing FITS data. It can read PGP encrypted files if the optional PGP jar file is available.

jfits

The jfits library supports FITS images and ASCII and binary tables. In-line modification of keywords and data is supported.

STIL

A pure java general purpose table I/O library which can read and write FITS binary tables amongst other table formats. It is efficient and can provide fast sequential or random read access to FITS tables much larger than physical memory. There is no support for FITS images.
 
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
 
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.
 
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...
 
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
* License: GNU General Public License version 2 or later
*/
package org.eso.fits;

import java.util.*;
import java.io.*;

/** TestFits class provides a static main method for testing the
* FITS class library. It also shows a typical usage of the
* classes.
*
* @version $Id: TestFits.java,v 1.5 2007-01-04 09:32:23 pgrosbol Exp $
* @author P.Grosbol, ESO, <pgrosbol@eso.org>
*/
public class TestFits{
/** Static method for testing the FITS class library.
*
* @param argv array of arguments i.e. FITS files
*/
public static void main(String[] argv) {
if (argv.length < 1) {
System.out.println("Error: must have at least one argument");
System.exit(1);
}

System.out.println("-- Test FITS files --------");
FitsFile file = null;
for (int na=0; na<argv.length; na++) {
try {
file = new FitsFile(argv[na]);
} catch (FitsException e) {
System.out.println("Error: is not a FITS file >"
+ argv[na] + "<");
continue;
} catch (IOException e) {
System.out.println("Error: cannot open file >"
+ argv[na] + "<");
continue;
}

int noHDU = file.getNoHDUnits();
System.out.println("FITS file has " + noHDU + " HDUnits");

for (int i=0; i<noHDU; i++) {
FitsHDUnit hdu = file.getHDUnit(i);
FitsHeader hdr = hdu.getHeader();
int noKw = hdr.getNoKeywords();
int type = hdr.getType();
int size = (int) hdr.getDataSize();
System.out.println(" " + i + ": >" + hdr.getName()
+ "< of type >" + Fits.getType(type)
+ "< with " + noKw + " keywords"
+ " and " + size + " bytes of data");
System.out.println(" Keywords:");

ListIterator itr = hdr.getKeywords();
while (itr.hasNext()) {
FitsKeyword kw = (FitsKeyword) itr.next();
System.out.print(" " + kw.getName());
switch (kw.getType()) {
case FitsKeyword.COMMENT:
System.out.print("(C) " + kw.getComment());
break;
case FitsKeyword.STRING:
System.out.print("(S)= '" + kw.getString() + "'");
break;
case FitsKeyword.BOOLEAN:
System.out.print("(B)= " + kw.getBool());
break;
case FitsKeyword.INTEGER:
System.out.print("(I)= " + kw.getInt());
break;
case FitsKeyword.REAL:
System.out.print("(R)= " + kw.getReal());
break;
case FitsKeyword.DATE:
System.out.print("(D)= " + kw.getString());
break;
default:
}
if (0<kw.getComment().length()
&& (kw.getType()!=FitsKeyword.COMMENT)) {
System.out.print(" / " + kw.getComment());
}
System.out.println();
}

if (type == Fits.IMAGE) {
System.out.println("\n Check data matrix "
+ "- compute mean and rms");
FitsMatrix dm = (FitsMatrix) hdu.getData();
int naxis[] = dm.getNaxis();
double crval[] = dm.getCrval();
double crpix[] = dm.getCrpix();
double cdelt[] = dm.getCdelt();

System.out.println(" Dimension of matrix: "
+ naxis.length);
for (int n=0; n<naxis.length; n++)
System.out.println(" Axis " + n + ": " + naxis[n]
+ ", " + crpix[n] + ", "
+ crval[n] + ", " + cdelt[n]);
System.out.println("\n");

int nv, off, npix;
int nval = dm.getNoValues();
if (0<nval) {
int ncol = naxis[0];
int nrow = nval/ncol;
System.out.println(" Npixel,row,col: " + nval
+ ", " + nrow + ", " + ncol);
float data[] = new float[ncol];
double mean, rms, val;

off = nv = npix = 0 ;
mean = rms = 0.0;
long time = System.currentTimeMillis();
for (int nr=0; nr<nrow; nr++) {
try {
dm.getFloatValues(off, ncol, data);
for (int n = 0; n<ncol; n++) {
val = data[n];
npix++;
mean += val;
rms += val*val;
}
} catch (FitsException e) {
}

off += ncol;
}
mean = mean/npix;
rms = rms/npix - mean*mean;
rms = ((0.0<rms) ? Math.sqrt(rms) : 0.0);
float dtime =
(float) (1000.0*(System.currentTimeMillis()-time)/
((double) nval));
System.out.println(" Mean: " + (float)mean +
", rms: " + (float)rms +
", Time: " + dtime
+ " S/Mp, Pixels: " + npix);
}
} else if (type==Fits.BTABLE || type==Fits.ATABLE) {
System.out.println("\n Check table data - list columns");
FitsTable dm = (FitsTable) hdu.getData();
int nrow = dm.getNoRows();
int ncol = dm.getNoColumns();
FitsColumn col[] = new FitsColumn[ncol];
System.out.println(" Columns: " + ncol
+ ", Rows: " + nrow);
for (int n=0; n<ncol; n++) {
col[n] = dm.getColumn(n);
System.out.print(" " + n + " >"
+ col[n].getLabel() + "<, ");
System.out.print(col[n].getRepeat() + " ");
System.out.print(col[n].getDataType() + ", >");
System.out.print(col[n].getDisplay() + "<, >");
System.out.println(col[n].getUnit() + "<");

if (col[n].getDataType() == 'F'
|| col[n].getDataType() == 'E'
|| col[n].getDataType() == 'D') {
int npix = 0;
double mean, rms, val;
mean = rms = 0.0;
long time = System.currentTimeMillis();
for (int nr=0; nr<nrow; nr++) {
val = col[n].getReal(nr);
if (Double.isNaN(val)) continue;
npix++;
mean += val;
rms += val*val;
}
float dtime =
(float) (1000.0*(System.currentTimeMillis()
-time)/((double) nrow));
mean = mean/npix;
rms = rms/npix - mean*mean;
rms = ((0.0<rms) ? Math.sqrt(rms) : 0.0);
System.out.println(" no,mean,rms: " + npix
+ ", " + (float)mean + ", "
+ (float)rms + "; "
+ dtime + " S/Mp");
} else if (col[n].getDataType() == 'I'
|| col[n].getDataType() == 'J'
|| col[n].getDataType() == 'B') {
int npix = 0;
double mean, rms, val;
mean = rms = 0.0;
long time = System.currentTimeMillis();
for (int nr=0; nr<nrow; nr++) {
val = col[n].getInt(nr);
if (val == Long.MIN_VALUE) continue;
npix++;
mean += val;
rms += val*val;
}
float dtime =
(float) (1000.0*(System.currentTimeMillis()
-time)/((double) nrow));
mean = mean/npix;
rms = rms/npix - mean*mean;
rms = ((0.0<rms) ? Math.sqrt(rms) : 0.0);
System.out.println(" no,mean,rms: " + npix
+ ", " + (float)mean + ", "
+ (float)rms + "; "
+ dtime + " S/Mp");
}
}
}
}
System.out.println("-- Test finished -----------------");
}

System.exit(0);
}
}
 
Mit API arbeiten tut man eigentlich die ganze Zeit, mit einer fremden API zu arbeiten ist da nicht viel anders.

Code:
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.
 
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.

Code:
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?

Code:
package Unterklassen;

public class Fits 
{
	public void laden()
	{
		Fits f = new Fits(m45_0488.fit);
		return f;
	}
}
 
Zuletzt bearbeitet:
Zurück