Android開発呼び出しカメラ

Android オープンカメラ

AndroidManifest.xml ファイルのマニフェストにカメラのアクセス許可を追加します。
<!-- 相机 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- 录音 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!-- 存储卡读写 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <!-- 获取网络状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 互联网 -->
    <uses-permission android:name="android.permission.INTERNET" />

設定インターフェイスには、ボタンを表示する Button と、撮影した写真を配置する ImageView が含まれており、全体のコードは次のとおりです。

インターフェースコード:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_original"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="打开相机"
            android:textColor="@color/black"
            android:textSize="17sp"/>
    </LinearLayout>
    <ImageView
        android:id="@+id/iv_photo"
        android:layout_width="match_parent"
        android:layout_height="360dp"
        android:scaleType="fitCenter"/>
</LinearLayout>

MainActivity コード:

package com.example.ocr;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.ContentValues;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.ImageView;

import com.example.ocr.util.BitmapUtil;
import com.example.ocr.util.DateUtil;

public class MainActivity extends AppCompatActivity {
    
    
    private static final int REQUEST_CAMERA_PERMISSION = 100;
    private ImageView iv_photo; // 声明一个图像视图对象
    private Uri mImageUri;// 图片的路径对象
    private ActivityResultLauncher launcherOriginal; // 声明一个活动结果启动器对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_photo = findViewById(R.id.iv_photo);
        // 注册一个善后工作的活动结果启动器,准备打开拍照界面(返回原始图)
        launcherOriginal = registerForActivityResult(
                new ActivityResultContracts.TakePicture(), result -> {
    
    
                    if (result) {
    
    
                        Bitmap bitmap = BitmapUtil.getAutoZoomImage(this, mImageUri);
                        iv_photo.setImageBitmap(bitmap);
                        // 在这里处理原始照片的逻辑
                    }
                });
        findViewById(R.id.btn_original).setOnClickListener(v -> {
    
    
            if (checkCameraPermission()) {
    
    
                takeOriginalPhoto();
            } else {
    
    
                requestCameraPermission();
            }
        });
    }

    private boolean checkCameraPermission() {
    
    
        return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED;
    }

    private void requestCameraPermission() {
    
    
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
    
    
            // 显示权限说明对话框
            // 可以使用一个对话框或其他方式向用户解释为什么需要相机权限,并在用户同意后请求权限
        } else {
    
    
            ActivityCompat.requestPermissions(this, new String[]{
    
    Manifest.permission.CAMERA},
                    REQUEST_CAMERA_PERMISSION);
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    
    
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CAMERA_PERMISSION) {
    
    
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
    
                takeOriginalPhoto();
            } else {
    
    
                // 相机权限被拒绝,可以显示一条消息或执行其他操作
            }
        }
    }
    // 拍照时获取原始图片
    private void takeOriginalPhoto() {
    
    
        // Android10开始必须由系统自动分配路径,同时该方式也能自动刷新相册
        ContentValues values = new ContentValues();
        // 指定图片文件的名称
        values.put(MediaStore.Images.Media.DISPLAY_NAME, "photo_" + DateUtil.getNowDateTime());
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");// 类型为图像
        // 通过内容解析器插入一条外部内容的路径信息
        mImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        launcherOriginal.launch(mImageUri);
    }
}

BitmapUtil.java ファイル コード:

package com.example.ocr.util;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Log;

import java.io.FileOutputStream;
import java.io.InputStream;

public class BitmapUtil {
    
    
    private final static String TAG = "BitmapUtil";

