Androidは、カメラフレーム内の写真機能を実現するために、スイープを開発しました。
現在のスイープの形を真似して、周りは半透明に遮られています。そして中間は全透明で、撮影後は枠の中だけを切り取ります。
たくさんのブログを調べましたが、実現するには本当に複雑すぎます。私は面倒が心配なので、多くのところでサボりました。
先に効果図を書きます
ステップ1:カメラプレビューの設定と写真撮影
これはすべてのステップの前提です。プレビューなしで、ユーザーは自分が何を撮っているのかどう分かりますか?プレビュー用はSurfaceViewです。
このブログはもう詳しく書いてあります。カメラを開けて写真を撮って、とても簡潔です。他のブログを見たくないです。何百行ものコードが分かりません。このコードはコピーしてカメラのモデルとして使用できます。
ここで一つの問題があります。プレビューの効果は左に90度、写真を撮っても左に90度です。たくさんの資料を調べました。みんなで統一したやり方はそうです。カメラのプレビューで右回り90度を設定し、撮った写真を右回り90度にします。具体的なやり方はコードを貼ります。
ステップ2:半透明枠の設定
多くのブログの作り方は製図とか、責任感があります。
実は簡単な点を考えると、surfaceViewの上に写真を重ねたらいいです。Frameelayoutでレイアウトします。
背景が半透明で、真ん中が外れます。
ステップ3:枠内の写真だけを撮るのはどうですか?
この問題は、多くのブログで長々と議論されています。どのマトリックス演算も使いました。強いですが、見続けたくないです。
枠内の写真を撮って、そのまま写真を撮ってから、ケチな写真を撮ったらいいですね。
Bitmap.creat Bitmap(bitmap,50,250,650,500)
透明枠はどこにありますか?左上の座標は何ですか?幅と高さは何ですか?上記の関数を使えば、原写真のケチャップができます。
第四歩:完璧にして、クリックフォーカスを入れる。
イベントをクリックしてフォーカス関数を呼べばいいです。
総コード:
たくさんのブログを調べましたが、実現するには本当に複雑すぎます。私は面倒が心配なので、多くのところでサボりました。
先に効果図を書きます
ステップ1:カメラプレビューの設定と写真撮影
これはすべてのステップの前提です。プレビューなしで、ユーザーは自分が何を撮っているのかどう分かりますか?プレビュー用はSurfaceViewです。
このブログはもう詳しく書いてあります。カメラを開けて写真を撮って、とても簡潔です。他のブログを見たくないです。何百行ものコードが分かりません。このコードはコピーしてカメラのモデルとして使用できます。
ここで一つの問題があります。プレビューの効果は左に90度、写真を撮っても左に90度です。たくさんの資料を調べました。みんなで統一したやり方はそうです。カメラのプレビューで右回り90度を設定し、撮った写真を右回り90度にします。具体的なやり方はコードを貼ります。
ステップ2:半透明枠の設定
多くのブログの作り方は製図とか、責任感があります。
実は簡単な点を考えると、surfaceViewの上に写真を重ねたらいいです。Frameelayoutでレイアウトします。
背景が半透明で、真ん中が外れます。
ステップ3:枠内の写真だけを撮るのはどうですか?
この問題は、多くのブログで長々と議論されています。どのマトリックス演算も使いました。強いですが、見続けたくないです。
枠内の写真を撮って、そのまま写真を撮ってから、ケチな写真を撮ったらいいですね。
Bitmap.creat Bitmap(bitmap,50,250,650,500)
透明枠はどこにありますか?左上の座標は何ですか?幅と高さは何ですか?上記の関数を使えば、原写真のケチャップができます。
第四歩:完璧にして、クリックフォーカスを入れる。
イベントをクリックしてフォーカス関数を呼べばいいです。
総コード:
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();
}
}
}
}
以上は小编が绍介したAndroid开発模仿スイープが撮影枠内の写真机能を実现しました。皆さんに助けてほしいです。ここでも私たちのサイトを応援してくれてありがとうございます。