2016-01-18 10 views
0

Я сейчас разрабатываю приложение для Android в Xamarin, и я застрял на небольшом шаге. Я искал interwebs для заостренного alogrithm для MonoDroid, и все, что я нахожу, похоже, не работает. Может ли кто-нибудь предоставить мне какой-нибудь скрипт или какую-то документацию? Спасибо заранее.Как заострить растровое изображение?

+1

См. Этот ответ http://stackoverflow.com/questions/903632/sharpen-on-a-bitmap-using-c-sharp – MaLio

ответ

1

Великий ответ на Mohit ориентирован на класс .NET System.Drawing.Bitmap. Android имеет другой класс рисования и представление цвета. Вы можете найти документацию на цвет здесь: https://developer.xamarin.com/api/type/Android.Graphics.Color/

The A, значения R, G и B от цвета могут быть получены с помощью:

int color = bitmap.GetPixel(x, y); 
var androidColor = new Color(color); 
byte r = androidColor.R; 
byte g = androidColor.G; 
byte b = androidColor.B; 
byte alpha = androidColor.A; 

Должна быть возможность использовать предоставленный алгоритм как есть с этими изменениями.

1

Это может быть полезно для вас

public static Bitmap ImageSharpen(Bitmap InpImg) 
{ 
    Bitmap sharpenImage = new Bitmap(InpImg.Width, InpImg.Height); 

    int wdth = InpImg.Width; 
    int hght = InpImg.Height; 

    double[,] filter = new double[3, 3]; 

    filter[0, 0] = filter[0, 1] = filter[0, 2] = filter[1, 0] = filter[1, 2] = filter[2, 0] = filter[2, 1] = filter[2, 2] = -1; 
    filter[1, 1] = 9; 

    double factor = 1.0; 
    double bias = 0.0; 

    Color[,] result = new Color[InpImg.Width, InpImg.Height]; 

    for (int x = 0; x < wdth; ++x) 
    { 
     for (int y = 0; y < hght; ++y) 
     { 
      double red = 0.0, green = 0.0, blue = 0.0; 
      Color imageColor = InpImg.GetPixel(x, y); 
      for (int filterX = 0; filterX < 3; filterX++) 
      { 
       for (int filterY = 0; filterY < 3; filterY++) 
       { 
        int imageX = (x - 3/2 + filterX + wdth) % wdth; 
        int imageY = (y - 3/2 + filterY + hght) % hght; 
        Color imageColor = InpImg.GetPixel(imageX, imageY); 
        red += imageColor.R * filter[filterX, filterY]; 
        green += imageColor.G * filter[filterX, filterY]; 
        blue += imageColor.B * filter[filterX, filterY]; 
       } 
       int r = Math.Min(Math.Max((int)(factor * red + bias), 0), 255); 
       int g = Math.Min(Math.Max((int)(factor * green + bias), 0), 255); 
       int b = Math.Min(Math.Max((int)(factor * blue + bias), 0), 255); 

       result[x, y] = Color.FromArgb(r, g, b); 
      } 
     } 
    } 
    for (int i = 0; i < wdth; ++i) 
    { 
     for (int j = 0; j < hght; ++j) 
     { 
      sharpenImage.SetPixel(i, j, result[i, j]); 
     } 
    } 
    return sharpenImage; 
} 
+0

Я уже тестировал это. Проблема в том, что GetPixel возвращает int не цвет, хотя в doucumentation говорится, что он возвращает объект Color. – user3128955

+1

Android использует цвет и int взаимозаменяемые временами. Это связано с тем, что цвет - это просто int, где определенные байты являются значениями R, G, B и A. Вы можете использовать статические методы Android Color для извлечения RGBA из int, возвращаемого GetPixel. Вы можете увидеть структуру Color и связанные с ней методы: https://developer.xamarin.com/api/type/Android.Graphics.Color/ – dylansturg

+0

Спасибо. Не могли бы вы поместить этот комментарий в качестве ответа для других нубов вроде меня? – user3128955

Смежные вопросы