程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> java-如何才能看懂別人寫的位運算代碼?

java-如何才能看懂別人寫的位運算代碼?

編輯:編程綜合問答
如何才能看懂別人寫的位運算代碼?
 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都一樣原理。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved