1. 程式人生 > >看起來像它——影象搜尋其實也不難

看起來像它——影象搜尋其實也不難

/**
	 * 區域性均值的影象縮小
	 * @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;
	}