    // 把位图数据保存到指定路径的图片文件
    public static void saveImage(String path, Bitmap bitmap) {
    
    
        // 根据指定的文件路径构建文件输出流对象
        try (FileOutputStream fos = new FileOutputStream(path)) {
    
    
            // 把位图数据压缩到文件输出流中
            bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

    // 获得旋转角度之后的位图对象
    public static Bitmap getRotateBitmap(Bitmap bitmap, float rotateDegree) {
    
    
        Matrix matrix = new Matrix(); // 创建操作图片用的矩阵对象
        matrix.postRotate(rotateDegree); // 执行图片的旋转动作
        // 创建并返回旋转后的位图对象
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
                bitmap.getHeight(), matrix, false);
    }

    // 获得比例缩放之后的位图对象
    public static Bitmap getScaleBitmap(Bitmap bitmap, double scaleRatio) {
    
    
        int new_width = (int) (bitmap.getWidth() * scaleRatio);
        int new_height = (int) (bitmap.getHeight() * scaleRatio);
        // 创建并返回缩放后的位图对象
        return Bitmap.createScaledBitmap(bitmap, new_width, new_height, false);
    }

    // 获得自动缩小后的位图对象
    public static Bitmap getAutoZoomImage(Context ctx, Uri uri) {
    
    
        Log.d(TAG, "getAutoZoomImage uri="+uri.toString());
        Bitmap zoomBitmap = null;
        // 打开指定uri获得输入流对象
        try (InputStream is = ctx.getContentResolver().openInputStream(uri)) {
    
    
            // 从输入流解码得到原始的位图对象
            Bitmap originBitmap = BitmapFactory.decodeStream(is);
            int ratio = originBitmap.getWidth()/2000+1;
            // 获得比例缩放之后的位图对象
            zoomBitmap = BitmapUtil.getScaleBitmap(originBitmap, 1.0/ratio);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return zoomBitmap;
    }

    // 获得自动缩小后的位图对象
    public static Bitmap getAutoZoomImage(Bitmap origin) {
    
    
        int ratio = origin.getWidth()/2000+1;
        // 获得比例缩放之后的位图对象
        Bitmap zoomBitmap = getScaleBitmap(origin, 1.0/ratio);
        return zoomBitmap;
    }

    // 通知相册来了张新图片
    public static void notifyPhotoAlbum(Context ctx, String filePath) {
    
    
        try {
    
    
            String fileName = filePath.substring(filePath.lastIndexOf("/")+1);
            MediaStore.Images.Media.insertImage(ctx.getContentResolver(),
                    filePath, fileName, null);
            Uri uri = Uri.parse("file://" + filePath);
            Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
            ctx.sendBroadcast(intent);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

}

MainActivity コードの詳細な説明

private static final int REQUEST_CAMERA_PERMISSION = 100;
private ImageView iv_photo; // 声明一个图像视图对象
    private Uri mImageUri;// 图片的路径对象

private static final int REQUEST_CAMERA_PERMISSION = 100;カメラの許可を要求するリクエストコードを定義するために使用されます。Android では、権限をリクエストするときに、各権限リクエストに一意のリクエスト コードを割り当てる必要があります。

private ActivityResultLauncher launcherOriginal; // 声明一个活动结果启动器对象

ActivityResultLauncher launcherOriginal写真を撮って返されたオリジナル画像を登録・加工するための活動結果ランチャーです。

ActivityResultLauncherこれは、アクティビティ結果 (カメラを起動して写真を撮った後に返される結果など) を処理する便利な方法を提供する、Android Jetpack ライブラリのコンポーネントです。

コードでは、 メソッドを使用してregisterForActivityResult()オブジェクトを作成しActivityResultLauncher、アクティビティの結果コントラクトとして使用することを指定しますActivityResultContracts.TakePicture()この契約は、アクティビティの結果から受け取りたいデータ型と操作を定義します。

を登録することでActivityResultLauncher、ボタン クリック イベントで を使用してlauncherOriginal.launch(mImageUri)カメラを起動して写真を撮影し、カメラが写真を撮った後に返された結果を受信して​​処理することができます。

のコールバックではlauncherOriginal、結果に基づいて論理的な処理を実行できます。たとえば、コード内で結果が であればtrue、写真が正常に撮影されたことを意味し、BitmapUtil.getAutoZoomImage()元の写真の Bitmap オブジェクトを取得して処理し、イメージ ビューに表示するメソッドを呼び出すことができます。

これを使用するとActivityResultLauncher、アクティビティの結果をより便利に処理し、ロジックをコールバックにカプセル化できるため、コードがより明確になり、保守が容易になります。

new ActivityResultContracts.TakePicture(), result -> {
    
    
    if (result) {
    
    
        Bitmap bitmap = BitmapUtil.getAutoZoomImage(this, mImageUri);
        iv_photo.setImageBitmap(bitmap);
        // 在这里处理原始照片的逻辑
    }
});

resultこれは、写真操作が完了した後に返される結果です。ActivityResultContracts.TakePicture()コントラクトを使用してカメラを起動して写真を撮影すると、写真撮影操作が成功したかどうかを示すブール値の結果が返されます。

resultユーザーが写真撮影操作を完了して戻ると、システムは結果をパラメータに渡し、コールバックの結果に基づいて論理処理を実行できます。

の場合はresulttrue写真が正常に撮影されたことを意味します。この場合、元の写真のロジックを続行できます。コードでは、BitmapUtil.getAutoZoomImage()元の写真の Bitmap オブジェクトを取得して処理するメソッドを呼び出し、それが にImageView表示されるように設定します。

特定の実装に応じて、resultタイプが異なる場合があることに注意してください。ActivityResultContracts.TakePicture()コントラクトでは、返される結果の型が であると指定されているBooleanため、コールバックではresultの型は になりますBoolean

findViewById(R.id.btn_original).setOnClickListener(v -> {
    
    
    if (checkCameraPermission()) {
    
    
        takeOriginalPhoto();
    } else {
    
    
        requestCameraPermission();
    }
});

findViewById(R.id.btn_original)レイアウト ファイル内でR.id.btn_originalID を持つボタン コントロールを検索するために使用されます。これはクリック イベント リスナーで、ボタンがクリックされると、対応するロジックが実行されます。

ロジックは次のとおりです。

  • まず、checkCameraPermission()メソッド経由でカメラの許可が付与されているかどうかを確認します。
  • カメラのアクセス許可が付与されている場合は、takeOriginalPhoto()メソッドを呼び出して写真撮影操作を開始します。
  • カメラの許可が付与されていない場合は、requestCameraPermission()メソッドが呼び出されてカメラの許可が要求されます。

このコードの目的は、ユーザーが「btn_original」ボタンをクリックしたときにカメラの許可ステータスを確認し、許可ステータスに基づいて対応する操作を実行することです。許可が得られた場合は撮影操作を開始し、許可が得られなかった場合はカメラの許可を要求します。これにより、写真を撮影する前に必要な許可を取得できるようになり、許可の問題を回避できます。

ここで、vはクリックされたビュー (ボタン) オブジェクトを表すために使用されるパラメータ名です。クリック イベントを設定すると、Android システムはクリックされた View オブジェクトをこのパラメーターに自動的に渡します。

クリックイベントのコールバック関数では、vパラメータを通じてクリックされたViewオブジェクトを参照・操作することができます。たとえば、v.getId()メソッドを呼び出してクリックされたビューの ID を取得したり、呼び出してv.setVisibility(View.GONE)ビューを非表示にしたりできます。

上記のコードでは、vボタンのクリック状態に基づいて、権限の確認、権限の要求、写真操作の実行など、対応する操作を実行する機能があります。

private boolean checkCameraPermission() {
    
    
    return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
            == PackageManager.PERMISSION_GRANTED;
}

checkCameraPermission()、カメラの許可が与えられているかどうかを確認するために使用されます。

Android では、機密性の高いアクセス許可 (カメラのアクセス許可など) を使用するには、実行時にユーザーの承認を動的に要求する必要があります。このメソッドの目的は、アプリケーションにカメラの許可が付与されているかどうかを確認することです。

具体的な説明は以下の通りです。

  1. checkSelfPermission(this, Manifest.permission.CAMERA):ContextCompat.checkSelfPermission()メソッドを呼び出して、アプリケーションにカメラ権限が付与されているかどうかを確認します。これは 2 つのパラメータを受け取ります。最初のパラメータは現在のコンテキスト (現在のオブジェクトthisを指す)、2 番目のパラメータはチェックする権限 (ここではカメラの権限) です。ActivityContext
  2. PackageManager.PERMISSION_GRANTED:許可が与えられている状態を示す定数です。
  3. ==: 2 つの値が等しいかどうかを比較するために使用される比較演算子。
  4. 戻り値: カメラのアクセス許可が付与されている場合、checkSelfPermission()戻り値は に等しいためPackageManager.PERMISSION_GRANTED、メソッドは を返しますtrueそれ以外の場合は、falseカメラの許可がまだ付与されていないことを示す戻り値。

このメソッドを呼び出すことで、カメラ機能を使用する前にカメラの権限のステータスをチェックして、アプリケーションに必要な権限があることを確認できるため、カメラ関連の操作が許可なく実行されることを回避できます。

private void requestCameraPermission() {
    
    
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
    
    
        // 显示权限说明对话框
        // 可以使用一个对话框或其他方式向用户解释为什么需要相机权限,并在用户同意后请求权限
    } else {
    
    
        ActivityCompat.requestPermissions(this, new String[]{
    
    Manifest.permission.CAMERA},
                REQUEST_CAMERA_PERMISSION);
    }
}
  1. shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)ActivityCompat.shouldShowRequestPermissionRationale():メソッドを呼び出して、権限の説明ダイアログを表示するかどうかを確認します。これは 2 つのパラメータを受け取ります。最初のパラメータは現在のコンテキスト (現在のオブジェクトthisを指す)、2 番目のパラメータは要求される許可 (ここではカメラの許可) です。 ActivityContext
    • が返された場合はtrue、現時点で権限の説明ダイアログ ボックスがユーザーに表示される必要があることを意味します。ダイアログ ボックスなどを使用して、カメラの許可が必要な理由をユーザーに説明し、ユーザーが同意した後に再度許可を要求できます。
    • が返された場合はfalse、現時点では権限の説明ダイアログ ボックスが表示されず、権限を直接要求できることを意味します。
  2. requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION):ActivityCompat.requestPermissions()メソッドを呼び出してカメラの許可を要求します。3 つのパラメーターを受け取ります。最初のパラメーターは現在のコンテキスト (現在またはオブジェクトthisを指す)、2 番目のパラメーターは要求される許可配列 (ここにはカメラの許可のみが含まれます)、3 番目のパラメーターは要求するための要求コードです。権限 (ここでは定数が使用されています)。 ActivityContextREQUEST_CAMERA_PERMISSION
    • このメソッドが呼び出されると、システムはユーザーに権限要求ダイアログ ボックスを表示し、ユーザーは権限を付与するか拒否するかを選択できます。
    • 結果はonRequestPermissionsResult()メソッドを通じて current にコールバックされActivity、そこでユーザーの権限付与の結果を処理できます。

