基本的公式:将RGB转换为[0,255]之间灰度的公式:
grey=0.299 * red + 0.587 * green + 0.114 * blue;
案例:
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/source"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/gg"
/>
<ImageView
android:id="@+id/destination"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取反"
android:onClick="remove"
/>
</LinearLayout>
activity代码:
public class ImageJAndroidActivity extends Activity {
ImageView sourceImage;
ImageView destinationImage;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sourceImage=(ImageView) findViewById(R.id.source);
destinationImage=(ImageView) findViewById(R.id.destination);
}
//灰度化
public void remove(View v){
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.gg);
int width=bitmap.getWidth();
int height=bitmap.getHeight();
int[] pixel=new int[width*height];
bitmap.getPixels(pixel, 0, width, 0, 0, width, height);
for(int y=0;y<height;y++){
for(int x=0;x<width;x++){
int a=pixel[y*width+x]>>24&0xff;
int r=pixel[y*width+x]>>16&0xff;
int g=pixel[y*width+x]>>8&0xff;
int b=pixel[y*width+x]&0xff;
int grey=(int)(0.299 * r + 0.587 * g + 0.114 * b);
pixel[y*width+x]=(a<<24)|grey<<16|grey<<8|grey;
}
}
Bitmap newBitmap=Bitmap.createBitmap(width, height,Config.RGB_565);
newBitmap.setPixels(pixel, 0, width, 0, 0, width, height);
destinationImage.setImageBitmap(newBitmap);
}
显示效果: