hexagon이미지를 만드는 방법입니다.

방법은 간단히.. 이미지의 중심점을 잡고, 반지름을 구한 뒤 중심점에서 각 0도, 60도, 120도, 180도, 240도, 360도 위치의 점을 잇는 선을 그은 뒤 그에 해당하는 이미지만 뽑아내느 방법입니다.

이걸 활용하면 android에서 사용할 HexagonImageView도 만들어 볼 수 있겠죠.

코드는 아래와 같습니다.


private Bitmap getHexagonImage(Bitmap toTransform) {
    Bitmap output = Bitmap.createBitmap(toTransform.getWidth(),
            toTransform.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    int radius = 0;
    int width = toTransform.getWidth();
    int height = toTransform.getHeight();
    int centerX = width / 2;
    int centerY = height / 2;

    if (width >= height) {
        radius = height / 2;
    } else {
        radius = width / 2;
    }

    Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, toTransform.getWidth(),
            toTransform.getHeight());

    Path path = new Path();
    for (int i = 0; i < 6; i++) {

        int posX = (int) (centerX + radius * Math.cos(Math.toRadians(i * 60 - 30)));
        int posY = (int) (centerY + radius * Math.sin(Math.toRadians(i * 60 - 30)));
        if (i == 0) {
            path.moveTo(posX, posY);
        } else {
            path.lineTo(posX, posY);
        }
    }

    path.close();
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(Color.parseColor("#FFFFFF"));
    canvas.drawPath(path, paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(toTransform, rect, rect, paint);

    return output;
}



	public static Bitmap doGreyscale(Bitmap src)
	{
		final double GS_RED = 0.299;
		final double GS_GREEN = 0.587;
		final double GS_BLUE = 0.114;
		
		int width = src.getWidth();
		int height = src.getHeight();

		Bitmap resultBitmap = Bitmap.createBitmap(width, height, src.getConfig());
		int A, R, G, B;
		int pixel;

		for (int x = 0; x < width; ++x)
		{
			for (int y = 0; y < height; ++y)
			{
				pixel = src.getPixel(x, y);
				A = Color.alpha(pixel);
				R = Color.red(pixel);
				G = Color.green(pixel);
				B = Color.blue(pixel);
				R = G = B = (int) (GS_RED * R + GS_GREEN * G + GS_BLUE * B);
				resultBitmap.setPixel(x, y, Color.argb(A, R, G, B));
			}
		}

		return resultBitmap;
	}



     public static Bitmap doInvert(Bitmap src)
     {
          int A, R, G, B;
          int pixelColor;
          int height = src.getHeight();
          int width = src.getWidth();
         
          Bitmap returnBitmap = Bitmap.createBitmap(width, height, src.getConfig());

          for (int y = 0; y < height; y++)
          {
               for (int x = 0; x < width; x++)
               {
                    pixelColor = src.getPixel(x, y);
                    A = Color.alpha(pixelColor);
                    R = 255 - Color.red(pixelColor);
                    G = 255 - Color.green(pixelColor);
                    B = 255 - Color.blue(pixelColor);
                    returnBitmap.setPixel(x, y, Color.argb(A, R, G, B));
               }
          }

          return returnBitmap;
     }

안드로이드에서 이미지 효과를 주는 방법으로 상하/좌우 반전 이미지를 만드는 방법에 대해서 설명해 보겠습니다.
처음에는 이런 효과를 만들 대... Image Processing을 해야 하는거 아닌지 고민을 하게 되었었는데.
친절하게도.. 안드로이드 SDK에 이런 효과를 주는 기능이 있었습니다.
찾아보면...다 나오더군요 ㅎㅎ

Matrix matrix = new Matrix();


이 클래스를 이요하여 효과를 주면 되겠습니다.

코드는.

//원본 이미지 Bitmap
Bitmap originalImg = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
//좌우반전 이미지 효과 및 Bitmap 만들기
Matrix sideInversion = new Matrix();
sideInversion.setScale(-1, 1);
Bitmap sideInversionImg = Bitmap.createBitmap(originalImg, 0, 0,
	originalImg.getWidth(), originalImg.getHeight(), sideInversion, false);

//상하반전 이미지 효과 및 Bitmap 만들기
Matrix updownInversion = new Matrix();
updownInversion.setScale(1, -1);
Bitmap updownInversionImg = Bitmap.createBitmap(originalImg, 0, 0,
	originalImg.getWidth(), originalImg.getHeight(), updownInversion, false);
		
imageView1.setImageBitmap(originalImg);
imageView2.setImageBitmap(sideInversionImg);
imageView3.setImageBitmap(updownInversionImg);

이렇게 하면 됩니다.
이걸 포스트를 만들다 보니... 안드로이드 Bitmap에 대해서 써야 하는거 아닌지 하는 생각이 들기도 하는구요.
이런식으로 했을 경우 결과 화면은

이런 결과 화면이 보이게 됩니다.
예제 소스도 첨부 합니다
참고하시기 바랍니다. :)


+ Recent posts