Modul für Bildinfo's

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Beitragvon Beyond » Sonntag 15. Dezember 2002, 13:33

Was da ist kann man abprüfen. Nicht aber wie die Werte zu interpretieren sind. Ich habe mir daher für das .png-modul auch die Arbeit gemacht eine richtige __str__ Methode zu programmieren und auch gleich meine Referenz angegeben, sodaß man hier wirklich weiter arbeiten kann. Bei einem Flash-File ist z.B. eigentlich (habe ich aber anders implementiert) Breite und Höhe in 20*pixelzahl angegeben. Würdest Du einfach darauf zugreifen (mit anderer Implementation) käme wohl nicht das raus, was Du Dir erwartest....

Aber was ist z.B. wenn .pdf-Dokumente unterstützt werden. Da finde ich es garicht so leicht überhaupt festzulegen was Breite und Höhe dann sein soll. Man könnte sagen Breite und Höhe einer Seite, aber in .pdf-Dokumenten können Seiten verschiedener Größe auftauchen ... Soll man das Maximum nehmen? Man könnte auch alle Seiten "aneinander hängen" und davon die Maße nehmen.

Wenn es also nicht nur um Bilder geht ist die Sache nicht so einfach und intuitiv.

Nachdem es nach bisherigen Infos bei Dir aber nur um Bilder geht solltest Du immer auf PictureContent prüfen (sonst kannst Du zwar u.U. Deinen Code ausführen, aber er macht dann keinen Sinn -- so etwas sollte man verhindern! Das ist ähnlich wie ein dicker Käfer der auf dem Rücken liegt und mit den Beinen strampelt). Handelt es sich nicht um ein Bild solltest Du mit einer Fehlermedlung abrechen. Wenn doch ist ja eh alles bestens ...

Aber wenn Dir Deine Methode leichter fällt, mach es so. Ich habe auch schon einiges mit WFM-Status zusammen-gehackt. Da gibt's noch viel mehr Sachen, die man machen kann 8) ...

Was ich Dir sagen will: Sei Dir im Klaren was Du tust und wo Fehler in Deinem Code dadurch auftauchen können. Kommentiere diese Stellen v.a. wenn Du mit anderen zusammenarbeitest.

cu beyond
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Sonntag 15. Dezember 2002, 13:40

:wink: hab das ein wenig eng gesehen, weil ich eben nur Bilder brauche...

ich hab mich heute auch mal schlau gemacht in bezug auf mp3 und avi, aber außer tausend Editoren die sagen, die sagen sie wären die besten im umwandeln, hab ich keinen Hinweis oder Quellcode gefunden, der dir nützlich sein könnte. tut mir leid.
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

Beitragvon RicmanX » Donnerstag 19. Dezember 2002, 20:20

Falls sich manche Leute wundern, neue URL ist jetzt http://www.pythonarea.net/cgi-bin/paf/m ... o/index.pl
Benutzeravatar
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Beitragvon Beyond » Donnerstag 19. Dezember 2002, 21:13

Man muß z.B. nach "file format specifications" suchen. Bei SourceForge gibt's einige mp3-Projekte. Diese können z.B. mp3-Daten auslesen.

Für .ogg habe ich eines gefunden.

@Milan: Hättest Du Interesse es in das Modul einzuarbeiten?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 20. Dezember 2002, 14:15

neugierig bin ich schon, aber ich habe keine Ahnung, wie du deine Module aufgebaut hast. am besten schickst du mir mal ne mail, wo drin steht was es amchen soll und wie es das zurückgeben soll.
In der Zeit muss ich dich auch erst mal enttäschen, da ich vor Weihnachten quasi "streike", weil erst mal Ferienstart ist. ansonsten hätt ich lust zu das zu machen.
Benutzeravatar
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Beitragvon Beyond » Freitag 20. Dezember 2002, 20:36

Am besten ist es, wenn Du Dir die sub-module im /contentAnalysers Verzeichnis von contentinfo anschaust. Es bietet sich contentinfo_image__gif.py an. Dieses ist sehr einfach.

Stell mir bei Unklarheiten die Fragen am besten über das Forum, so können alle sich darüber informieren.

Den Java-Code gibt's bei
http://taxiway.swapspace.net/~matt/vorbis/

