调用相册 拍照 截取图片

 /**
     * take pic
     */
    private void toTakePic() {

        /**android 6.0 权限申请**/
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //请求权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE_FOR_WRITE_PERMISSION);
            //判断是否需要 向用户解释,为什么要申请该权限
            ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE);
        } else {
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {
                //请求权限
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA);
                //判断是否需要 向用户解释,为什么要申请该权限
                ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.READ_CONTACTS);
            } else {
                if (Build.VERSION.SDK_INT == 23) {
//                    Intent i = new Intent(Intent.ACTION_CAMERA_BUTTON, null);
//                    this.sendBroadcast(i);
//                    long dateTaken = System.currentTimeMillis();
//                    String name = dateTaken + ".jpg";
//                    String fileName = name;
//                    ContentValues values = new ContentValues();
//                    values.put(MediaStore.Images.Media.TITLE, fileName);
//                    values.put("data", fileName);
//                    values.put(MediaStore.Images.Media.PICASA_ID, fileName);
//                    values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
//                    values.put(MediaStore.Images.Media.DESCRIPTION, fileName);
//                    values.put(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, fileName);
//                    Uri photoUri = getContentResolver().insert(
//                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                    mUploadPhotoPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
                            .getAbsolutePath() + File.separator + System.currentTimeMillis() + ".png";
                    File tempFile = new File(mUploadPhotoPath);

                    Intent inttPhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    inttPhoto.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
                    inttPhoto.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
                    inttPhoto.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivityForResult(inttPhoto, REQUEST_TAKE_PICTURE);
                } else if (Build.VERSION.SDK_INT < 23) {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    String state = Environment.getExternalStorageState();
                    if (state.equals(Environment.MEDIA_MOUNTED)) {
                        // 指定输出地址
                        mUploadPhotoPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
                                .getAbsolutePath() + File.separator + System.currentTimeMillis() + ".png";
                        File tempFile = new File(mUploadPhotoPath);
                        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivityForResult(intent, REQUEST_TAKE_PICTURE); // 通过StartActivityForResult
                    }
                } else if (Build.VERSION.SDK_INT == 24) {
                    mUploadPhotoPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
                            .getAbsolutePath() + File.separator + System.currentTimeMillis() + ".png";
                    File tempFile = new File(mUploadPhotoPath);
                    Uri imageUri = FileProvider.getUriForFile(FabuLuxianActivity.this, "com.bugull.cameratakedemo.fileprovider", tempFile);//通过FileProvider创建一个content类型的Uri
                    Intent intent = new Intent();
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
                    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI
                    startActivityForResult(intent, REQUEST_TAKE_PICTURE);
                } else {
                    Toast.makeText(FabuLuxianActivity.this, "未找到存储卡", Toast.LENGTH_SHORT).show();
                }
            }
        }

    }

    /**
     * android 4.4以后的图片选择
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    private void selectImageUriAfterKikat() {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_PICK);
        intent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, REQUEST_SELECET_PICTURE_AFTER_KIKAT);
    }

    /**
     * android 4.4以下版本的图片选择
     */
    private void cropImageUri() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        intent.putExtra("return-data", true);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
        intent.putExtra("noFaceDetection", true); // no face detection
        startActivityForResult(intent, REQUEST_SELECT_PICTURE);
    }



  @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_CANCELED) {
            switch (requestCode) {
                case REQUEST_TAKE_PICTURE:// 相机返回
                    if (data != null) {
                        if (data.getData() != null) {
                            if (Build.VERSION.SDK_INT == 24) {
                                String filepath = PhotoBitmapUtils.amendRotatePhoto(mUploadPhotoPath, FabuLuxianActivity.this);
                                Uri uri = FileProvider.getUriForFile(FabuLuxianActivity.this, "com.bugull.cameratakedemo.fileprovider", new File(filepath));
                                crop(uri);
                            } else {
                                String filepath = PhotoBitmapUtils.amendRotatePhoto(mUploadPhotoPath, FabuLuxianActivity.this);
                                Uri uri = Uri.fromFile(new File(filepath));
                                crop(uri);
                            }
//                            Uri uri = data.getData();
//                            Bitmap bm = null;
//                            bm = BitmapUtil.decodeUriAsBitmap(this, uri);
//                            uploadPic(bm);
                        } else {
                            Bundle bundle = data.getExtras();
                            Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式
                            bitmap = BitmapFactory.decodeStream(BitmapUtil.Bitmap2InputStream(bitmap, 80));
                            uploadPic(bitmap);
                        }
                    } else {
                        if (Build.VERSION.SDK_INT == 24) {
                            String filepath = PhotoBitmapUtils.amendRotatePhoto(mUploadPhotoPath, FabuLuxianActivity.this);
                            Uri uri = FileProvider.getUriForFile(FabuLuxianActivity.this, "com.bugull.cameratakedemo.fileprovider", new File(filepath));
                            crop(uri);
                        } else {
                            String filepath = PhotoBitmapUtils.amendRotatePhoto(mUploadPhotoPath, FabuLuxianActivity.this);
                            Uri uri = Uri.fromFile(new File(filepath));
                            crop(uri);
                        }
//                        Uri uri = Uri.fromFile(new File(mUploadPhotoPath));
//                        Bitmap bm = null;
//                        bm = BitmapUtil.decodeUriAsBitmap(this, uri);
//                        uploadPic(bm);
                    }
                    break;
                case REQUEST_SELECT_PICTURE:// 相册返回,android4.4以下
                    if (data != null) {
                        Uri uri = data.getData();
                        crop(uri);
//                        mUploadPhotoPath = StringUtils.getAbsoluteImagePath(this, uri);
//                        Bitmap bitmap = BitmapUtil.decodeFileAsBitmap(this, mUploadPhotoPath);

//                        uploadPic(bitmap);
                    }
                    break;
                case REQUEST_SELECET_PICTURE_AFTER_KIKAT:// 相册返回,android4.4以上
                    if (data != null) {
                        Uri uri = data.getData();
                        crop(uri);
                    }
                    break;
                case PHOTO_REQUEST_CUT:
                    if (data != null) {
                        Bitmap bitmap = data.getParcelableExtra("data");
                        uploadPic(bitmap);
                    }
                    break;
                default:

                    break;
            }
        }
