{
public GrayFilter()
{
this.canFilterIndexColorModel = true;
}
public int filterRGB(int x,int y,int rgb)
{
int alpha,r,g,b;
int gray;
alpha = rgb & (0xFF << 24);
r = (rgb >> 16) & 0xFF;
g = (rgb >> 8) & 0xFF;
b = (rgb >> 0) & 0xFF;
gray = (r + g + b) / 3;
return alpha | gray << 16 | gray << 8 | gray;
}
}
哪位大哥解释一下这个过滤类的原理,尤其是filterrgb()中的那一段>>和&,不是很懂的说。另外,谁了解imageproduce和imagecomsumer模式和observer和observable也请谈谈好吗?
3 个解决方案
#1
看上去这一段很简单呀?
作用是从传入的一个RGB颜色值转换成一个相应的灰度值吧。
传入的变量rgb的四个字节组成应该是:(每项一字节,从高到低)
alpha(24-31) 好象是亮度,又或者是对比度,光度?全忘了,还给老师了。 :)
R(16-23) 红色 G(8-15) 绿色 B(0-7)蓝色
alpha = rgb & (0xFF << 24); // 保留传入处理颜色的alpha值 24-31位,0xFF 就是8位1,24-31位向右移位24位到0-7位,用8位1将其余位去掉
r = (rgb >> 16) & 0xFF; // 从传入颜色取出对应红色的值,16-23位到低8位要右移16位
g = (rgb >> 8) & 0xFF; // 从传入颜色取出对应绿色的值,8-15位到低8位要右移8位
b = (rgb >> 0) & 0xFF; // 从传入颜色取出对应蓝色的值 0-7位不需移位
gray = (r + g + b) / 3; //每一色彩项的值,加起来除3就是对应的灰度值。
return alpha ¦ gray << 16 ¦ gray << 8 ¦ gray;
//保留alpha值,注意到 r, g, b 每一项都不大于 0xff, gray 也不大于0xff,因此 gray 只有后8位有效,其余位为零。
// 因此实际上 gray << 16 ¦ gray <<8 ¦ gray 相当于低位三个字节值均相同,再加上alpha值
// 从RGB色彩的含义来说,这个返回值代表的色彩就是一个有alpha值的纯灰度值。
作用是从传入的一个RGB颜色值转换成一个相应的灰度值吧。
传入的变量rgb的四个字节组成应该是:(每项一字节,从高到低)
alpha(24-31) 好象是亮度,又或者是对比度,光度?全忘了,还给老师了。 :)
R(16-23) 红色 G(8-15) 绿色 B(0-7)蓝色
alpha = rgb & (0xFF << 24); // 保留传入处理颜色的alpha值 24-31位,0xFF 就是8位1,24-31位向右移位24位到0-7位,用8位1将其余位去掉
r = (rgb >> 16) & 0xFF; // 从传入颜色取出对应红色的值,16-23位到低8位要右移16位
g = (rgb >> 8) & 0xFF; // 从传入颜色取出对应绿色的值,8-15位到低8位要右移8位
b = (rgb >> 0) & 0xFF; // 从传入颜色取出对应蓝色的值 0-7位不需移位
gray = (r + g + b) / 3; //每一色彩项的值,加起来除3就是对应的灰度值。
return alpha ¦ gray << 16 ¦ gray << 8 ¦ gray;
//保留alpha值,注意到 r, g, b 每一项都不大于 0xff, gray 也不大于0xff,因此 gray 只有后8位有效,其余位为零。
// 因此实际上 gray << 16 ¦ gray <<8 ¦ gray 相当于低位三个字节值均相同,再加上alpha值
// 从RGB色彩的含义来说,这个返回值代表的色彩就是一个有alpha值的纯灰度值。
#2
to:luodi(无知者无畏):
谢谢指点!!!
另外能说说java中ColorModel的应用吗?
谢谢指点!!!
另外能说说java中ColorModel的应用吗?
#1
看上去这一段很简单呀?
作用是从传入的一个RGB颜色值转换成一个相应的灰度值吧。
传入的变量rgb的四个字节组成应该是:(每项一字节,从高到低)
alpha(24-31) 好象是亮度,又或者是对比度,光度?全忘了,还给老师了。 :)
R(16-23) 红色 G(8-15) 绿色 B(0-7)蓝色
alpha = rgb & (0xFF << 24); // 保留传入处理颜色的alpha值 24-31位,0xFF 就是8位1,24-31位向右移位24位到0-7位,用8位1将其余位去掉
r = (rgb >> 16) & 0xFF; // 从传入颜色取出对应红色的值,16-23位到低8位要右移16位
g = (rgb >> 8) & 0xFF; // 从传入颜色取出对应绿色的值,8-15位到低8位要右移8位
b = (rgb >> 0) & 0xFF; // 从传入颜色取出对应蓝色的值 0-7位不需移位
gray = (r + g + b) / 3; //每一色彩项的值,加起来除3就是对应的灰度值。
return alpha ¦ gray << 16 ¦ gray << 8 ¦ gray;
//保留alpha值,注意到 r, g, b 每一项都不大于 0xff, gray 也不大于0xff,因此 gray 只有后8位有效,其余位为零。
// 因此实际上 gray << 16 ¦ gray <<8 ¦ gray 相当于低位三个字节值均相同,再加上alpha值
// 从RGB色彩的含义来说,这个返回值代表的色彩就是一个有alpha值的纯灰度值。
作用是从传入的一个RGB颜色值转换成一个相应的灰度值吧。
传入的变量rgb的四个字节组成应该是:(每项一字节,从高到低)
alpha(24-31) 好象是亮度,又或者是对比度,光度?全忘了,还给老师了。 :)
R(16-23) 红色 G(8-15) 绿色 B(0-7)蓝色
alpha = rgb & (0xFF << 24); // 保留传入处理颜色的alpha值 24-31位,0xFF 就是8位1,24-31位向右移位24位到0-7位,用8位1将其余位去掉
r = (rgb >> 16) & 0xFF; // 从传入颜色取出对应红色的值,16-23位到低8位要右移16位
g = (rgb >> 8) & 0xFF; // 从传入颜色取出对应绿色的值,8-15位到低8位要右移8位
b = (rgb >> 0) & 0xFF; // 从传入颜色取出对应蓝色的值 0-7位不需移位
gray = (r + g + b) / 3; //每一色彩项的值,加起来除3就是对应的灰度值。
return alpha ¦ gray << 16 ¦ gray << 8 ¦ gray;
//保留alpha值,注意到 r, g, b 每一项都不大于 0xff, gray 也不大于0xff,因此 gray 只有后8位有效,其余位为零。
// 因此实际上 gray << 16 ¦ gray <<8 ¦ gray 相当于低位三个字节值均相同,再加上alpha值
// 从RGB色彩的含义来说,这个返回值代表的色彩就是一个有alpha值的纯灰度值。
#2
to:luodi(无知者无畏):
谢谢指点!!!
另外能说说java中ColorModel的应用吗?
谢谢指点!!!
另外能说说java中ColorModel的应用吗?