반응형
|
안드로이드(Android) 행열(Matrix) 클래스의 postConcat() 함수이용해 거울이미지구현 |
|
환경 : Eclipse Mars, Android 4.2.2 |
이번예제는 Matrix 객체를 이용해서 이미지의 뒤집어서 볼수 있는 기능입니다. 거울이미지를 구현하는 것인데 X 축, Y 축을 기준으로 뒤집어서 보여줍니다. 이 기능을 구현하기 위해 postConcat() 함수를 사용합니다.
▶ 상을 뒤집기 위해 Matrix 의 postConcat() 함수는 인수로 행열값이 포함된 데이터를 받습니다.
float[] mirrorNormal = {
1, 0, 0,
0, 1, 0,
0, 0, 1 };
float[] mirrorX = {
1, 0, 0,
0, -1, 0,
0, 0, 1 };
float[] mirrorY = {
-1, 0, 0,
0, 1, 0,
0, 0, 1 };
float[] mirrorC = {
-1, 0, 0,
0, -1, 0,
0, 0, 1 };
matrixMirrorNormal = new Matrix();
matrixMirrorNormal.setValues(mirrorNormal);
matrixMirrorX = new Matrix();
matrixMirrorX.setValues(mirrorX);
matrixMirrorY = new Matrix();
matrixMirrorY.setValues(mirrorY);
matrixMirrorC = new Matrix();
matrixMirrorC.setValues(mirrorC);
▶ 축을 기준으로 이미지를 뒤집기위한 셋팅을
한후 postConcat() 함수의 인수로
객체를 넘기게 되면 행렬값에 맞게
이미지의 상을 뒤집을수 있습니다.
private void drawMatrix() {
Matrix matrix = new Matrix();
switch (mirrorSelection.getSelectedItemPosition()) {
case 0: // Normal
matrix.postConcat(matrixMirrorNormal);
break;
case 1: // Mirror about X
matrix.postConcat(matrixMirrorX);
break;
case 2: // Mirror about Y
matrix.postConcat(matrixMirrorY);
break;
case 3: // Mirror about Center
matrix.postConcat(matrixMirrorC);
break;
}
Bitmap mirrorBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
imageView.setImageBitmap(mirrorBitmap);
}
▶ 예제에서는 Spinner 를 사용하여 축별로 구분하여 이벤트가 발생하면 drawMatrix() 함수를 수행하게 하였습니다.
mirrorSelection.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0,
View arg1, int arg2, long arg3) {
drawMatrix();
}
public void onNothingSelected(AdapterView<?> arg0) {
mirrorSelection.setSelection(0);
}
});
▶ 다음은 메인 activity 의 레이아웃 xml 에 대한 내용입니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:background="#3F0099"
android:paddingBottom="@dimen/abc_action_bar_icon_vertical_padding"
android:paddingTop="@dimen/abc_action_bar_icon_vertical_padding"
android:text="거울 이미지 구현 "
android:textColor="#FFFFFF" />
<Spinner
android:id="@+id/mirrorselection"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/imageview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:scaleType="center" />
</LinearLayout>
▶ 아래는 메인 activity 에 대한 전체 소스 입니다.
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
public class ImageMirrorMatrixActivity extends Activity {
private String imageSdcard;
private static final String[] optionMirror = {
"정상화면", "X축기준", "Y축기준", "Center" };
private ArrayAdapter<String> adapter;
Spinner mirrorSelection;
ImageView imageView;
Bitmap bitmap;
int bmpWidth, bmpHeight;
Matrix matrixMirrorNormal, matrixMirrorX, matrixMirrorY, matrixMirrorC;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_mirror_matrix);
imageSdcard = Environment.getExternalStorageDirectory().toString() +
"/Download/view04.png";
imageView = (ImageView) findViewById(R.id.imageview);
mirrorSelection = (Spinner) findViewById(R.id.mirrorselection);
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, optionMirror);
adapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
mirrorSelection.setAdapter(adapter);
mirrorSelection.setSelection(0);
mirrorSelection.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0,
View arg1, int arg2, long arg3) {
drawMatrix();
}
public void onNothingSelected(AdapterView<?> arg0) {
mirrorSelection.setSelection(0);
}
});
bitmap = BitmapFactory.decodeFile(imageSdcard);
bmpWidth = bitmap.getWidth();
bmpHeight = bitmap.getHeight();
initMirrorMatrix();
drawMatrix();
}
private void initMirrorMatrix() {
float[] mirrorNormal = {
1, 0, 0,
0, 1, 0,
0, 0, 1 };
float[] mirrorX = {
1, 0, 0,
0, -1, 0,
0, 0, 1 };
float[] mirrorY = {
-1, 0, 0,
0, 1, 0,
0, 0, 1 };
float[] mirrorC = {
-1, 0, 0,
0, -1, 0,
0, 0, 1 };
matrixMirrorNormal = new Matrix();
matrixMirrorNormal.setValues(mirrorNormal);
matrixMirrorX = new Matrix();
matrixMirrorX.setValues(mirrorX);
matrixMirrorY = new Matrix();
matrixMirrorY.setValues(mirrorY);
matrixMirrorC = new Matrix();
matrixMirrorC.setValues(mirrorC);
}
private void drawMatrix() {
Matrix matrix = new Matrix();
switch (mirrorSelection.getSelectedItemPosition()) {
case 0: // Normal
matrix.postConcat(matrixMirrorNormal);
break;
case 1: // Mirror about X
matrix.postConcat(matrixMirrorX);
break;
case 2: // Mirror about Y
matrix.postConcat(matrixMirrorY);
break;
case 3: // Mirror about Center
matrix.postConcat(matrixMirrorC);
break;
}
Bitmap mirrorBitmap = Bitmap.createBitmap(
bitmap, 0, 0, bmpWidth, bmpHeight, matrix, true);
imageView.setImageBitmap(mirrorBitmap);
}
}
반응형
'안드로이드 개발' 카테고리의 다른 글
| 안드로이드(Android) 카메라, 갤러리 호출후 이미지 잘래내서 화면에 표시 (12) | 2015.02.05 |
|---|---|
| 안드로이드(Android) Google Map 버전2 에서 PolyLine 이용해 라인,마크 그리기 (0) | 2015.02.02 |
| 안드로이드(Android) Sdcard 미디어 파일 읽어 MP3 실행하기 (0) | 2015.01.29 |
| 안드로이드(Android) MediaPlayer 이용해 raw 폴더의 MP3 듣기 (0) | 2015.01.26 |
| 안드로이드(Android) 비트맵 이미지를 다양한 방법으로 변형하는 예제 (0) | 2015.01.19 |
| 안드로이드(Android) 이미지다운로드해서 Sdcard 에 저장하기 (3) | 2015.01.15 |
| 안드로이드(Android) AutoCompleteTextView 위젯을 이용해 단어 자동완성기능 구현 (0) | 2015.01.12 |
| 안드로이드(Android) EditText 위젯의 입력타입별 예제 (0) | 2015.01.11 |
