Tag Archives: Camera

[NGUI] Tutorial Step 1 – Camera, Anchor, Panel

사용자 삽입 이미지
사용자 삽입 이미지
1. 새로운 Scene을 생성합니다.
2. Main Camera를 선택한 후 삭제 합니다.
3. NGUI메뉴를 선택해 Open the UI Wizard를 선택합니다. 위와 같은 창이 뜹니다.
4. 이 패널에서는 UI가 어떤 레이어에 위치할지를 선택할 수 있습니다.
    하지만 여기서는 일단 Default 레이어와 Simple2D카메라를 선택하도록 하겠습니다.
5. 이상입니다. 이제 UI가 사용가능하도록 준비되었습니다.

존재하는 프로젝트에서 NGUI를 사용할 경우 Step 2를 생략하시기 바랍니다. 그리고 Step 4 이전에 적절한 UI 레이어를 지정하여 사용하는것이 좋습니다. 다른 카메라(Main Camera같은)는 지정한 UI 레이어에 그리지 않도록 주의해야 합니다.

진행에 앞서 UI 마법사가 생성한 결과물에 대해 살펴보겠습니다.

사용자 삽입 이미지1. 2D Root 오브젝트는 UIRoot 스크립트를 포함합니다. 이 스크립트는 오브젝트의 크기가 2/스크린높이가 되도록 지속적으로 재조정하는 기능을 합니다. 이로 인해 위젯의 좌표를 픽셀 단위로 적용할 수 있게 되고 게임월드상의 다른것들에 비해 상대적으로 작은 값을 사용할 수 있습니다.
2. Camera 오브젝트는 CameraUICamera 스크립트를 포함합니다. UICamera 스크립트는 NGUI의 이벤트 시스템을 포함합니다.
3. AnchorUIAnchor 스크립트를 포함합니다. 이 스크립트는 위젯을 스크린의 가장자리에 붙이는것을 가능케 하지만 이 경우 윈도우즈 머신에서는 완벽한 픽셀 배치를 위해 Half-Pixel Offset으로 사용되기도 합니다.
4. Panel 오브젝트는 UIPanel 스크립트를 포함합니다. 이 UIPanel은 계층구조 이하의 모든 UI 위젯들을 담고 있으며 그들을 조합하여 가능한한 최소한의 Draw 호출을 할 수 있도록 하는 컨테이너입니다.

지금 설명한 Panel  오브젝트를 잘 알아두셔야 합니다. 다음 스텝부터 설명되는 모든 위젯은 Panel을 자동으로 부모로 지정하게 됩니다.

참고 : http://www.tasharen.com/?page_id=185

[Java/Android] 회전오류를 복구하는 카메라를 이용한 Bitmap 이미지 캡춰링

조금 순서가 반대로 되는 포스팅일것 같습니다만 이전에 [카메라 호출후 이미지 크롭하기] 글을 작성한 적이 있습니다. 간단하게 카메라만 임시로 호출하기 위해 사용하기엔 너무 복잡한 면이 있는듯 하니 이번에는 간단하게 카메라 사용에 관련된 포스팅을 하나 해보겠습니다.

하지만 여기서 중요한 기능을 하나 추가했는데요, 대부분의 기기가 사진 촬영시에 기기의 회전율을 고려하지 않고 바로 저장해 버린다는 문제를 재회전을 통해 복구하는 로직을 추가해보았습니다.

1. 카메라 호출하기

[code]// 임시로 사용할 파일 생성
File photo = new File(Environment.getExternalStorageDirectory(),
  “.camera.jpg”);
imageUri = Uri.fromFile(photo);

// 카메라를 호출합니다.
Intent i = new Intent(“android.media.action.IMAGE_CAPTURE”);
i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
MainActivity.this.startActivityForResult(i,REQUEST_CAMERA);[/code]

2. 결과 처리 (onActivityResult)

[code]if(requestCode == REQUEST_CAMERA && resultCode == RESULT_OK)
{
  try
  {
    // 비트맵 이미지로 가져온다
    String imagePath = imageUri.getPath();
    Bitmap image = BitmapFactory.decodeFile(imagePath);
    
    // 이미지를 상황에 맞게 회전시킨다
    ExifInterface exif = new ExifInterface(imagePath);
    int exifOrientation = exif.getAttributeInt(
  ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
    int exifDegree = exifOrientationToDegrees(exifOrientation);
    image = rotate(image, exifDegree);
    
    // 변환된 이미지 사용
    imageView.setImageBitmap(image);
  }
  catch(Exception e)
  {
    Toast.makeText(this, “오류발생: ” + e.getLocalizedMessage(),
  Toast.LENGTH_LONG).show();
  }
}[/code]

3. 회전에 사용되는 추가 함수들

[code]/**
 * EXIF정보를 회전각도로 변환하는 메서드
 *
 * @param exifOrientation EXIF 회전각
 * @return 실제 각도
 */
public int exifOrientationToDegrees(int exifOrientation)
{
  if(exifOrientation == ExifInterface.ORIENTATION_ROTATE_90)
  {
    return 90;
  }
  else if(exifOrientation == ExifInterface.ORIENTATION_ROTATE_180)
  {
    return 180;
  }
  else if(exifOrientation == ExifInterface.ORIENTATION_ROTATE_270)
  {
    return 270;
  }
  return 0;
}

/**
 * 이미지를 회전시킵니다.
 *
 * @param bitmap 비트맵 이미지
 * @param degrees 회전 각도
 * @return 회전된 이미지
 */
public Bitmap rotate(Bitmap bitmap, int degrees)
{
  if(degrees != 0 && bitmap != null)
  {
    Matrix m = new Matrix();
    m.setRotate(degrees, (float) bitmap.getWidth() / 2,
    (float) bitmap.getHeight() / 2);
    
    try
    {
      Bitmap converted = Bitmap.createBitmap(bitmap, 0, 0,
      bitmap.getWidth(), bitmap.getHeight(), m, true);
      if(bitmap != converted)
      {
        bitmap.recycle();
        bitmap = converted;
      }
    }
    catch(OutOfMemoryError ex)
    {
      // 메모리가 부족하여 회전을 시키지 못할 경우 그냥 원본을 반환합니다.
    }
  }
  return bitmap;
}[/code]

4. AndroidManifest.xml 추가 설정

– 카메라 회전시에도 기존의 엑티비티를 제거하지 않도록 방지하기 위해 <activity..에 추가
[code]android:configChanges=”keyboardHidden|orientation”[/code]
– 카메라를 사용하기 위한 퍼미션 추가
[code]<uses-permission android:name=”android.permission.CAMERA”/>[/code]

* 결론

카메라를 이용하여 사진을 찍을때는 EXIF라는 메타 데이터가 이미지 파일에 추가로 기록이 됩니다. 이곳에서는 회전상태등이 저장이 되는데 이 값을 읽어온 후 회전된 상태만큼을 다시 원상복귀를 시키게 됩니다. exifOrientationToDegrees메서드를 사용하여 일반적으로 우리가 사용하는 정수형 회전각도값을 알아온후에 rotate메서드를 사용하여 이미지를 실제로 회전시킵니다.

1217742705.zip