2015-12-09 5 views
-1

У меня есть класс, который использует цветовую матрицу для добавления эффектов изображения в ImageView. У меня есть несколько цветовых матриц для контраста, экспозиции, температуры и насыщенности. Ex:Цветовая матрица для резкости изображения в android

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).

ответ

2

Возможно, слишком поздно, но я просто хотел бы поделиться быстрым способом резкости изображения.

public static Bitmap doSharpen(Bitmap original, float[] radius) { 
     Bitmap bitmap = Bitmap.createBitmap(
       original.getWidth(), original.getHeight(), 
       Bitmap.Config.ARGB_8888); 

      RenderScript rs = RenderScript.create(yourContext); 

      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(radius); 
      convolution.forEach(allocOut); 

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

      return bitmap;     

} 

И вот 3 разная Резкость типы, которые я создал:

// low 
private static void loadBitmapSharp() { 
    float[] sharp = { -0.60f, -0.60f, -0.60f, -0.60f, 5.81f, -0.60f, 
      -0.60f, -0.60f, -0.60f }; 
//you call the method above and just paste the bitmap you want to apply it and the float of above 
    yourbitmap = doSharpen(getbitmap, sharp)); 
} 

// medium 
private static void loadBitmapSharp1() { 
    float[] sharp = { 0.0f, -1.0f, 0.0f, -1.0f, 5.0f, -1.0f, 0.0f, -1.0f, 
      0.0f 

    }; 
//you call the method above and just paste the bitmap you want to apply it and the float of above 
    yourbitmap = doSharpen(getbitmap, sharp)); 
} 

// high 
private static void loadBitmapSharp2() { 
    float[] sharp = { -0.15f, -0.15f, -0.15f, -0.15f, 2.2f, -0.15f, -0.15f, 
      -0.15f, -0.15f 
    }; 
//you call the method above and just paste the bitmap you want to apply it and the float of above 
    yourbitmap = doSharpen(getbitmap, sharp)); 
} 

Вы также можете применять их непосредственно в растр без пустоты, его быстрого простого и есть хорошие результаты!

0

Вот значения, которые я использовал для цветовой температуры с помощью стрелки. (вы спросили их в комментарии к одному вопросу, который я задал)

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)); 
}