Как точить изображение в Android? - PullRequest
5 голосов
/ 08 августа 2011

Я хочу отточить изображение, мой код указан ниже:

 public Bitmap RuiHuaBitmap(Bitmap bitmap) {
    int width, height;
    height = bitmap.getHeight();
    width = bitmap.getWidth();
    int red, green, blue;
    int a1, a2, a3, a4, a5, a6, a7, a8, a9;
    Bitmap bmpBlurred = Bitmap.createBitmap(width, height,bitmap.getConfig());

    Canvas canvas = new Canvas(bmpBlurred);

    canvas.drawBitmap(bitmap, 0, 0, null);
    for (int i = 1; i < width - 1; i++) {
        for (int j = 1; j < height - 1; j++) {

            a1 = bitmap.getPixel(i - 1, j - 1);
            a2 = bitmap.getPixel(i - 1, j);
            a3 = bitmap.getPixel(i - 1, j + 1);
            a4 = bitmap.getPixel(i, j - 1);
            a5 = bitmap.getPixel(i, j);
            a6 = bitmap.getPixel(i, j + 1);
            a7 = bitmap.getPixel(i + 1, j - 1);
            a8 = bitmap.getPixel(i + 1, j);
            a9 = bitmap.getPixel(i + 1, j + 1);

            red = (Color.red(a1) + Color.red(a2) + Color.red(a3) + Color.red(a4) + Color.red(a6) + Color.red(a7) + Color.red(a8) + Color.red(a9)) *(-1)   + Color.red(a5)*9 ;
            green = (Color.green(a1) + Color.green(a2) + Color.green(a3) + Color.green(a4) + Color.green(a6) + Color.green(a7) + Color.green(a8) + Color.green(a9)) *(-1)  + Color.green(a5)*9 ;
            blue = (Color.blue(a1) + Color.blue(a2) + Color.blue(a3) + Color.blue(a4) + Color.blue(a6) + Color.blue(a7) + Color.blue(a8) + Color.blue(a9)) *(-1)   + Color.blue(a5)*9 ;

            bmpBlurred.setPixel(i, j, Color.rgb(red, green, blue));
        }
    }
    return bmpBlurred;
}

но я не могу получить идеальный эффект. Кто-нибудь может дать больше подсказки или сказать, в чем заключается ошибка в моем коде?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 08 августа 2011

Вам не хватает проверки диапазона значений rgb, переданных в Color.rgb ();вам нужно нормализовать значения rgb в диапазоне [0..255] перед вызовом метода Color.rgb ():

public static int rgb (int red, int green, int blue) так как: APIУровень 1

Возвращает цвет из красного, зеленого и синего компонентов.Альфа-компонент - это безупречность 255 (полностью непрозрачная).Значения этих компонентов должны быть [0..255], , но проверка диапазона не выполняется, поэтому, если они находятся вне диапазона, возвращаемый цвет не определен .Параметры красный Красный компонент [0..255] цвета зеленый Зеленый компонент [0..255] цвета синий Синий компонент [0..255] цвета

Ваша матрица свертки кажетсяхорошо для преобразования в виде шейпов:

 0  0  0  0  0  
 0 -1 -1 -1  0
 0 -1  9 -1  0
 0 -1 -1 -1  0 
 0  0  0  0  0

если вы считаете, что ваш эффект слишком силен, вы также можете попробовать:

 0  0  0  0  0  
 0  0 -1  0  0
 0 -1  5 -1  0
 0  0 -1  0  0 
 0  0  0  0  0

в качестве альтернативы

0 голосов
/ 28 марта 2018
 red = (Color.red(a1) + (Color.red(a2))*(-1) + Color.red(a3) + 
       (Color.red(a4))*(-1) + (Color.red(a6))*(-1) + Color.red(a7) + 
       (Color.red(a8))*(-1) + Color.red(a9))    + Color.red(a5)*5 ;
 if(red < 0 )
    red = 0;
 if(red > 255)
    red = 255;

green = (Color.green(a1) + (Color.green(a2)) *(-1) + Color.green(a3) + 
        (Color.green(a4)) *(-1) + (Color.green(a6))*(-1) + Color.green(a7) + 
        (Color.green(a8))*(-1) + Color.green(a9)) + Color.green(a5)*5 ;
if(green < 0 )
    green = 0;
if(green > 255)
    green = 255;

blue = (Color.blue(a1) + (Color.blue(a2))*(-1) + Color.blue(a3) + 
       (Color.blue(a4))*(-1) + (Color.blue(a6))*(-1) + Color.blue(a7) + 
       (Color.blue(a8)) *(-1) + Color.blue(a9))   + Color.blue(a5)*5 ;
if(blue < 0 )
    blue = 0;
if(blue > 255)
    blue = 255;
...