1

カラー マトリックスを使用して ImageView に画像効果を追加するクラスがあります。コントラスト、露出、温度、彩度のカラーマトリックスがいくつかあります。元:

public static Bitmap changeContrast(Bitmap bmp, float contrast)
{
    ColorMatrix cm = new ColorMatrix(new float[]
            {
                    contrast, 0, 0, 0, 0,
                    0, contrast, 0, 0, 0,
                    0, 0, contrast, 0, 0,
                    0, 0, 0, 1, 0
            });

    return getBitmapFromColorMatrix(cm, bmp);
}

今私の問題は、画像のシャープ化です。これらのカラーマトリックスはないようです。助けてください。

hereのコードを使用して画像を鮮明にしようとしましたが、処理に時間がかかりすぎて、sharpenImage(Bitmap src, double weight) メソッドの重みパラメーターにどの有効な値を渡す必要があるかわかりません。

4

3 に答える 3

0

ここで最初の回答を改善し、シークバー (スライダー) を追加して画像のシャープネスを変更します。

public Bitmap doSharpen(Bitmap original, float multiplier) {
    float[] sharp = { 0, -multiplier, 0, -multiplier, 5f*multiplier, -multiplier, 0, -multiplier, 0};
    Bitmap bitmap = Bitmap.createBitmap(
            original.getWidth(), original.getHeight(),
            Bitmap.Config.ARGB_8888);

    RenderScript rs = RenderScript.create(MainActivity.this);

    Allocation allocIn = Allocation.createFromBitmap(rs, original);
    Allocation allocOut = Allocation.createFromBitmap(rs, bitmap);

    ScriptIntrinsicConvolve3x3 convolution
            = ScriptIntrinsicConvolve3x3.create(rs, Element.U8_4(rs));
    convolution.setInput(allocIn);
    convolution.setCoefficients(sharp);
    convolution.forEach(allocOut);

    allocOut.copyTo(bitmap);
    rs.destroy();

    return bitmap;

}

プロジェクトに応じて少し変更する必要がありました。メソッドで畳み込み行列を取得する代わりに、メソッド内で宣言しました。代わりに、変更されたシークバーの変数を使用します。

sharpnessSlider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            Bitmap sharpenedBitmap = doSharpen(btmp,(float)i);
            imageV.setImageBitmap(sharpenedBitmap);
        }

setOnSeekBarChangeListener 内で、int i である変更された値を取得し、doSharpen() メソッド内で定義されている畳み込み行列で使用できるように、それを doSharpen メソッドで渡します。

于 2021-01-22T11:31:01.890 に答える
-1

これは、シークバーで色温度に使用した値です。(あなたは私が尋ねた1つの質問のコメントに彼らに尋ねました)

public static Bitmap doTemperature(Bitmap bmp, float temp){

     ColorMatrix cm = new ColorMatrix(new float[]
             {
             1, 0, 0, temp, 0,
             0, 1, 0, temp/2, 0,
             0, 0, 1, temp/4, 0,
             0, 0, 0, 1, 0

             });

     Bitmap ret = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
     Canvas canvas = new Canvas(ret);
     Paint paint = new Paint();
     paint.setColorFilter(new ColorMatrixColorFilter(cm));
     canvas.drawBitmap(bmp, 0, 0, paint);
     return ret;
 }
//you call it with this method
private void loadBitmapTemp() {
    //private Seekbar temp_value; 
    temp_value = (SeekBar) findViewById(R.id.temp_value);
    temp_value.setMax(100);
    temp_value.setProgress(50);

    int progressTemp = temp_value.getProgress();
    progressTemp -= 50;
    float temp = (float) progressTemp / 220;
    progress_text.setVisibility(View.VISIBLE);
    progress_text.setText(" " + progressTemp * 2);
    yourBitmap = doTemperature(getbitmap, temp));
}
于 2016-04-23T23:14:41.890 に答える