/**
 * 剪切图片
 */
private void crop(Uri uri) {
    // 裁剪图片意图
    Intent intent = new Intent("com.android.camera.action.CROP");
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    // 裁剪框的比例,11
    intent.putExtra("aspectX", 4);
    intent.putExtra("aspectY", 3);
    // 裁剪后输出图片的尺寸大小
    intent.putExtra("outputX", 400);
    intent.putExtra("outputY", 300);

    intent.putExtra("scale", true);
    intent.putExtra("outputFormat", "JPEG");// 图片格式
    intent.putExtra("noFaceDetection", true);// 取消人脸识别
    intent.putExtra("return-data", true);
    // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
    startActivityForResult(intent, PHOTO_REQUEST_CUT);
}
7.0 清单中
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.bugull.cameratakedemo.fileprovider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path path="." name="camera_photos" />
</paths

### 回答1: 使用 PHP 调用摄像头截取图片的方法如下: 1. 首先,需要在 PHP 代码中使用 HTML5 的 `<video>` 标签来显示摄像头的实时画面。 2. 然后,使用 JavaScript 的 `getUserMedia()` 函数来获取摄像头的数据流。 3. 接着,使用 JavaScript 的 `canvas` 元素来将摄像头的画面绘制到 canvas 上。 4. 最后,使用 JavaScript 的 `toDataURL()` 函数将 canvas 上的图像转换为 base64 编码的图像数据。 下面是一个示例代码,可以帮助你更好地理解上述过程: ``` <html> <body> <!-- 在这里使用 HTML5 的 <video> 标签来显示摄像头的实时画面 --> <video id="video" width="640" height="480" autoplay></video> <!-- 在这里使用 <button> 标签创建一个按钮,用来触发拍照功能 --> <button id="capture">拍照</button> <!-- 在这里使用 <canvas> 元素来绘制摄像头的画面 --> <canvas id="canvas" width="640" height="480"></canvas> <!-- 在这里使用 <img> 标签来显示截取的图像 --> <img id="photo" alt="截取的图像"> <script> // 获取 video 元素 const video = document.getElementById('video'); // 获取 canvas 元素 const canvas = document.getElementById('canvas'); const context = canvas.getContext('2d'); // 获取 img 元素 const photo = document.getElementById('photo'); // 获取摄像头的数据流 navigator.media ### 回答2: 使用PHP调用摄像头截取图片,一般需要借助于第三方库来实现。以下是一种常见的解决方案。 首先,确保PHP环境已经安装并启用了相关的扩展,如gd库或ImageMagick。 其次,安装并配置一个支持视频捕获的软件,例如FFmpeg。 使用PHP的exec函数调用FFmpeg命令,通过摄像头捕获视频流,并将其保存到本地文件中: ```php $savePath = 'path/to/save/image.jpg'; $command = 'ffmpeg -f video4linux2 -i /dev/video0 -vframes 1 ' . $savePath; exec($command, $output, $returnCode); ``` 以上命令中,/dev/video0 是摄像头设备的路径,根据实际情况可能需要修改。 接下来,可以使用PHP的图像处理库来对截取图片进行处理,例如调整大小、裁剪、添加水印等操作。以下是一个使用gd库来缩放图片的示例: ```php $image = imagecreatefromjpeg($savePath); // 从保存的图片文件创建图像资源 $width = 640; // 目标宽度 $height = 480; // 目标高度 $newImage = imagecreatetruecolor($width, $height); // 创建新的图像资源 imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, imagesx($image), imagesy($image)); // 缩放图像 imagejpeg($newImage, $savePath, 100); // 将缩放后的图像保存到文件 imagedestroy($newImage); // 销毁图像资源 imagedestroy($image); ``` 最后,即可通过访问保存的图片路径来查看截取并处理后的图片。 需要注意的是,上述代码只是示例,实际应用中还需要添加异常处理、权限控制等功能,以确保程序的安全与稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值