Ich habe mit dem Autor die Lizenz bereits geklärt.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Freitag 20. Dezember 2002, 20:57

ui... so gut kann ich java nicht, dass ich alles übersetzen kann. Ich könnte circa 1/3, aber der Rest ist mir unklar. Ich lern Java auch gerade erst, kanns aber weniger als Python :roll: . Ich weiß nicht, ob ich da wirklich zurechtkomme. :o :(
Benutzeravatar
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Beitragvon Beyond » Samstag 21. Dezember 2002, 21:46

Dein Vorteil beim Portieren ist, dass Du den Java-Code nur halbwegs nachvollziehen können mußt. Das ist wesentlich leichter als selber etwas in Java zu programmieren. Wenn Du etwas nicht verstehst, frag mit einfach.

Ich habe jetzt auch noch .wav und .au implementiert.
Z.T. mit Hilfe einer Doku zu FileFormats die Guido van Rossum geschrieben hat -- vor einiger Zeit :)
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Montag 23. Dezember 2002, 19:16

öhm... bis jetzt komm ich ja ganz gut klar, aber was heißt sowas?

Code: Alles auswählen

 public VorbisInfo(InputStream s) throws IOException {

    /* initialize the crc_lookup table */
    for (int i=0;i<256;i++)
      crc_lookup[i]=_ogg_crc_entry(i);

    fetch_header_and_packet(s);
    interpret_header_packet();

    fetch_header_and_packet(s);
    interpret_header_packet();
  }

- pubilc : ist klar, aber gibt es in Python nicht
- VorbisInfo(InputStream s) : :?:
- trows IOExeception: :?:

einfacher ist das hier:

Code: Alles auswählen

public int getChannels() {return channels;}

der returnwert ist ein integer, der name ist getChannels, es gibt keine Parameter und gemacht wird "return channels". Ich kann das Beispiel aber nicht auch das obere übertargen und Java kann ich wie gesagt nicht gut genug. Der Rest ist nicht besonders schwer, jedenfalls auch den ersten Blick.
piddon
Gründer
Beiträge: 410
Registriert: Dienstag 30. Juli 2002, 18:03
Wohnort: Oestrich-Winkel
Kontaktdaten:

Beitragvon piddon » Montag 23. Dezember 2002, 20:01

Code: Alles auswählen

public VorbisInfo(InputStream s) throws IOException {

    /* initialize the crc_lookup table */
    for (int i=0;i<256;i++)
      crc_lookup[i]=_ogg_crc_entry(i);

    fetch_header_and_packet(s);
    interpret_header_packet();

    fetch_header_and_packet(s);
    interpret_header_packet();
  }


Das sind einfach nur Methodenaufrufe.

Diese Methoden fetch_header.... haben keinen Returnwert, daher nur der Aufruf, wie ein "Befehl". Der Aufruf bei deinem 2. Code wäre ja:

Code: Alles auswählen

a = getChannels()


und in a hast du dann deinen Returnwert.

Wird eine MEthode jedoch so deklariert:

Code: Alles auswählen

public void get_header(s)


Man kann es so interpretieren, dass deine Code angehalten wird, der code von get_header wird ausgeführt, und danach bekommt dein Code wieder die Kontrolle und macht weiter..

so gibt es keinen Wert der zurückgegeben werden muss, und man ruft es so auf:

Code: Alles auswählen

get_header(s)


fetch_header_and_packets(s) muss es irgentwo als Method implementiert geben. Was anderes kann ich mir nicht vorstellen.

Aber warum das ganze zweimal hintereinander? Das macht KEIN sinn

Viel Bla von mir, hoffentlich hilfts...
irc: #python.de @ irc.freenode.net | python-wiki | python-forum FAQ
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Montag 23. Dezember 2002, 21:19

lol. nun, ob das sinn macht, hab ich mir noch gar nicht angeschaut, weil ich es erst einmal übersetzen wollte. dann hatte ich vor mir das näher anzuschauen. mein Problem ist aber, ich weiß nicht wie ich den headerteil übertragen soll:

Code: Alles auswählen

public VorbisInfo(InputStream s) throws IOException