このメソッドを呼び出すことで、カメラの許可が必要な場合にユーザーに許可を要求し、アプリケーションがカメラ機能を使用できるようにすることができます。ユーザーが以前に許可リクエストを拒否したことがある場合は、ユーザーに許可の必要性を説明し、必要に応じて再度許可をリクエストすることもできます。

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    
    
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CAMERA_PERMISSION) {
    
    
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
    
            takeOriginalPhoto();
        } else {
    
    
            // 相机权限被拒绝,可以显示一条消息或执行其他操作
        }
    }
}

onRequestPermissionsResult()これは、ユーザーが許可リクエストに応答するときに呼び出されるコールバック メソッドです。

具体的な説明は以下の通りです。

  1. requestCode == REQUEST_CAMERA_PERMISSION: まず、リクエストコードがカメラ許可リクエストのリクエストコードと一致するかどうかを確認します。これは、複数の許可リクエストが発生した場合にカメラ許可コールバックが正しく処理されるようにするためです。
  2. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED): 認可結果の配列の長さがgrantResults0 より大きいかどうか、および最初の権限の認可結果が であるかどうかを確認しますPackageManager.PERMISSION_GRANTED
    • 条件が満たされた場合、ユーザーがカメラの許可を与えたことを意味します。
    • 条件が満たされない場合は、ユーザーがカメラの許可を拒否したことを意味します。
  3. ユーザーがカメラの許可を与えている場合、takeOriginalPhoto()メソッドを呼び出して写真撮影操作を実行できます。
    • このメソッドでは、カメラの許可を取得し、カメラ ロジックを実行します。
  4. ユーザーがカメラのアクセス許可を拒否した場合、elseコード ブロックで他のアクション (カメラのアクセス許可が拒否されたことをユーザーに通知するメッセージを表示したり、他のロジックを実行したりするなど) を実行できます。

