在android上模糊图像

2023-11-30

我想要模糊图像,我用过:

    public Bitmap mohu(Bitmap bmpOriginal,int hRadius,int vRadius) {
    int width, height, r,g, b, c,a, gry,c1,a1,r1,g1,b1,red,green,blue; 
    height = bmpOriginal.getHeight(); 
    width = bmpOriginal.getWidth(); 


     int iterations = 5;
     int[] inPixels = new int[width*height];
     int[] outPixels = new int[width*height];
       Bitmap bmpSephia = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bmpSephia);
        Paint paint = new Paint();
       int i=0;
       canvas.drawBitmap(bmpOriginal, 0, 0, null);
       for(int x=0; x < width; x++)  {
            for(int y=0; y< height; y++) {
                c = bmpOriginal.getPixel(x, y);
                inPixels[i]=c;
                i++;
            }
        }      

        for (int k = 0; k< iterations; k++ ) {
            blur( inPixels, outPixels, width, height, hRadius );
            blur( outPixels, inPixels, height, width,  vRadius );
        }
        bmpSephia.setPixels(outPixels, 0, width, 0, 0, width, height);
        return bmpSephia;
    }
public static void blur( int[] in, int[] out, int width, int height, int radius ) {
    int widthMinus1 = width-1;
    int tableSize = 2*radius+1;
    int divide[] = new int[256*tableSize];

    for ( int i = 0; i < 256*tableSize; i++ )
        divide[i] = i/tableSize;

    int inIndex = 0;

    for ( int y = 0; y < height; y++ ) {
        int outIndex = y;
        int ta = 0, tr = 0, tg = 0, tb = 0;

        for ( int i = -radius; i <= radius; i++ ) {
            int rgb = in[inIndex + ImageMath.clamp(i, 0, width-1)];
            ta += (rgb >> 24) & 0xff;
            tr += (rgb >> 16) & 0xff;
            tg += (rgb >> 8) & 0xff;
            tb += rgb & 0xff;
        }

        for ( int x = 0; x < width; x++ ) {
            out[ outIndex ] = (divide[ta] << 24) | (divide[tr] << 16) | (divide[tg] << 8) | divide[tb];

            int i1 = x+radius+1;
            if ( i1 > widthMinus1 )
                i1 = widthMinus1;
            int i2 = x-radius;
            if ( i2 < 0 )
                i2 = 0;
            int rgb1 = in[inIndex+i1];
            int rgb2 = in[inIndex+i2];

            ta += ((rgb1 >> 24) & 0xff)-((rgb2 >> 24) & 0xff);
            tr += ((rgb1 & 0xff0000)-(rgb2 & 0xff0000)) >> 16;
            tg += ((rgb1 & 0xff00)-(rgb2 & 0xff00)) >> 8;
            tb += (rgb1 & 0xff)-(rgb2 & 0xff);
            outIndex += height;
        }
        inIndex += width;

    }
}
 ///
  public static float clamp(float x, float a, float b) {
    return (x < a) ? a : (x > b) ? b : x;
}

有些图像的方法很好,有些图像效果不好,看起来很粗鲁,你能给我一些建议吗,我读过http://www.jhlabs.com/ip/blurring.html and http://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/Image-enhance.doc.html#51172,但我找不到适合android的好方法


您的中间图像是 RGB565。这意味着16位,R为5位,G为6位,B为5位。如果原始图像是RGB888,那么模糊后看起来会很糟糕。不能创建与原始格式相同的中间图像吗?

另外,如果原始图像是RGB888,如何转换为565?你的代码有:

c = bmpOriginal.getPixel(x, y);
inPixels[i]=c;

看起来没有受控转换。

您的模糊函数适用于 ARGB 图像。由于您对 565 进行了硬编码,因此效率低下,如果原始图像是 ARGB8888,那么转换为 RGB565 将会对 alpha 通道产生奇怪的结果。

如果这个答案还不够,那么查看此代码创建的一些“坏”图像将会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在android上模糊图像 的相关文章

