마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

android Crop 이 이미지 처럼 만들라믄

–2 추천
package com.example.demoproject;
 
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
 
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
 
public class ImageCropMainActivity extends Activity{
     
    protected ImageView bfImage;
    protected Bitmap bitmap;
    protected ExifInterface exif = null;
    protected InputStream stream = null;
    protected BitmapUtil bitmapUtil = new BitmapUtil();
    protected Util util = new Util();
    private static final int PIC_CROP = 1;
    private int exifOrientation;
    private int exifDegree;
    private Uri uriPath;
    private String path;
    private String strpath;
     
    private float mWidth;
    private float mHeight;
    private float mXLeft, mXRight , mYTop, mYBottom;
    private static int mDep = 0;
     
    Paint mPaint;
    Bitmap mLSizeBmp;
    Bitmap mRSizeBmp;
     
    @SuppressLint("WrongCall")
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
         
//      setContentView(cv);
        setContentView(R.layout.activity_image_crop_main);
 
        bfImage = (ImageView) findViewById(R.id.bfImage);
        bfImage.setVisibility(View.VISIBLE);
        Intent getImage = this.getIntent();
        BitmapFactory.Options options = new BitmapFactory.Options();
        strpath = getImage.getStringExtra("Path");
        uriPath = util.getPath(strpath);
         
        try {
            // recyle unused bitmaps
            if (bitmap != null) {
                bitmap.recycle();
            }
             
            stream = getContentResolver().openInputStream(uriPath);
            bitmap = BitmapFactory.decodeStream(stream, null, options);
             
            options.inSampleSize = 2;
            mWidth  = options.outWidth;
            mHeight = options.outHeight;
             
            this.bitmap = bitmapUtil.cropCenterBitmap(bitmap, (int)mWidth, (int)mHeight);
             
 
            Cursor c = getContentResolver().query(uriPath, null,null,null,null);
            c.moveToNext();
             
            path = c.getString(c.getColumnIndex(MediaStore.MediaColumns.DATA));
            c.close();                                                                                      // close 는 finally로 빼야함
 
            exif = new ExifInterface(path);
            exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
            exifDegree = bitmapUtil.exifOrientationToDegrees(exifOrientation);
            bitmap = bitmapUtil.rotate(bitmap, exifDegree);
            bfImage.setImageBitmap(bitmap);
             
            CustomView cv = new CustomView(this);
            cv.onDraw(bitmap);
             
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
     
    class CustomView extends View {
        public CustomView(Context context){
            super(context);
        }
         
        protected void onDraw(Bitmap bitmap){
            Canvas canvas = new Canvas(bitmap);
            super.onDraw(canvas);
             
            mLSizeBmp   = BitmapFactory.decodeResource(getResources(), R.drawable.lefttop);
            mRSizeBmp   = BitmapFactory.decodeResource(getResources(), R.drawable.righttop);
             
            mPaint = new Paint();
            mPaint.setColor(Color.MAGENTA);
            mPaint.setStrokeWidth(3);
             
            mXLeft = mWidth / 5;
            mXRight = mWidth * 4/5;
            mYTop = mHeight / 5;
            mYBottom = mHeight * 4/5;
             
             
            mDep = bfImage.getWidth()/2;
             
//          Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
//          mWidth = display.getWidth();
//          mHeight = display.getHeight();
             
             
//          Rect rect = new Rect();                                 //  make Rect Class (Quadrangle)
//          rect.set(0,0,canvas.getWidth(), canvas.getHeight());    //  View Full Size Draw
//          Paint paint = new Paint();                              //  Paint Object Create
//          paint.setColor(Color.BLUE);
//          paint.setStyle(Paint.Style.FILL);
//          canvas.drawRect(rect, paint);                           //  Rect draw paint
      
             
            //=========================================//
            //onDraw를 이용하여 Crop영역을 보여준다.
            //=========================================//
             
            Log.d("Good" , "mXLeft : " + mXLeft + " mYTop : " +  mYTop + " mXRight : " + mXRight + "mYTop : " + mYTop + "mPaint : " + mPaint + "mDep : " + mDep);
             
            canvas.drawBitmap(bitmap, 0, 0, null);
              
            //상단 가로줄
            canvas.drawLine(mXLeft, mYTop, mXRight, mYTop, mPaint);
              
            //오른쪽 세로줄
            canvas.drawLine(mXRight, mYTop, mXRight, mYBottom, mPaint);
              
            //왼쪽 세로줄
            canvas.drawLine(mXLeft, mYTop, mXLeft, mYBottom, mPaint);
              
            //하단 가로줄
            canvas.drawLine(mXLeft, mYBottom, mXRight, mYBottom, mPaint);
      
            //왼쪽상단 아이콘
            canvas.drawBitmap(mLSizeBmp, mXLeft - (mDep), mYTop- (mDep), null);
              
            //오른쪽상단 아이콘
            canvas.drawBitmap(mRSizeBmp, mXRight - (mDep), mYTop- (mDep), null);
              
            //왼쪽하단 아이콘
            canvas.drawBitmap(mRSizeBmp, mXLeft - (mDep), mYBottom- (mDep), null);
              
            //오른쪽 하단 아이콘
            canvas.drawBitmap(mLSizeBmp, mXRight - (mDep), mYBottom- (mDep), null);
             
            //RECT SIZE
             
//          Log.d("Rect","left  : " + rect.left);
//          Log.d("Rect","right : " + rect.right);
//          Log.d("Rect","top   : " + rect.top);
//          Log.d("Rect","bottom: " + rect.bottom);
              
        }
    }
     
    class Util {
        public Uri getPath(String Path){
            try {
                if(Path == null){
                    Path = "";
                }
            } catch (Exception e) {
                 
            }
            return Uri.parse(Path); 
        }
    }
}

 

이 이미지 처럼 그릴려면 어떻게 해야하는지 제시점 해주세요.

캐릭 (420 포인트) 님이 2015년 5월 18일 질문

1개의 답변

0 추천
찬찬히 소스를 들여다보진 않았지만, 잘 하신 것 같은데요?

비트맵을 사용하여 draw를 하면 될 거 같고, 순서는

 

1. 화면 크기만큼 alpha 들어간 검정색으로 채움. (반투명 효과)
2. 중앙의 영역을 alpha 100%의 어떠한 색깔로 그려서 반투명 효과 제거

3. 흰색 선들 그리기

4. 끌개 그리기 (이건 비트맵이 아닌, ImageView 를 사용하는게 touch 이벤트 처리하기 좋을 듯 합니다)
컴공의자랑 님이 2017년 2월 24일 답변
...