このメソッドを実装することで、許可要求に対するユーザーの応答に基づいてカメラの許可または拒否を処理し、対応する処理を実行することができます。

private void takeOriginalPhoto() {
    
    
    // Android10开始必须由系统自动分配路径,同时该方式也能自动刷新相册
    ContentValues values = new ContentValues();
    // 指定图片文件的名称
    values.put(MediaStore.Images.Media.DISPLAY_NAME, "photo_" + DateUtil.getNowDateTime());
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");// 类型为图像
    // 通过内容解析器插入一条外部内容的路径信息
    mImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

    launcherOriginal.launch(mImageUri);
}
  1. 撮影した写真に関する情報を保存するContentValuesオブジェクトを作成します。values
  2. put()このメソッドを使用して、valuesキーと値のペアを次のように追加します。
    • MediaStore.Images.Media.DISPLAY_NAME: 現在の日付と時刻をファイル名の一部として使用して、画像ファイルの名前を指定します。
    • MediaStore.Images.Media.MIME_TYPE: 画像の MIME タイプを指定します。ここでは「image/jpeg」に設定し、画像タイプが JPEG であることを示します。
  3. コンテンツ パーサー メソッドを通じてgetContentResolver().insert()、画像のパス情報を外部メモリの MediaStore データベースに挿入し、画像を表す Uri オブジェクトを返しますmImageUri
    • MediaStore.Images.Media.EXTERNAL_CONTENT_URI外部ストレージ内の画像のコレクションを表す Uri です。
  4. 最後に、 を使用してlauncherOriginal.launch(mImageUri)写真撮影アクティビティを開始し、画像の Uri オブジェクトを渡しますmImageUri
    • launcherOriginalこれは、事前に登録されたregisterForActivityResult()活動結果ランチャーであり、写真撮影活動の結果を処理するために使用されます。

