スケーリングしてみました
デスクトップ画像のスケーリングの仕組みだけ入れてみました。
今回はクライアントマシン側でスケーリングする方法をとります。サーバ側でスケーリングしてもらうことも可能ですが当然サーバ側の負荷が上がりますし、とりあえずクライアント側でスケーリングする仕組みも入れておいて問題はないと思いますので。
パブリックモードでは通常のJPEGファイルのイメージが1枚1枚送られてくるので、クライアントではこれを紙芝居のようにせっせと描画しています。今は素のJPEGファイルをQtさんにそのまま(サイズも変えず)表示してもらっています。
具体的にはQImageというクラスがありまして、
QImage image;
image.loadFromData((const uchar *)buf, len, "JPEG");
という感じでメモリ上に受け取った長さlenバイトのJPEGファイルのイメージをQImageのデータに変換します。
これをウィンドウの再描画の時に使うのですが、スケーリングしたい場合は再描画する前に、このimageのデータをスケーリングしてしまえば、再描画の部分は変更しなくても良さそうです。
QtAssistantを起動しまして、QImageのドキュメントを調べると、scaled()というメンバ関数が使えそうです。
スケーリングの指定サイズと縦横比を保持するか否かと変換品質(速さ優先 or 画質優先)の3つのパラメータを指定すれば良さそうです。
デスクトップ画像なので縦横比は保持したほうが良さそうです。変換品質に関してはマシンパワーがあれば画質優先したいですが、ここは選択できてもよいかと思います。最後にサイズなのですが、スケーリングの倍率だけ指定するのが簡単でよいのですが、引数としてはサイズの指定が必要になります。
このサイズの指定にはQSizeというクラスのインスタンスを指定できるので、このQSizeについてQt Assistantで調べてみました。
QSize & operator *=(qreal factor)
const QSize operator *(const QSize &size, qreal factor)
というのがちゃんと定義してありますね。
size *= 0.5;
とか書くとsizeが0.5倍のサイズに変更できるんですね。これを使えば、この倍率(factor)だけ指定するようにすれば簡単で良さそうです。
ということで、これまで調べた情報を元に仕組みだけ入れて実験しました。
インタフェース的にはスライダーとかにするとウニョウニョと拡大・縮小できて面白いのですが、すぐ飽きるかもしれませんね。
0.5倍でテストしました。画質優先を指定しています。通常のサイズで見るとかなり画質が違いますね。
あまり小さくし過ぎると作業が困難になりますが、サーバの状態を監視するくらいなら問題ないでしょうね。
« アプリケーション設定情報の在処 | トップページ | スケーリングしてみました その2 »
コメント