public static char[][] imageToASCII(Image img) {
		BufferedImage bufImg = toGrayScale(img);
		double grayVal;

		// Get the size of grouping~
		String mStr = JOptionPane
				.showInputDialog("How many pixel to you want one ASCII code to represent?\n    Width :");
		int m = Integer.parseInt(mStr);
		String nStr = JOptionPane
				.showInputDialog("How many pixel to you want one ASCII code to represent?\n   Height :");
		int n = Integer.parseInt(nStr);

		// Size of the result array is declared~
		String[][] asciiPixel = new String[(int) Math.ceil(bufImg.getHeight()
				/ n)][(int) Math.ceil(bufImg.getWidth() / m)];
		char[][] asciiChar = new char[(int) Math.ceil(bufImg.getHeight() / n)][(int) Math
				.ceil(bufImg.getWidth() / m)];

		// Conver the group of pixels one by one, group by group~
		int b = 0;
		for (int j = 0; j < bufImg.getHeight(); j += n) {
			int a = 0;
			for (int i = 0; i < bufImg.getWidth(); i += m) {
				// Calculate the total of all the color values in each rows
				// inside the inputed group~ :)
				int[] colorY = new int[n];
				for (int y = 0; y < n; y++) {
					int totalColorX = 0;
					for (int x = 0; x < m; x++) {
						if ((i + x) >= bufImg.getWidth()
								|| (j + y) >= bufImg.getHeight())
							totalColorX += 0;
						else {
							int values = bufImg.getRGB(i + x, j + y);
							Color colorX = new Color(values);
							totalColorX += colorX.getRed();
						}
					}
					colorY[y] = totalColorX;
				}

				// Average the pixels' color value~
				double totalColor = 0.0;
				for (int noOfArray = 0; noOfArray < colorY.length; noOfArray++) {
					totalColor += colorY[noOfArray];
				}
				double average = totalColor / (m * n);
				grayVal = average;

				// Turn different kind of gray to different labels~ :D
				if (grayVal >= 50)
					asciiPixel[b][a] = "#";
				if (grayVal >= 70)
					asciiPixel[b][a] = "8";
				if (grayVal >= 100)
					asciiPixel[b][a] = "&";
				if (grayVal >= 130)
					asciiPixel[b][a] = "o";
				if (grayVal >= 160)
					asciiPixel[b][a] = ":";
				if (grayVal >= 180)
					asciiPixel[b][a] = "*";
				if (grayVal >= 200)
					asciiPixel[b][a] = ".";
				if (grayVal >= 230)
					asciiPixel[b][a] = " ";
				if (grayVal < 50)
					asciiPixel[b][a] = "@";

				// Change all those strings into characters~
				asciiChar[b][a] = asciiPixel[b][a].charAt(0);

				// Counter~
				if (a < ((int) Math.ceil(bufImg.getWidth() / m) - 1))
					a++;
			}
			// Counter~
			if (b < ((int) Math.ceil(bufImg.getHeight() / n) - 1))
				b++;
		}
		return asciiChar;// Simpliy return the product and happy~ ^^
	}