全体として、このコードが行うことは、写真を撮影するための URI を作成し、それをランチャーに渡してlauncherOriginal写真撮影アクティビティを開始することです。

BitmapUtil.java ファイル コードの詳細な説明

public static void saveImage(String path, Bitmap bitmap) {
    
    
    // 根据指定的文件路径构建文件输出流对象
    try (FileOutputStream fos = new FileOutputStream(path)) {
    
    
        // 把位图数据压缩到文件输出流中
        bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos);
    } catch (Exception e) {
    
    
        e.printStackTrace();
    }
}

メソッドのシグネチャ:public static void saveImage(String path, Bitmap bitmap)

  • path画像ファイルを保存するパスです。文字列型です。
  • bitmap保存するビットマップ オブジェクトです。

メソッド内で、FileOutputStreamファイル出力ストリーム オブジェクトを構築することにより、ビットマップ データが指定されたパスのファイルに書き込まれます。

  1. try (FileOutputStream fos = new FileOutputStream(path)) {
          
          
        bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos);
    } catch (Exception e) {
          
          
        e.printStackTrace();
    }
    
    • FileOutputStreamデータをファイルに書き込むために使用される出力ストリームです。
    • compress()ビットマップ データをファイル出力ストリームに圧縮するために使用される方法。
    • Bitmap.CompressFormat.JPEGビットマップが JPEG 形式で圧縮されていることを示します。
    • 80圧縮品質を表すパラメータで、値の範囲は 0 ~ 100 で、値が大きいほど品質が向上し、ファイル サイズが大きくなります。
    • fosコンストラクター メソッドを通じて作成されたファイル出力ストリーム オブジェクトです。

一般に、このコードの機能は、ビットマップ オブジェクトbitmapのデータを圧縮して、path指定されたパスの画像ファイルに保存することです。

