[gelöst] jpg-Bildformat wird nur auf Entwickler-PC unterst..

Alles rund um die Programmierung mit Qt
Antworten
tradebot
Beiträge: 4
Registriert: 10. Dezember 2006 21:49

[gelöst] jpg-Bildformat wird nur auf Entwickler-PC unterst..

Beitrag von tradebot »

Hallo,

ich habe dieses Problem zwar bereits ansatzweise in anderen Threads gefunden, allerdings bisher ohne befriedigende Loesung. Falls ich etwas uebersehen haben sollte, bitte ich um Entschuldigung.

Hier die Beschreibung meines Problems:
Ich moechte eine jpg-Datei als QImage-Objekt im Programm verwenden:

Code: Alles auswählen

QImage img("c:/test.jpg");
Auf dem Rechner, auf dem ich kompiliere, funktioniert das problemlos, d.h. img.isNull() wuerde hiernach "false" liefern.

Wenn ich allerdings das kompilierte Programm auf einen anderen Rechner kopiere, schlaegt der anschliessende isNull()-Test fehl (d.h. liefert "true").

Um herauszufinden, welche DLL fuer jpg-Unterstuetzung benoetigt wird, habe ich auf allen getesteten Systemen die "path"-Umgebungsvariablen umbenannt und die DLLs einzeln ins Verzeichnis der exe-Datei kopiert. Damit das Programm lief, habe ich folgende 3 DLLs gebraucht:
mingwm10.dll
QtCore4.dll
QtGui4.dll

Dabei bin ich auf folgendes kuriose Verhalten gestossen:
  • Auf dem Entwickler-PC funktionert das jpg-Lesen mit den DLLs von Qt v4.2.1, aber nicht mit denen von v4.2.0.
  • Auf meinem Notebook funktioniert es mit den 4.2.1-DLLs nicht, sehr wohl aber mit den DLLs von Version 4.2.0. Ich habe die DLLs mitkopiert, d.h fuer jede Version identische Dateien verwendet.
Fuer Loesungsideen waere ich dankbar.

Hier der vollstaendige Code, den ich selbst fuer meine Tests verwendet habe:

Code: Alles auswählen

#include <QApplication>
#include <QImage>
#include <QMessageBox>

int main( int argc, char *argv[] )
{
    QApplication app( argc, argv );

    QImage img( "c:/test.jpg" );

    if( img.isNull() ){
        QMessageBox::information( 0, "jpg test", "can't read jpg" );
    } else {
        QMessageBox::information( 0, "jpg test", "no problem" );
    }

    return 0 ;
}
Zuletzt geändert von tradebot am 13. Dezember 2006 01:33, insgesamt 1-mal geändert.
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag von dhcase »

kopier mal die Datei $QTDIR\plugins\imageformats\qjpeg1.dll auf den Zielrechner, vielleicht klappts dann...
tradebot
Beiträge: 4
Registriert: 10. Dezember 2006 21:49

Beitrag von tradebot »

Danke fuer den Tipp, leider brachte er keine Aenderung.

Hier nochmal die exakten Schritte, die ich zum Testen durchfuehre:
  • PATH-Umgebungsvariable(n) auf beiden Rechnern umbenannt
  • USB-Stick mit zwei Ordnern bestueckt: Ein Ordner enthaelt die 4.2.1-DLLs samt exe-Datei des oben gezeigten Programms, der andere Ordner enthaelt die 4.2.0-DLLs und eine identische Kopie der exe-Datei.
  • Stick in Rechner A (Entwicklungs-PC):
    Ausfuehren des Programms im 4.2.0-Ordner liefert "can't read jpg",
    Ausfuehren im 4.2.1-Ordner liefert "no problem"
  • Stick in Rechner B (Notebook): Exakt umgekehrtes Verhalten -
    4.2.0 liefert "no problem",
    4.2.1 liefert "can't read jpg".
Auf eine Erklaerung dieses Phaenomens bin ich gespannt...
kitov
Beiträge: 36
Registriert: 29. November 2006 12:24

Re: jpg-Bildformat wird nur auf Entwickler-PC unterstuetzt

Beitrag von kitov »

das problem(mit jpeg) hatte ich auch.
mit png geht es immer ;-)
also konvertieren.
oder ibqjpcodecs.so rueber kopieren.
tradebot
Beiträge: 4
Registriert: 10. Dezember 2006 21:49

