人才培養

manbetxapp下载 包裝工程係
人才培養

《包裝信息技術》--Android Studio編程實現攝像頭調用、打開本地圖片、存儲當前圖片、圖片塗鴉等操作方法實例

編輯:王宏濤 發布時間:2021-10-20

 

1、MainActivity.java函數代碼

package com.example.camerapictureoperation;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
   private Uri mImageCaptureUri;
   private ImageView mImageView;
   EditText txinfo;
   Bitmap bitmap;
   Button bn1,bn2,bn3,bn4;
   String path= Environment.getExternalStorageDirectory()+ File.separator+"DCIM"+File.separator+"Camera"+File.separator+"temp.jpg";
   @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)

@Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       txinfo =findViewById(R.id.tx);
       mImageView = findViewById(R.id.imageView);
       bn1 =findViewById(R.id.bn1);
       bn2 =findViewById(R.id.bn2);
       bn3 =findViewById(R.id.bn3);
       bn4 =findViewById(R.id.bn4);

Permission();
       OpenCamera(mImageView);
       SelectPictureFromSDCard(mImageView);
       SavePicture(mImageView);
       DrawonPicture(mImageView);
   }

//照片打開函數:定義按鈕1響應函數,實現手機攝像頭的調用,之後由下麵的回調函數實現所拍攝的照片顯示至圖形控件區域
   public void OpenCamera(View v) {
       bn1.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
               mImageCaptureUri=Uri.fromFile(new File(path));
               cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
               startActivityForResult(cameraIntent, 123);  }
       });
   }

//相冊打開函數:定義按鈕2響應函數,實現從手機相冊瀏覽、選擇圖片,之後由下麵的回調函數實現圖片顯示至圖形控件區域
   public void SelectPictureFromSDCard(View v) {
       bn2.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               Intent intent = new Intent();
               intent.setType("image/*");
               intent.setAction(Intent.ACTION_GET_CONTENT);
               startActivityForResult(Intent.createChooser(intent, "Complete action using"), 456);
           }
       });
   }

//存儲函數:定義按鈕3響應函數,獲取圖片及圖片名稱,調用圖片存儲函數,實現圖片按給定名稱存儲至手機內存
   public void SavePicture(View v) {
       bn3.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               String picturename =txinfo.getText().toString();
               Bitmap bitm=Bitmap.createBitmap(bitmap);
               try {
                   saveToLocal(bitm,picturename);
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       });
   }

//圖片塗鴉函數:定義按鈕4響應函數,實現圖形控件區域的圖像的各項參數調用及圖片塗鴉操作
   public void DrawonPicture(View v) {
       bn4.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               Bitmap bms=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth()-1,bitmap.getHeight()-1);
               //畫紅色矩形框,模擬掃描光線
               int intx=bms.getWidth()-1;
               int inty=bms.getHeight()-1;
               RectF rect;
               rect = new RectF(0,inty/2 -3,intx,inty/2 +3);
               Canvas canvas = new Canvas(bms);
               Paint paint;
               paint =new Paint();
               paint.setColor(Color.RED );
               canvas.drawRect(rect, paint);
               mImageView.setImageBitmap(bms);

//從左向右取出各像素值,計算平均像素
               int pix=0;
               int avepix=0;
               for (int i=1;i<intx;i++){
                   pix=bms.getPixel(i,inty/2-5) ;
                   avepix=avepix+pix/intx;
               }
               txinfo.setText("平均像素值為"+avepix);

//從左至由讀取條碼圖片各像素值,對比平均像素值,將像素2值化
               /*String str="";
               for (int i=1;i<intx;i++){
                   pix=bms.getPixel(i,inty/2-5) ;
                   if (pix<avepix) str=str+"1";
                   else if  (pix>avepix) str=str+"0";
               }*/
           }
       });
   }

//圖片存儲函數:用來實現將圖片按給定名稱存儲至手機內存
   public void saveToLocal(Bitmap bitmap, String bitName) throws IOException {
       File file = new File("/sdcard/DCIM/Camera/" + bitName + ".jpg");
       if (file.exists()) {
           file.delete();
       }
       FileOutputStream out;
       try {
           out = new FileOutputStream(file);
           if (bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out)) {
               out.flush();
               out.close();
               //保存圖片後發送廣播通知更新數據庫
               Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
               Uri uri = Uri.fromFile(file);
               intent.setData(uri);
               this.sendBroadcast(intent);
               txinfo.setText("恭喜!圖片存儲成功!");
           }
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }
   }

//回調函數:用來處理拍照函數及打開圖片函數運行的結果
   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
       if (resultCode != RESULT_OK) return;
       if (requestCode == 456)   {
           mImageCaptureUri = data.getData();
           mImageView.setImageURI(mImageCaptureUri);
           mImageView.setDrawingCacheEnabled(true);
           bitmap= Bitmap.createBitmap(mImageView.getDrawingCache());
           mImageView.setDrawingCacheEnabled(false);
       }
       else if (requestCode == 123)   {
           mImageView.setImageURI(mImageCaptureUri);
           mImageView.setDrawingCacheEnabled(true);
           bitmap= Bitmap.createBitmap(mImageView.getDrawingCache());
           mImageView.setDrawingCacheEnabled(false);
       }
       mImageView.setImageBitmap(bitmap);
   }

//授權函數,須在主程序中調用一下
   public void Permission(){
       //安卓7.0調用相機
       StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
       StrictMode.setVmPolicy(builder.build());
       builder.detectFileUriExposure();

//動態申請權限
       if (Build.VERSION.SDK_INT >= 23) {
           int REQUEST_CODE_CONTACT = 101;
           String[] permissions = {Manifest.permission.READ_CONTACTS,Manifest.permission.WRITE_CONTACTS,//聯係人的權限
                   Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};//讀寫SD卡權限
           //驗證是否許可權限
           for (String str : permissions) {
               if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
                   //申請權限
                   this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
               }
           }
       }
   }

}

 

 

 

2、activity_main.xml函數代碼

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">

<LinearLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical"
       tools:layout_editor_absoluteX="-78dp"
       tools:layout_editor_absoluteY="-251dp">

<Button
           android:id="@+id/bn1"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:onClick="OpenCamera"
           android:text="Button" />

<Button
           android:id="@+id/bn2"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:onClick="SelectPictureFromSDCard"
           android:text="Button" />

<Button
           android:id="@+id/bn3"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:onClick="SavePicture"
           android:text="Button" />

<Button
           android:id="@+id/bn4"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:onClick="DrawonPicture"
           android:text="Button" />

<EditText
           android:id="@+id/tx"
           android:layout_width="match_parent"
           android:layout_height="99dp"
           android:text="EditText" />

<ImageView
           android:id="@+id/imageView"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           tools:srcCompat="@tools:sample/avatars" />

</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

 

 

3、AndroidManifest.xml函數代碼

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.camerapictureoperation">

<application
       android:allowBackup="true"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:roundIcon="@mipmap/ic_launcher_round"
       android:supportsRtl="true"
       android:theme="@style/Theme.CameraPictureOperation">
       <activity android:name=".MainActivity">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
   </application>
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
</manifest>

 

 

掃一掃分享本頁