1

ユーザーがアプリケーションをサーバーPCにインストールし、インストールディレクトリをネットワークドライブZ:として共有し、ショップ全体のさまざまなクライアントPCからアプリを開きます。PCの1つにある厄介なバグを除いて、すべてが正常に機能します。

問題のあるPCでは、アプリは.jpg在庫アイテムのファイルを正常にロードし、対応するQPixmapをQLabelに表示できます。現在表示しているインベントリアイテムにまだ画像が割り当てられていない場合は、ファイルダイアログを開き、画像を選択して正しく表示できます。ただし、(新規/変更された)QPixmapを保存すると、黒の背景に一連の色付きの垂直線としてディスクに保存.jpgされます。

(これは実際にはいくつかのジュエリーでなければなりません)

保存はQPixmap::save( const QString & fileName, ...)、プログラムで「<some_id>.jpg」に設定されたファイル名を使用して行われ、目的のファイル形式を指定します。を返しますtrueが、結果のファイルは現代美術のように見えます。

ただし、画像の保存はサーバーと他のクライアントでは正常に機能します。

サーバーとProblemPCの両方が、同じパッチレベルでWindowsXPを実行します。

dnsapi.dllProcess Explorerは、サーバーが使用していない問題のあるPCを除いて、サーバーと問題のあるPC上のアプリプロセスに対して同一のDLLを表示します。

Process Explorerは、サーバーとクライアントの両方でJPEGの処理に使用されるQt DLLが \Device\LanmanRedirector\<server>\<app>\plugins\imageformats\qjpeg4.dllであり、Problem PCでのドライブ全体の検索がqjpeg*.dll空であるため、アプリは両方のコンピューターで同じJPEG処理コードを使用する必要があることも示しています。

助言がありますか?

(編集:問題の説明にOSとパッチのステータスを追加しました。)

編集:解決策:問題のあるマシンでは、16bppの色深度がありました。これを32bppに設定すると、問題はすぐに解決しました。 また、32 bpp未満で実行されているすべての古いクライアントPCでこれに遭遇しないように、に置き換えまし
_pm.save( sDestFileName )
た。
_pm.toImage().convertToFormat( QImage::Format_RGB32 ).save( sDestFileName )

4

1 に答える 1

2

問題を切り分けるためのいくつかのことを次に示します。

  • qjpeg4.dllをクライアントの作業ディレクトリにコピーします
  • PNGまたはGIFとして保存すると画像が破損していませんか?
  • データをQImageに変換し、そこから作業します。
  • バイト形式を検討してください(int-alignedであるため、通常はARGB32を使用します)
  • 問題が発生する場所をテストするには、画像をJPG形式に変換してから、デバッグウィンドウで表示してみてください。

以下の関数は、私が作成したOSSプログラムからのものです。それを使用してから、2番目のパラメーターで参照されているQImageの内容を表示してみてください。

//! Saves image with JPEG compression in given quality (0 - 100, Qt's scale)
//! @param[in] in The lossless input image
//! @param[out] out The image to save to using JPEG compression
//! @param quality The quality level (0 - 100, 0 the most compressed)
//! @return The size of the saved image
quint32 Window::imageSaveLossy(QImage &in, QImage &out, quint8 quality)
{
        quint32 retval;
        QByteArray ba;
        QBuffer buffer(&ba);
        buffer.open(QIODevice::WriteOnly);

        QImage temp(in.size(), QImage::Format_ARGB32);
        temp.fill(QColor(Qt::white).rgb());
        QPainter painter(&temp);
        painter.drawImage(0, 0, in);

        temp.save(&buffer, "JPG", quality);
        out.loadFromData(ba, "JPG");
        retval = (quint32)ba.size();
        buffer.close();
        return retval;
}
于 2011-08-22T15:43:58.930 に答える