Seite 1 von 1

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

Verfasst: 10. Dezember 2006 23:15
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 ;
}

Verfasst: 10. Dezember 2006 23:51
von dhcase
kopier mal die Datei $QTDIR\plugins\imageformats\qjpeg1.dll auf den Zielrechner, vielleicht klappts dann...

Verfasst: 11. Dezember 2006 00:16
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...

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

Verfasst: 11. Dezember 2006 09:07
von kitov
das problem(mit jpeg) hatte ich auch.
mit png geht es immer ;-)
also konvertieren.
oder ibqjpcodecs.so rueber kopieren.

Verfasst: 12. Dezember 2006 01:03
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?

Verfasst: 12. Dezember 2006 09:18
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.

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

Verfasst: 12. Dezember 2006 10:08
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...

Verfasst: 12. Dezember 2006 22:23
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.

Verfasst: 13. Dezember 2006 01:32
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!

Verfasst: 13. Dezember 2006 06:44
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