public static Bitmap getRotateBitmap(Bitmap bitmap, float rotateDegree) {
    
    
    Matrix matrix = new Matrix(); // 创建操作图片用的矩阵对象
    matrix.postRotate(rotateDegree); // 执行图片的旋转动作
    // 创建并返回旋转后的位图对象
    return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
            bitmap.getHeight(), matrix, false);
}

メソッドのシグネチャ:public static Bitmap getRotateBitmap(Bitmap bitmap, float rotateDegree)

  • bitmap回転するビットマップ オブジェクトです。
  • rotateDegree回転角度です。時計回りの方向が正の値です。

メソッド内では、まずピクチャを操作するための行列オブジェクトを作成しますMatrix

Matrix matrix = new Matrix();

matrix.postRotate(rotateDegree)画像の回転を実行するにはメソッドを使用します。こちらrotateDegreeが回転角です。

最後に、Bitmap.createBitmap()メソッドを使用して、回転されたビットマップ オブジェクトを作成して返します。

return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);
  • Bitmap.createBitmap()指定されたソース ビットマップとマトリックスに基づいて新しいビットマップを作成するために使用されるメソッド。
  • パラメータの説明:
    • bitmap: ソースビットマップオブジェクト。
    • (0, 0): トリミングの開始点の座標。つまり、元のビットマップの左上隅からトリミングが開始されます。
    • bitmap.getWidth(): 幅のトリミング。ここでは幅全体をトリミングすることを意味します。
    • bitmap.getHeight(): トリミングの高さ。ここでは高さ全体をトリミングすることを意味します。
    • matrix: ソース ビットマップの操作に使用されるマトリックス オブジェクト。
    • false: ソース ビットマップをその場で変更するかどうか。ここに設定するとfalse、新しいビットマップ オブジェクトを作成することになります。

したがって、このコードの機能は、指定されたビットマップ オブジェクトをパラメーターで指定された回転角度でbitmap回転し、回転されたビットマップ オブジェクトを返すことです。rotateDegree

public static Bitmap getScaleBitmap(Bitmap bitmap, double scaleRatio) {
    
    
    int new_width = (int) (bitmap.getWidth() * scaleRatio);
    int new_height = (int) (bitmap.getHeight() * scaleRatio);
    // 创建并返回缩放后的位图对象
    return Bitmap.createScaledBitmap(bitmap, new_width, new_height, false);
}

メソッドのシグネチャ:public static Bitmap getScaleBitmap(Bitmap bitmap, double scaleRatio)

  • bitmapスケーリングされるビットマップ オブジェクトです。
  • scaleRatioスケーリング率です。1 より大きい場合はズームインを意味し、1 より小さい場合はズームアウトを意味します。

メソッド内では、まずスケーリング後の新しい幅と高さを計算します。

int new_width = (int) (bitmap.getWidth() * scaleRatio);
int new_height = (int) (bitmap.getHeight() * scaleRatio);
  • bitmap.getWidth()ソースビットマップの幅を取得します。
  • bitmap.getHeight()ソースビットマップの高さを取得します。
  • scaleRatioはスケーリング率です。

このメソッドを使用してBitmap.createScaledBitmap()、スケーリングされたビットマップ オブジェクトを作成して返します。

return Bitmap.createScaledBitmap(bitmap, new_width, new_height, false);

Bitmap.createScaledBitmap()指定されたソース ビットマップとターゲットの幅と高さに基づいて新しいビットマップを作成するために使用されるメソッド。

  • パラメータの説明:
    • bitmap: ソースビットマップオブジェクト。
    • new_width: ターゲットビットマップの幅。
    • new_height: ターゲットビットマップの高さ。
    • false: ソース ビットマップをその場で変更するかどうか。ここに設定するとfalse、新しいビットマップ オブジェクトを作成することになります。

したがって、このコードの機能は、指定されたビットマップ オブジェクトbitmapを拡大縮小することです。拡大縮小率scaleRatioはパラメータで指定され、拡大縮小されたビットマップ オブジェクトを返します。

おすすめ

転載: blog.csdn.net/A4545156/article/details/131156128