import java.awt.Color;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
/**
* 我知道位運算是什麼,怎麼運算的,但我實在看不懂別人寫的位運算代碼,求高人指點我如何才能看懂別人寫的位運算代碼?
*
* 希望能得到詳細的回答,除了將這個類的所有位運算都解釋一遍,還請將位運算在java圖像處理中有哪些應用告訴我,謝謝!
*/
public class DyedImageUtils {
/**
* 根據指定顏色過濾像素
*
* @param pixel
* @param filterColor
* @return
*/
private static int filter(int pixel, Color filterColor) {
int alpha = pixel >> 24 & 0xff;// 為什麼要將pixel進行">> 24"呢,又為什麼要"& 0xff"呢,能解釋解釋這句代碼的意義嗎?
if (alpha > 0) {
pixel = gray(pixel);
return pixel & filterColor.getRGB();// 同上,這句"按位與"的代碼我也不明白為什麼要這麼做
} else {
return 0;
}
}
/**
* 處理顏色灰度
*
* @param rgb
* @return
*/
private static int gray(int rgb) {
int a = rgb & 0xff000000;// 同上,這句"按位與"的代碼我也不明白為什麼要這麼做
int r = rgb >> 16 & 0xff;// 同上,不明白為什麼要這麼做
int g = rgb >> 8 & 0xff;// 同上
int b = rgb & 0xff;// 同上
rgb = r * 77 + g * 151 + b * 28 >> 8;// 同上
return a | rgb << 16 | rgb << 8 | rgb;// 同上
}
/**
* 對圖片進行著色
*
* @param image
* @param color
* @return
*/
public static Image createDyedImage(Image image, Color color) {
if (color == null) {
return image;
} else {
if (image != null) {
int w = image.getWidth(null);
int h = image.getHeight(null);
int[] pixels = new int[w * h];
PixelGrabber pg = new PixelGrabber(image, 0, 0, w, h, pixels, 0, w);
try {
pg.grabPixels();
} catch (InterruptedException ex) {
ex.printStackTrace();
return null;
}
BufferedImage bi = new BufferedImage(w > 1 ? w : 1, h > 1 ? h : 1, BufferedImage.TYPE_INT_ARGB);
for (int i = 0; i < pixels.length; i++) {
int pixel = pixels[i];
int row = i / w;
int col = i % w;
if (color != null) {
if (pixel != 0) {
pixel = filter(pixel, color);
}
}
bi.setRGB(col, row, pixel);
}
return bi;
} else {
return null;
}
}
}
}
你要理解RGB的2進制格式,R,G,B的取值范圍是0-255,如果是ARGB,前面還有一個透明度0-255。255在2進制中占8位,也就是
ARGB像素格式(左邊最高位,右邊最低位):00000000RRRRRRRRGGGGGGGGBBBBBBBB。
到這個格式你那位移就清楚了,取A得值,只要後面24位都置成0,前8位為1,做與就行了。當然你要>>24&0xff也可以,只是沒必要。>>24後,再最後處理完灰度後還得<<24回來。
取R,G,B都一樣原理。