안 드 로 이 드 는 촬영 상자 안의 사진 기능 을 실현 하기 위해 모방 스 캔 을 개발 했다.

6262 단어 android쓸다
바로 지금 스 캔 하 는 형식 을 본 떠 서 주 위 는 반투명 으로 가 려 진 다음 에 중간 은 완전 투명 하 게 촬영 한 후에 상자 안의 내용 만 캡 처 하 는 것 이다.
많은 블 로 그 를 찾 아 보 았 는데 실현 하기 에는 정말 복잡 하 다.본인 은 번 거 로 움 을 두려워 하여 많은 곳 에서 게 으 름 을 피 웠 다.
선행 효과 도:



STEP 1:카메라 미리 보기 및 사진 설정
이것 은 모든 절차 의 전제 이 고 미리 보기 가 없 으 면 사용자 가 자신 이 무엇 을 찍 었 는 지 어떻게 알 수 있 습 니까?미리 보 기 는 Surface View 를 사용 합 니 다.
이 박문 은 이미 매우 상세 하 게 썼 다.카 메 라 를 열 고 사진 을 찍 으 면 매우 간결 하 다!다른 블 로 그 를 원 하지 않 는 다 면 몇 백 줄 의 코드 가 무슨 말 인지 모른다.이 코드 는 카메라 모델 로 복사 해서 사용 할 수 있다.
여기 서 문제 가 발생 했 습 니 다.바로 미리 보기 의 효 과 는 좌회전 90 도 입 니 다.찍 어도 좌회전 90 도 입 니 다.많은 자 료 를 찾 았 습 니 다.여러분 이 통일 하 는 방법 은 바로...카메라 미리보기 에서 우회전 90 도 를 설정 하고 찍 은 사진 을 우회전 90 도 를 설정 합 니 다.구체 적 인 방법 은 코드 를 붙 이 겠 습 니 다.
두 번 째 단계:반투명 테두리 설정
많은 블 로그 의 방법 은 그림 을 그 리 는 것 이 고,너무 책임감 이 강하 다.
사실 간단하게 생각하면 surfaceView 위 에 그림 을 덧 붙 이면 됩 니 다.Framelayout 으로 배치 하 세 요.
바로 배경 이 반투명 하고 중간 에 잠 겨 있 습 니 다.

STEP 3:왜 상자 안의 그림 만 찍 어?
이 문 제 는 많은 블 로그 들 이 장광설 로 어떤 행렬 연산 도 사용 하고 있 습 니 다.강하 지만 계속 보고 싶 지 않 습 니 다.
액자 안의 사진 을 찍 으 면 바로 전체 사진 을 찍 은 후에 사진 속 에 그림 을 새 기 면 되 잖 아 요.
Bitmap.createBitmap(bitmap,50,250,650,500);
투명 상자 가 어느 위치 에 있 는 지,왼쪽 상단 의 좌표 가 무엇 인지,너비 와 높이 가 무엇 인지 스스로 계산 해 보 세 요.상술 한 함수 로 원래 사진 에서 그림 을 파 낼 수 있다.
STEP 4:보완,클릭 초점 추가
사실 클릭 이벤트 에서 초점 함 수 를 호출 하면 됩 니 다.
전체 코드:

public class MainActivity extends AppCompatActivity {
private SurfaceView surfaceview;
private Camera camera;
private Button take;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); //                   
setContentView(R.layout.activity_main);
/*
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, //       
WindowManager.LayoutParams.FLAG_FULLSCREEN);
*/
take = (Button)findViewById(R.id.take);
surfaceview = (SurfaceView) findViewById(R.id.surfaceview);
SurfaceHolder holder = surfaceview.getHolder();
holder.setFixedSize(176, 155);//      
holder.setKeepScreenOn(true);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// SurfaceView   activity      ,               surfaceview   
holder.addCallback(new MySurfaceCallback());
//    
take.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
takepicture();
}
});
}
//    
@Override
public boolean onTouchEvent(MotionEvent event) {
//  
camera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean b, Camera camera) {
camera.cancelAutoFocus();
}
});
return super.onTouchEvent(event);
}
/**
*   surfaceview   
* @author Administrator
* Surfaceview   activity     ,        
*/
private final class MySurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
try {
//  surfaceview        
camera = Camera.open();
Camera.Parameters params = camera.getParameters();
// Log.i("i", params.flatten());
params.setJpegQuality(80); //        
params.setPictureSize(1024, 768);
params.setPreviewFrameRate(5); //     
camera.setParameters(params); //         
//  90 ,     
camera.setDisplayOrientation(90);
//       
camera.setPreviewDisplay(surfaceview.getHolder());
//     
camera.startPreview();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if(camera != null){
camera.release();
camera = null;
}
}
}
//     
public void takepicture(){
/*
* shutter:     
* raw:          
* jpeg:       
*/
camera.takePicture(null, null, new MyPictureCallback());
}
//byte Bitmap
public Bitmap Bytes2Bimap(byte[] b) {
if (b.length != 0) {
return BitmapFactory.decodeByteArray(b, 0, b.length);
} else {
return null;
}
}
//bitmap byte
public byte[] Bitmap2Bytes(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}
//      ,        
private final class MyPictureCallback implements Camera.PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
try {
Bitmap bitmap = Bytes2Bimap(data);
Matrix m = new Matrix(); int width = bitmap.getWidth(); int height = bitmap.getHeight(); m.setRotate(90);
//     90 
bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, m,
true);
Log.d("TAG","width "+width);
Log.d("TAG","height "+height);
//        
bitmap = Bitmap.createBitmap(bitmap,50,250,650,500);
data = Bitmap2Bytes(bitmap);
File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
//              ,          
camera.startPreview();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} 
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 안 드 로 이 드 의 모방 스 캔 을 개발 하여 촬영 상자 안의 사진 기능 을 실현 하 는 것 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기