随机推荐

  • Future.wait() 用于多个 future

    当我的设备没有互联网连接时 我试图捕获错误 我构建了 2 个未来方法 1 个用于导入 json 1 个用于查看数据库 我有一个未来的构建器 它应该在构建网格视图之前等待两个未来完成 但似乎由于连接错误而过早地调用了offlineFlashC
  • 通过 OBEX Object PushProfile 通过蓝牙接收文件

    我的设备使用 OBEX 对象推送配置文件 OPP 通过蓝牙发送数据 使用 adb logcat 我看到我的 Android 设备收到一个连接 但中止此连接 08 22 11 14 37 939 I BtOppRfcommListener 2
  • xslt1.0 替换不起作用

    我的 URL 带有一些特殊字符 我想替换它们 并且我正在使用 xslt 1 0 所以我编写如下代码
  • 限制 Docker 仅公开来自特定 IP 地址的端口

    如何限制 Docker 暴露的容器端口仅来自 IP 列表 只有此 IP 列表才能访问此端口 我尝试过 iptables I DOCKER p tcp dport PORT X j REJECT reject with icmp port u
  • GDB远程调试:无法停止线程

    我有一个数据库服务器在一个目标上 我像这样发射gdbserver 2345 bin ls 接下来 我从主机连接 gdb 并尝试发出下一个命令 gdb target remote 192 168 1 2 2345 Remote debuggi
  • 在 Access SQL 中查询“工作周”

    我有一个来自 MS Excel 2007 的公式 它返回特定月份内特定日期的工作周 B1 IF AND WEEKDAY A2 1 lt gt 1 A2 DATE YEAR A2 MONTH A2 1 A2 WEEKDAY A2 1 7 IF
  • 用于向量和矩阵计算的高性能数学库

    在哪里可以找到矢量和矩阵计算的快速库 我需要高性能 Update I need it for games calculations Go for Blaze Also check out the bench marking in paral
  • 即使显式调用析构函数后也会自动销毁对象

    以下程序 include
  • 应用程序在 iOS 9 上卡在启动屏幕中且没有错误

    我的应用程序在 iPhone 和模拟器上的 iOS 9 中都卡在启动屏幕上 我可以在 iOS 8 或更低版本的设备和模拟器上运行它 没有任何问题 我的同事在开发同一个应用程序时也遇到了完全相同的问题 没有错误或任何东西 只是挂在启动屏幕上
  • 在 Android 中的 FirestoreRecyclerAdapter 中显示 ServerValue.TIMESTAMP

    我想在列表中显示服务器时间戳 实际上是日期 这FirestoreRecyclerAdapter由此类提供 仅保留时间戳相关方法 public class Lista private Long timestamp private Map
  • 基于日期比较R的子集数据集

    我有一个数据集 如下所示 Col1 Col2 Col3 CutoffDate 12001 Yes 2008 08 15 2008 08 10 12001 Yes 2008 08 22 2008 08 10 12001 Yes 2008 08
  • 如何修复从 GEOS 转换为 s2 引起的球面几何误差

    我有同样的问题连接空间数据时如何解决球面几何故障 我以前可以使用的代码现在不能用于从 GEOS 到 s2 的转换 我不确定如何创建此错误的可重现示例 sf 包附带的示例数据集可以很好地使用此代码 因为我确信它们也已更新为可以与 s2 包一起
  • 带控件的表单级别的按键

    我想知道是否可以处理KeyPress表单级别的事件当有控制时以一种形式 当表单上没有控件时 我可以实现此目的 但是当我添加某些内容 例如按钮 时 表单会失去焦点 并且我无法将其返回 即使使用Me Focus 焦点仍位于按钮上 有办法做到吗
  • 成功更改 JS 中的不可变或原始数据类型。那么这些是原语还是 JS 概念是错误的?

    据我所知 JS 中有 4 个原语 直接存储值 而不是引用另一个内存位置的原语 String Number Boolean Symbol 我没有数undefined null 因为它们是特殊的数据类型 并且不通过继承链共享对象构造函数 现在
  • 清除 ASP.NET 中的文本框历史记录

    如何清除文本框的历史记录 我已设置 autocomplet off 并将 AutoCompleteType 设置为禁用 当我在 Chrome Firefox 中双击文本框时 会出现历史记录 文本 因此当我单击它时 文本将被插入到文本框中 有
  • 何时使用 OpenCL API 标量数据类型?

    我一直无法理解何时使用 OpenCL API 数据类型 如 cl float cl uchar 等 可以在此处找到 http www khronos org registry cl sdk 1 0 docs man xhtml scalar
  • Java:如何使用 switch 语句[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Java 中比较字符串 我无法理解如何使用 Java switch 语句 在执行其中一个 case 语句中的方法后 它仍然会转到默认语句并运行该语句 这是代码 Scanner scanner
  • Sympy:求解具有初始条件误差的微分方程

    SinceSympy版本 1 2 PythonSympy已经实现了在给定一些初始条件的情况下求解简单微分方程中的常数的能力 我试图测试此功能 但不断出现我不知道如何解决的错误 The 文档表示初始条件的格式如下 我尝试遵循实现该功能的实际拉
  • Java 和 SSH:维护连接

    目标 通过一个连接和多个会话或一个持久会话远程控制 ssh 服务器 问题 1 我目前使用 sshj 通过 SSH 进行一些远程控制 它运行良好 但我似乎无法让它正确处理提示 主机不提供真正的root权限 只提供sudo i 所以我需要先登录
  • 在android上模糊图像

    我想要模糊图像 我用过 public Bitmap mohu Bitmap bmpOriginal int hRadius int vRadius int width height r g b c a gry c1 a1 r1 g1 b1