ich hab das andere mit dazugeschrieben, damit man vielleicht etwas mehr rauserkennen kann. Ich kann mr jedoch nicht zusammenreimen, was das throws IOException heißen soll. normalerweise wirft man doch damit eine art Ausnahmme, hier speziell einen Datei-Fehler, oder? Weiter weiß ich auch nicht, ob VorbisInfo hier der Returnwert ist, oder nur der Name (denk ich mal mehr, nach deiner Erklärung :P ) mit Parametern ist.

Ich kann die Syntax von c,c++ und java nicht so gut, aber die hängen ja alle nen bissel zusammen...
Benutzeravatar
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Beitragvon Beyond » Montag 23. Dezember 2002, 21:40

Wollte Dir gerade schon antworten und Du fragst genau die Sachen die Posten will :D

Also das besondere an

Code: Alles auswählen

/**
   * Initializes Ogg Vorbis information based on the header from a stream.
   * @param s an Ogg Vorbis data stream
   */
  public VorbisInfo(InputStream s) throws IOException

ist, daß es die Klasse VorbisInfo initialisiert. Oben steht doch

Code: Alles auswählen

public class VorbisInfo


Obige Deklaration ist ein Constructor in Java. Ein Constructor in Java heißt genauso wie die Klasse selbst. In Python hättest Du statt dessen

Code: Alles auswählen

def __init__(s):
   for ...


Das

Code: Alles auswählen

throws IOException

bedeutet, daß beim Aufruf dieser Methode (hier des Constructors -- sprich erzeugen einer Instanz der Klasse) eine IOException auftreten kann. In Python gibt's ja auch Exceptions für alle möglichen Fehler. Java ist aber etwas statischer als Python, was Nach- und Vorteile hat. Man darf nicht frölich wie in Python einfach eine Excpetion auslösen, sondern man muß schon im Vorfeld eine solche Möglichkeit ankündigen. Dann weiß der Java-Compiler bescheid und v.a. ein Programmierer, der das Modul / die Funktion benutzen will. Der kann sich dann überlegen, was bei einem solchen Fehler passieren soll z.B. MsgBox an Benutzer, die sagt das er ein Depp ist und nur .ogg-Dateien angeben darf (geht auch freundlicher z.B. "Das Programm RiesigDoof verursachte eine schwere ..." :D)
In Python kann man nicht vorhersagen, was bei einem Funktionsaufruf so alles passieren kann, das macht die Programmierung schneller aber "schlampiger". Ein guter Programmierer (Alice) gibt halt die möglichen Fehler in seiner Doku an und ein weiterer guter Programmierer (Bob) beachtet die Doku und fängt die Fehler auch in Python ab.

Ich hoffe das hilft Dir weiter.

cu beyond
Benutzeravatar
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Beitragvon Beyond » Montag 23. Dezember 2002, 21:50

Und nochwas: In Java wird ein "self" o.ä. nicht verwendet. Die Aufrufe

Code: Alles auswählen

fetch_header_and_packet(s);
interpret_header_packet();

fetch_header_and_packet(s);
interpret_header_packet();

beziehen sich aber auf die aktuelle Instanz von VorbisInfo.

Warum das ganze zweimal aufgerufen wird, verstehe ich auch nicht ganz. .ogg-Dateien bestehen aber aus Paketen. vielleicht benötigt man die beiden ersten Pakete, um alle Informationen zu sammeln. Aus dem Code konnte ich es nicht einfach ersehen.

Du kannst auch mal im Java-Code probieren, was passiert wenn Du eines der "Aufrufpaare" auskommentierst und Dir dann eine .ogg-Datei nochmal ansiehst (andere Werte?).

cu beyond
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Dienstag 24. Dezember 2002, 11:28

jetzt geht mir glatt ein ganzer Christbaum auf... :D das mit dem self war mir schon klar, aber das die init so beschrieben wird hätte mir auch klar sein können. thx, werd mal sehen, ob ich demnächst das fertig mache. Heute hab ich noch zuviel zu tun, man will ja schließlich ein schönes Fest und bekommt auch viel Besuch... :wink:

cu. Milan
Benutzeravatar
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Beitragvon Beyond » Montag 30. Dezember 2002, 04:47

Kommst Du klar mit der Implementation?

cu beyond

Wer ist online?

Mitglieder in diesem Forum: harryberlin