13

drawBitmap() メソッドを使用して画像を表示したい。しかし、画面のサイズに合わせてサイズを変更する前に。結果画像の品質に問題があります。以下のスクリーンショットとテストコードを見ることができます。実行時に高品質で画像のサイズを変更するにはどうすればよいですか?

解決策をありがとう。

元の画像: 代替テキスト http://dl.dropbox.com/u/709109/gradient.png

デバイス上の結果のスクリーンショット: 代替テキスト http://dl.dropbox.com/u/709109/device.png

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;

import java.io.IOException;
import java.io.InputStream;

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LinearLayout container = (LinearLayout) findViewById(R.id.container);
        container.addView(new View(this) {
            @Override
            protected void onDraw(Canvas canvas) {
                Bitmap unscaledBitmap;
                try {
                    InputStream in = getAssets().open("images/gradient.png");
                    unscaledBitmap = BitmapFactory.decodeStream(in);
                    in.close();
                    canvas.drawBitmap(unscaledBitmap, null, new Rect(0, 0, 320, 480), null);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
4

6 に答える 6

15

描画時にサイズ変更するのではなく (非常にコストがかかります)、オフスクリーン ビットマップでサイズ変更を試み、ビットマップが 32 ビット (ARGB888) であることを確認してください。

于 2010-01-11T16:50:58.793 に答える
10

以下のRomainの回答を参照してください。

この回答を削除したいのですが、承認済みとしてマークされているため削除できません。


Android [この回答が最初に書かれたとき、32 ビット カラーを明示的に要求せずに]は 16 ビット カラーしか実行しないため、不要なアーティファクトが発生する場合があることに注意してください。

また、ディザリング オプションを使用して Android にディザリングを自動的に適用するように指示することもできます。これは完璧ではありませんが、見栄えを良くするのに役立ちます。

于 2010-01-11T11:25:05.267 に答える
2

http://developer.android.com/reference/android/graphics/BitmapFactory.Options.htmlをチェックしてください(unscaledBitmap = BitmapFactory.decodeStream(in);で使用されます);

画像に品質設定を追加できます。画像の処理方法の設定を行っていないため、品質が低下していると思います。

于 2010-01-11T10:47:27.543 に答える
1

古いプラットフォーム (API レベル < 12) で createScaledBitmap(..) メソッドを実装すると、実際のアルファ値を持たない ARGB_8888 ビットマップ (つまり、各ピクセルのアルファ = 255) をスケーリングしようとすると問題が発生します。これは、hasAlpha フラグが設定されているためです。偽に。その場合、スケーリングされたビットマップは自動的に RGB_565 形式に変換されます。

したがって、APIレベル12以降、メソッドがあります(クラスBitmap内)

setHasAlpha(boolean value);

これは、createScaledBitmap(..) を使用する際の変換を防ぐのに役立ちます。

APIレベル> 3でまったく同じメソッドを使用する方法があります。これは非常に長い間存在しており、隠されているだけです。ソース コードを含むすべての必要な手順は、次のとおりです。

https://stackoverflow.com/a/12202069/1082933

お役に立てれば。

于 2012-08-30T18:07:55.957 に答える
0

私は同様の問題を抱えていましたが、これが私がやったことです:実行時に画像のサイズを変更するときの品質の問題

于 2010-11-22T23:34:29.203 に答える
-1

また、サイズ変更機能が画像の縦横比を考慮していない場合、品質が影響を受けます。ウェブ上でいくつかのサイズ変更アルゴリズムを見つけることができます。たとえば、これをチェックしてください

于 2010-01-11T11:11:12.280 に答える