所以16位运算下最好的计算公式是使用7位精度,比先前那个系数缩放100倍的精度高,而且速度快:
Gray = (
R*38
+ G*75
+ B*15
)
>> 7
R*38
+ G*75
+ B*15
)
>> 7
其实最有意思的还是那个2位精度的,完全可以移位优化:
Gray = (
R + (
WORD)
G<<1
+ B)
>> 2
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 << 8
)
| b)
| 0xff000000;
}
return
rgx;
}
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 << 8
)
| b)
| 0xff000000;
}
return
rgx;
}
以上是别人写的算法,我把这个算法用到游戏中处理角色死亡的画面,整个屏幕变灰,刷新也变慢,这个效果是很COOL的~~