【问题标题】:How to sharpen a Bitmap? [closed]如何锐化位图? [关闭]
【发布时间】:2016-01-18 06:47:17
【问题描述】:

我现在正在 Xamarin 中开发一个适用于 Android 的应用程序,但我被困在了一小步上。我在互联网上搜索 MonoDroid 的锐化算法,但我发现的一切似乎都不起作用。任何人都可以为我提供一些原样的脚本或一些文档吗? 提前致谢。

【问题讨论】:

标签: c# .net xamarin xamarin.android


【解决方案1】:

Mohit 的最佳答案是针对 .NET System.Drawing.Bitmap 类。 Android 有不同的绘图类和颜色表示。您可以在此处找到有关颜色的文档:https://developer.xamarin.com/api/type/Android.Graphics.Color/

可以通过以下方式获得颜色的 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;

应该可以按原样使用提供的算法并进行这些修改。

【讨论】:

    【解决方案2】:

    这可能对你有帮助

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

    【讨论】:

    • 我已经对此进行了测试。问题是 GetPixel 返回一个 int 而不是颜色,即使文档说它返回一个 Color 对象
    • Android 有时会交替使用 Color 和 int。这是因为 Color 只是一个 int,其中某些字节是 R、G、B 和 A 值。您可以使用 Android Color 静态方法从 GetPixel 返回的 int 中提取 RGBA。您可以在此处查看 Color 结构和相关方法:developer.xamarin.com/api/type/Android.Graphics.Color
    • 谢谢。你能把这个评论作为像我这样的其他菜鸟的答案吗?
    猜你喜欢
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2011-06-26
    • 2011-10-22
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多