スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

綺麗に画像を拡大縮小する

画像を拡大縮小して表示するコードと言うのは概ねこんなものかと。

とりあえず、情報だけ取得して、縮尺を決めて画像をロード。

その後画面サイズにfitさせるといった流れ。

でも、これだと画面サイズにfitさせる際にずいぶんと汚くなります。

なんかフラグでもあればと思ったのですが見つかりません。

以下悪い?例
      BitmapFactory.Options options = new BitmapFactory.Options();
      // サイズのみ取得する
      options.inJustDecodeBounds = true;
      options.inDither = true;
      BitmapFactory.decodeFile(filePath, options);
      mScreenWidth = getWidth();
      mScreenHeight = getHeight();
      //画面よりは1まわり大きいサイズとする(画面より小さくする場合+1)
      int scaleW = options.outWidth / mScreenWidth;
      int scaleH = options.outHeight / mScreenHeight;

      // 縮尺は2なら1/2となる。
      int scale = Math.max(scaleW, scaleH);

      //次はイメージを読み込む
      options.inJustDecodeBounds = false;
      options.inSampleSize = scale;

      Bitmap image = BitmapFactory.decodeFile(filePath, options);
      if (image == null) {
        return;
      }
      mImageHeight = image.getHeight();
      mImageWidth = image.getWidth();
      float dispScale = Math.min((float) mScreenHeight / mImageHeight,
          (float) mScreenWidth / mImageWidth);
      Rect src = new Rect(0, 0, (int)mImageWidth, (int)mImageHeight);
      //画面サイズを指定して拡大する。
      mImageHeight = mImageHeight * dispScale;
      mImageWidth = mImageWidth * dispScale;
      Rect dst = new Rect(0, 0, (int)mImageWidth,
          (int) mImageHeight);
      canvas.drawBitmap(image, src, dst, null);

というわけで、画面サイズに合わせるコードを以下のようにします

      mImageHeight = mImageHeight * dispScale;
      mImageWidth = mImageWidth * dispScale;
      
      Bitmap createScaledBitmap = Bitmap.createScaledBitmap(image,  (int)mImageWidth, (int)mImageHeight, true);
      image.recycle();
      image = null;
      canvas.drawBitmap(createScaledBitmap, 0, 0, null);

最初のコード

f:id:mokkouyou:20100113200015p:image

後のコード

f:id:mokkouyou:20100113200014p:image


サンプルのせいかいまいちわかりにくいかもしれませんが、劇的に違います。


追記

結局のところ、filterの有無ですので、

以下のように(当然Paintはキャッシュして)利用するだけで同じ結果となりそうです。

コード上ではオブジェクト生成がこちらの方が少ないんですが、実際の所はどうだかはわかりませんが

Paint p = new Paint();
p.setFilterBitmap(true);
canvas.drawBitmap(image, src, dst, p);
関連記事

コメントの投稿

非公開コメント

スポンサードリンク
アプリ一覧
最新記事
最新コメント
最新トラックバック
検索フォーム
月別アーカイブ
カテゴリ
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。