`
buerkai
  • 浏览: 168699 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

手机游戏J2ME开发中彩色转灰度算法的应用

阅读更多
一、基础

对于彩色转灰度,有一个很著名的心理学公式:

Gray = R*0.299 + G*0.587 + B*0.114二、整数算法

而实际应用时,希望避免低速的浮点运算,所以需要整数算法。

注意到系数都是3位精度的没有,我们可以将它们缩放1000倍来实现整数运算算法:

Gray = (R*299 + G*587 + B*114 + 500) / 1000RGB一般是8位精度,现在缩放1000倍,所以上面的运算是32位整型的运算。注意后面那个除法是整数除法,所以需要加上500来实现四舍五入。

就是由于该算法需要32位运算,所以该公式的另一个变种很流行:

Gray = (R*30 + G*59 + B*11 + 50) / 100但是,虽说上一个公式是32位整数运算,但是根据80x86体系的整数乘除指令的特点,是可以用16位整数乘除指令来运算的。而且现在32位早普及了(AMD64都出来了),所以推荐使用上一个公式。

三、整数移位算法

上面的整数算法已经很快了,但是有一点仍制约速度,就是最后的那个除法。移位比除法快多了,所以可以将系数缩放成 2的整数幂。

习惯上使用16位精度,2的16次幂是65536,所以这样计算系数:

0.299 * 65536 = 19595.264 ≈ 19595

0.587 * 65536 + (0.264) = 38469.632 + 0.264 = 38469.896 ≈ 38469

0.114 * 65536 + (0.896) = 7471.104 + 0.896 = 7472可能很多人看见了,我所使用的舍入方式不是四舍五入。四舍五入会有较大的误差,应该将以前的计算结果的误差一起计算进去,舍入方式是去尾法:

写成表达式是:

Gray = (R*19595 + G*38469 + B*7472) >> 162至20位精度的系数:

Gray = (R*1 + G*2 + B*1) >> 2

Gray = (R*2 + G*5 + B*1) >> 3

Gray = (R*4 + G*10 + B*2) >> 4

Gray = (R*9 + G*19 + B*4) >> 5

Gray = (R*19 + G*37 + B*8) >> 6

Gray = (R*38 + G*75 + B*15) >> 7

Gray = (R*76 + G*150 + B*30) >> 8

Gray = (R*153 + G*300 + B*59) >> 9

Gray = (R*306 + G*601 + B*117) >> 10

Gray = (R*612 + G*1202 + B*234) >> 11

Gray = (R*1224 + G*2405 + B*467) >> 12

Gray = (R*2449 + G*4809 + B*934) >> 13

Gray = (R*4898 + G*9618 + B*1868) >> 14

Gray = (R*9797 + G*19235 + B*3736) >> 15

Gray = (R*19595 + G*38469 + B*7472) >> 16

Gray = (R*39190 + G*76939 + B*14943) >> 17

Gray = (R*78381 + G*153878 + B*29885) >> 18

Gray = (R*156762 + G*307757 + B*59769) >> 19

Gray = (R*313524 + G*615514 + B*119538) >> 20仔细观察上面的表格,这些精度实际上是一样的:3与4、7与8、10与11、13与14、19与20

所以16位运算下最好的计算公式是使用7位精度,比先前那个系数缩放100倍的精度高,而且速度快:

Gray = (R*38 + G*75 + B*15) >> 7其实最有意思的还是那个2位精度的,完全可以移位优化:

Gray = (R + (WORD)G<<1 + B) >> 2由于误差很大,所以做图像处理绝不用该公式(最常用的是16位精度)。但对于游戏编程,场景经常变化,用户一般不可能观察到颜色的细微差别,所以最常用的是2位精度。

public static int[] Turngrey(Image image) {
    int rgx[];
    rgx = new int[image.getWidth() * image.getHeight()];
    image.getRGB(rgx, 0, image.getWidth(), 0, 0, image.getWidth(),
                 image.getHeight()); //获得图片的ARGB值
    int r, g, b;
    for (int j = 0; j < rgx.length; j++) {
        r = (rgx[j] & 0x00ff0000) >> 16;
        g = (rgx[j] & 0x0000ff00) >> 8;
        b = rgx[j] & 0x000000ff;
        if ((rgx[j] == 0x00FFFFFF)) {
            continue;
        }
        r = g;
        b = g;

        rgx[j] = ((r << 16) | (g << | b) | 0xff000000;
    }
    return rgx;
}
分享到:
评论

相关推荐

    J2ME开发中彩色转灰度算法的应用

    在J2ME(Java 2 Micro Edition)开发中,彩色图像转换为灰度图像是一项常见的图像处理任务。本文主要探讨了如何在有限的资源条件下,使用整数算法和移位运算来实现这一转换,以提高效率。 首先,我们了解一个基本的...

    J2ME开发 J2ME开发 J2ME开发

    2. **MIDP (Mobile Information Device Profile)**:MIDP是J2ME中最常见的框架,用于开发移动应用程序,包括用户界面组件和网络通信功能。 3. **CLDC (Connected Limited Device Configuration)**:这是J2ME的基础...

    J2ME手机游戏开发毕业论文

    这篇毕业论文深入探讨了J2ME在手机游戏开发中的应用,揭示了该技术的关键特性、开发流程以及面临的挑战。 **一、J2ME基础** J2ME由配置和 profiles 组成,配置定义了最小的Java运行时环境,而profiles则针对特定...

    《J2ME手机游戏开发技术详解》

    《J2ME手机游戏开发技术详解》《J2ME手机游戏开发技术详解》《J2ME手机游戏开发技术详解》《J2ME手机游戏开发技术详解》《J2ME手机游戏开发技术详解》《J2ME手机游戏开发技术详解》《J2ME手机游戏开发技术详解》...

    基于j2me的手机游戏开发

    在2000年代初,J2ME是手机游戏开发的主要平台,尤其在非智能手机(如诺基亚的Symbian系统手机)上广泛应用。本篇将深入探讨如何使用J2ME进行手机游戏开发。 ### 1. J2ME架构与配置 J2ME由两部分构成:K Virtual ...

    j2me手机游戏开发技术详解

    ### j2me手机游戏开发技术详解 #### J2ME概述 **1.1 J2ME体系结构** **1.1.1 JAVA技术的版本** Java技术根据不同的应用场景分为三个主要版本: - **J2SE(Java 2 Platform, Standard Edition)**:标准版,面向...

    j2me 手机游戏 开发基础教程

    Java 2 Micro Edition(J2ME)是Java平台的一个子集,专为资源有限的嵌入式设备,包括早期的智能手机和平板电脑,设计用于开发移动应用程序,尤其是手机游戏。本教程将引导开发者入门J2ME手机游戏的开发过程,提供...

    J2ME手机游戏开发技术详解源码

    本压缩包文件提供了J2ME手机游戏开发的技术详解源码,旨在帮助开发者深入理解J2ME游戏开发的过程,通过实际的代码示例进行学习和实践。 在J2ME手机游戏开发中,有几个核心知识点: 1. **MIDP (Mobile Information ...

    J2ME游戏开发J2ME游戏开发

    Java 2 Micro Edition (J2ME) 是一种Java平台,主要用于开发和部署在移动设备、嵌入式系统以及家用电器上的应用程序,尤其在早期的智能手机和功能手机上广泛用于游戏开发。J2ME以其轻量级、跨平台的特性,成为了移动...

    j2me游戏开发 经典教程

    j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发

    J2ME手机游戏开发适合初学者

    MIDP是J2ME中的核心部分,它为开发手机游戏提供了必要的API。MIDP包含用户界面组件,如Canvas,允许开发者创建自定义图形界面,这是游戏的基本元素。此外,它还包含了一个轻量级的用户接口库( Lightweight User ...

    J2ME手机游戏开发详解

    J2ME手机游戏开发详解--快速入门难点剖析商业案例光盘源码。本书是一本介绍J2ME无线开发的实训教程,面向具有基本J2ME无线开发基础的开发人员。本书通过7个典型的例子,从不同的方面分别介绍了J2ME游戏开发的实用...

    j2me开发手机游戏

    **J2ME手机游戏开发详解** Java 2 Micro Edition(J2ME)是Java平台的一个子集,专门设计用于资源有限的设备,如早期的移动电话和掌上设备。在2000年代中期,J2ME是开发手机游戏的主流技术之一。本篇将深入探讨J2M

    J2ME手机应用项目开发实践

    这个“J2ME手机应用项目开发实践”是一个深入探讨如何利用J2ME进行手机应用开发的资源包,包含了实际项目的源代码,为开发者提供了宝贵的参考和学习材料。 J2ME的应用框架主要由两部分构成:MIDP(Mobile ...

    J2ME开发的小游戏

    【J2ME开发的小游戏】:Java Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,如早期的智能手机。它提供了轻量级的框架来开发应用程序,其中包括游戏。"是男人就下一百层"是一款经典的...

    基于J2ME的手机游戏开发 毕业论文

    Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式系统和移动设备,尤其是手机应用开发。本论文聚焦于利用J2ME技术进行手机游戏开发,旨在探讨如何在资源有限的移动设备上实现有趣且性能良好的游戏...

    J2me手机游戏开发环境配置.doc

    J2ME(Java 2 Micro Edition)是Java平台的一个子集,主要用于开发移动设备、嵌入式设备上的应用程序,包括手机游戏。以下是对J2ME手机游戏开发环境配置的详细解释: 首先,为了进行J2ME游戏开发,我们需要下载并...

Global site tag (gtag.js) - Google Analytics