Beitrag von tradebot »

Unter Windows entspricht der "ibqjpcodecs.so" vermutlich die "qjpcodecs.dll"? Brachte mir auch keine Abhilfe. Ich habe mal saemtliche DLLs, die bei Qt v4.2.1 dabei sind, in einen Ordner kopiert, dazu mein Testprogramm - Ergebnis blieb gleich (PC: "no problem", Notebook: "can't read jpg").
Das Problem mit PNGs zu umgehen ist irgendwie unbefriedigend. Hat niemand eine Idee, wieso JPGs in Abhaengigkeit von Qt-Version und PC mal unterstuetzt werden, mal nicht?
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Also nachdem meiner Kenntnis nach das JPG Modul standardmäßig als Plugin übersetzt wird, sollte zu mindest die qjpeg1.dll bzw. qjpegd1.dll in ein Unterverzeichnis imageformats deiner Anwendung kopiert werden und nicht einfach in das selbe Verzeichnis wie die Exe.
Wofür die qjpcodecs.dll gut ist weiss ich grad nicht.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Re: jpg-Bildformat wird nur auf Entwickler-PC unterstuetzt

Beitrag von patrik08 »

tradebot hat geschrieben:Hallo,
Hier die Beschreibung meines Problems:
Ich moechte eine jpg-Datei als QImage-Objekt im Programm verwenden:

Code: Alles auswählen

QImage img("c:/test.jpg");
Auf dem Rechner, auf dem ich kompiliere, funktioniert das problemlos, d.h. img.isNull() wuerde hiernach "false" liefern.
mingwm10.dll
QtCore4.dll
QtGui4.dll
....
Fuer Loesungsideen waere ich dankbar.
...
Programme auf andere pc zu geben ist ein riesen kapitel... was nicht immer einfach ist....
Ab qt4.2 version geht es jedoch ganz gut .... wenn man zwei qt versionen hat compiliert hat:

- 1) eine -static compiliert wie auf http://wiki.qtcentre.org/index.php?titl ... on_Windows beschrieben.... im ordner Z.b e:/qt4
-2) eine normal compiliert auf e:/qt

Somit kann man immer im PATH umschalten ob static builden oder normal... der vorteil von static .... man muss sich niee um die dll zu kummern .... in der exe ist einfach alles dabei.... und es gibt den http://doc.trolltech.com/4.2/qtplugin.html Q_IMPORT_PLUGIN mit dem man automatisch Q_IMPORT_PLUGIN(qsqlite) oder Q_IMPORT_PLUGIN(qjpg) notwendige plugin static einkomplilieren kann....

Naturlich mussen die plugin beim configure dabei sein....

Code: Alles auswählen

/* normal */
configure -qt-sql-mysql -qt-sql-odbc -qt-sql-sqlite -qt-gif -qt-libpng -qt-libjpeg
/* oder */
configure -static -qt-sql-mysql -qt-sql-odbc -qt-sql-sqlite -qt-gif -qt-libpng -qt-libjpeg
und sie gehen alle prima .... bis zum odbc der mann niee static hinbekommt.... warum weiss ich nicht....

somit hat man leichte programme beim normal compilieren ... und alle dll in der exe beim statich builden.... und zum testen .... (static) ob es auf andere pc lauft .... muss man nur den ordner qt umbenennen und mann muss keinen installer bauen..... da ja alles dabei ist...
.........................
speack português italiano deutsch english castellà qt
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Wenn man mal rausgefunden hat, in welches Verzeichnis das jeweilige PlugIn muss, damit Qt es sofort findet, is die Sache eigentlich recht simpel.
QT Dll in das selbe Verzeichnis wie die EXE der Anwendung und Plugins in ein Unterverzeichnis das den selben Namen hat wie das Verzeichnis wo das PlugIn im QT\plugins Ordner liegt.
Damit funktionierte bei mir bisher eigentlich alles einwandfrei.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
tradebot
Beiträge: 4
Registriert: 10. Dezember 2006 21:49

Beitrag von tradebot »

Die qjpeg1.dll nicht direkt in den Ordner der exe-Datei, sondern in den Unterordner "imageformats" zu kopieren, hat mein Problem geloest.

Vielen Dank!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das findet man aber auch bei der Foren-Suche.

Ausserdem steht auch hier was gutes dazu:
http://doc.trolltech.com/4.2/deployment ... qt-plugins
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten