广告
返回顶部
首页 > 资讯 > 移动开发 >Android开发仿扫一扫实现拍摄框内的照片功能
  • 653
分享到

Android开发仿扫一扫实现拍摄框内的照片功能

android开发Android 2022-06-06 07:06:19 653人浏览 泡泡鱼
摘要

就是仿照现在扫一扫的形式,周围是半透明的遮挡,然后中间是全透明的,拍摄后只截取框内的内容 查了很多博客,实现起来真的太复杂了,本人比较怕麻烦所以在很多地方偷懒了 先上效果图

就是仿照现在扫一扫的形式,周围是半透明的遮挡,然后中间是全透明的,拍摄后只截取框内的内容

查了很多博客,实现起来真的太复杂了,本人比较怕麻烦所以在很多地方偷懒了

先上效果图:

第一步:设置照相机预览以及拍照

这是所有步骤的前提,没有预览,用户怎么知道自己拍的什么呢。预览用的是SurfaceView

这篇博文写得已经十分详细了,打开照相机,然后拍照,而且十分简洁!不想别的博客一下就几百行代码不知所云。这篇代码可以复制下去当相机模版使用。

这里遇到一个问题,就是预览的效果是左转90度的,拍出来也是左转90度的,查了很多资料,大家统一的做法就是。在相机预览那里设置右旋90度,拍下的照片再右旋90度,具体的做法我会贴代码

第二步:设置半透明边框

很多博客的做法是绘图呀什么的,太过负责。

其实如果考虑简单点的话,只要在surfaceView上面叠加一层图片就好了,用Framelayout布局

就是背景半透明,中间扣掉

第三步:怎么只拍摄框内的图片

这个问题,很多博客都是长篇大论,什么矩阵运算都用上了,虽然很强,但是不想看下去。

拍摄框内的图片,就直接拍完整张照片之后,在照片里面抠图就好了啊。

Bitmap.createBitmap(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);

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);
}

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(){

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开发仿扫一扫实现拍摄框内的照片功能 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程网网站的支持!

您可能感兴趣的文章:Android实现扫一扫识别数字功能Android自定义Drawable之在Drawable中部指定透明区域方法示例Android实现扫一扫功能之绘制指定区域透明区域


--结束END--

本文标题: Android开发仿扫一扫实现拍摄框内的照片功能

本文链接: https://www.lsjlt.com/news/23871.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android开发仿扫一扫实现拍摄框内的照片功能
    就是仿照现在扫一扫的形式,周围是半透明的遮挡,然后中间是全透明的,拍摄后只截取框内的内容 查了很多博客,实现起来真的太复杂了,本人比较怕麻烦所以在很多地方偷懒了 先上效果图...
    99+
    2022-06-06
    android开发 Android
  • Android开发怎么实现模仿360二维码扫描功能
    小编给大家分享一下Android开发怎么实现模仿360二维码扫描功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:一、效果图:二、框架搭建首先,下载最新...
    99+
    2023-05-30
    android
  • Android开发实现ImageView加载摄像头拍摄的大图功能
    本文实例讲述了Android开发实现ImageView加载摄像头拍摄的大图功能。分享给大家供大家参考,具体如下:这个方法是从官方demo中摘录的,在此记录学习。权限<uses-permission android:name="andr...
    99+
    2023-05-30
    android imageview age
  • Android开发中怎么实现一个长按将文章生成图片的功能
    这篇文章将为大家详细讲解有关Android开发中怎么实现一个长按将文章生成图片的功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。长按菜单实现WebView可以如下实现:mWebView.s...
    99+
    2023-05-31
    android roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作