看起來像它——影象搜尋其實也不難
阿新 • • 發佈:2019-01-30
/** * 區域性均值的影象縮小 * @param pix 影象的畫素矩陣 * @param w 原影象的寬 * @param h 原影象的高 * @param m 縮小後圖像的寬 * @param n 縮小後圖像的高 * @return */ public static int[] shrink(int[] pix, int w, int h, int m, int n) { float k1 = (float) m / w; float k2 = (float) n / h; int ii = (int)(1 / k1); // 取樣的行間距 int jj = (int)(1 / k2); // 取樣的列間距 int dd = ii * jj; // int m=0 , n=0; // int imgType = img.getType(); int[] newpix = new int[m * n]; for (int j = 0; j < n; j++) { for (int i = 0; i < m; i++) { int r = 0, g = 0, b = 0; ColorModel cm = ColorModel.getRGBdefault(); for (int k = 0; k < jj; k++) { for (int l = 0; l < ii; l++) { r = r + cm.getRed(pix[(jj * j + k) * w + (ii * i + l)]); g = g + cm.getGreen(pix[(jj * j + k) * w + (ii * i + l)]); b = b + cm.getBlue(pix[ (jj * j + k) * w + (ii * i + l)]); } } r = r / dd; g = g / dd; b = b / dd; newpix[j * m + i] = 255 << 24 | r << 16 | g << 8 | b; // 255<<24 | r<<16 | g<<8 | b 這個公式解釋一下,顏色的RGB在記憶體中是 // 以二進位制的形式儲存的,從右到左1-8位表示blue,9-16表示green,17-24表示red // 所以"<<24" "<<16" "<<8"分別表示左移24,16,8位 // newpix[j*m + i] = new Color(r,g,b).getRGB(); } } return newpix; }