91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android關于圖片的處理

發布時間:2020-07-30 12:33:00 來源:網絡 閱讀:6217 作者:雪飄七月 欄目:移動開發

一、布局中顯示圖片
在布局的xml中布局圖片的時候用ImageView,用src去指定圖片所在位置。如下代碼所示,指定的就是工程目錄(/res/drawable)中文件名為unknown.png的圖片。
這里要注意的是Android Studio在布局時只認png格式的圖片,即使是jpeg格式,僅把后綴改為png也不行,編譯時會不通過。

<ImageView 
                android:id="@+id/iv_mytest"
                android:src="@drawable/unknown" />

但是,也不等于jpeg格式的圖片就不能顯示,我們可以通過如下代碼處理的方式來展示到界面上。

String imgPath = Environment.getExternalStorageDirectory() + "test.jpg";
ImageView iv_mytest = (ImageView) findViewById(R.id.iv_mytest);
iv_mytest.setVisibility(View.VISIBLE);
if(!imgPath.equals("")) {
        Bitmap tempBitmap = BitmapFactory.decodeFile(imgPath);
        iv_mytest.setImageBitmap(tempBitmap);//顯示圖片
}

二、拍照后顯示圖片
拍照流程為獲取緩存圖片路徑->進入拍照界面->拍照界面拍照后自動存到緩存圖片路徑中->進入回調函數->對緩存圖片進行處理(如旋轉縮放等)并存儲到自己指定位置->刪除緩存路徑圖片。
具體代碼如下所示:

private String tmpfilename = "";
//調用拍照界面
private void photograph(){
        try {
                // 跳轉至拍照界面
                String sdStatus = Environment.getExternalStorageState();
                if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 檢測sd是否可用
                        ToastUtil.showToastMsgError(MyTestActivity.this,"SD card is not avaiable/writeable right now.");
                        return;
                }

                tmpfilename=getTempFilePath();
                File out = new File(tmpfilename);

                Intent intentPhote = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                if (Build.VERSION.SDK_INT >= 24) {
                        //臨時添加一個拍照權限
                        intentPhote.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        //通過FileProvider獲取uri
                        contentUri = FileProvider.getUriForFile(getActivity(),
                                        "com.tmri.rfid.eri.internet.fileProvider",  out);
                        intentPhote.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
                } else {
                        mImageCaptureUri = Uri.fromFile(out);
                        intentPhote.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
                }

                startActivityForResult(intentPhote, 1);
        }catch (Exception e) {

        }
}

/**
 * 獲取原緩存圖片存儲路徑
 * @return
 */
private String getTempFilePath() {
        // 照片全路徑
        String fileName = "";
        // 文件夾路徑
        String pathUrl = Environment.getExternalStorageDirectory()+"/tmp/";

        imagename = "mytest.png";
        File file = new File(pathUrl);
        file.mkdirs();// 創建文件夾
        fileName = pathUrl + imagename;
        return fileName;
}

//拍取照后的回調
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true; // 設置了此屬性一定要記得將值設置為false
                Bitmap bitmap = BitmapFactory.decodeFile(tmpfilename);
                // 防止OOM發生
                options.inJustDecodeBounds = false;
                saveMyBitmap(imagename,bitmap);

                File old = new File(Environment.getExternalStorageDirectory() + "/tmp/");
                FileUtil.deleteFile(old);//刪除緩存圖片

                String resultMsg = "圖片已保存";
                ToastUtil.showToastMsgSuccess(this, resultMsg);
        }
}

//將圖像保存到SD卡中
public void saveMyBitmap(String bitName, Bitmap mBitmap) {
        String thisDate = formatter_date.format(new Date());
        File f = FileUtil.getFilePath(Environment.getExternalStorageDirectory() + "/rfid/prehairpin/"+thisDate+"/", bitName);
        String realfilepath = f.getPath();
        FileOutputStream fOut = null;
        try {
                fOut = new FileOutputStream(f);
        } catch (Exception e) {
                e.printStackTrace();
        }

        Matrix matrix = new Matrix();

        // 按照固定大小對圖片進行縮放
        matrix.postScale(0.3f, 0.3f);
        System.out.println(mBitmap.getWidth() + mBitmap.getHeight());
        if (mBitmap.getHeight() < mBitmap.getWidth()) {
                matrix.postRotate(90);  //翻轉90度
        }
        mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true);
        mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);

        try {
                fOut.write(("my secret message").getBytes());//我在這邊偷偷給圖片結尾藏了一些信息
                fOut.flush();
        } catch (IOException e) {
                e.printStackTrace();
        }
        try {
                fOut.close();
        } catch (IOException e) {
                e.printStackTrace();
        }
}

三、圖片的處理
旋轉、縮放等操作我們是通過Matrix來處理的,Matrix還有很多其他圖形處理的方法,可以另開一篇去講述。

Matrix matrix = new Matrix();
// 按照固定大小對圖片進行縮放
matrix.postScale(0.3f, 0.3f);
if (mBitmap.getHeight() < mBitmap.getWidth()) {
        matrix.postRotate(90);  //翻轉90度
}
mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true);
mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);

上面是按比例縮小,下面是按固定分辨率縮放

Matrix matrix = new Matrix();
int dstWidth = 800;
int dstHeight = 600;
if (mBitmap.getHeight() > mBitmap.getWidth()) {
        matrix.postRotate(90);  //翻轉90度

        final float sx = dstWidth / (float) mBitmap.getHeight();
        final float sy = dstHeight / (float) mBitmap.getWidth();
        matrix.postScale(sx, sy);
}else{
        final float sx = dstWidth / (float) mBitmap.getWidth();
        final float sy = dstHeight / (float) mBitmap.getHeight();
        matrix.postScale(sx, sy);
}
Bitmap endBit = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true);
endBit.compress(Bitmap.CompressFormat.JPEG, 100, fOut);//jpeg格式縮放的圖片大小基本只占png的一半

保存圖片,并將字符存入圖片(有時候拍照后希望將一些信息與圖片綁定起來,直接記錄文件名又擔心被人篡改,就想到了這種在圖片文件末尾記錄一些信息的方式)

String thisDate = formatter_date.format(new Date());
File f = FileUtil.getFilePath(Environment.getExternalStorageDirectory() + "/rfid/prehairpin/"+thisDate+"/", bitName);
String realfilepath = f.getPath();
FileOutputStream fOut = null;
try {
        fOut = new FileOutputStream(f);
} catch (Exception e) {
        e.printStackTrace();
}
//我在這邊偷偷給圖片結尾藏了一些信息
try {
        fOut.write(("my secret message").getBytes());
        fOut.flush();
} catch (IOException e) {
        e.printStackTrace();
}
try {
        fOut.close();
} catch (IOException e) {
        e.printStackTrace();
}

四、圖片格式的差異
png、jpeg因為格式的差異,在內部添加字符信息時會不一樣,比如png格式結尾處就是圖片信息,所以添加的話直接在末尾添加就可以;而jpeg不行,jpeg末尾是有固定格式信息的,直接加載末尾雖然不影響圖片顯示,但是在解析時就會因為位置偏移解析出來的字符信息就不對了。
這一塊內容還有待去深入研究下,當時也只是試驗了兩種格式,發現了這一問題。
更新于20190711,經嘗試jpeg也可以再末尾寫入信息,且jpeg縮放的圖片大小僅占png格式縮放的圖片一半大小。
但是,此時jpeg格式的圖片直接解析是沒有問題的,一經上傳就無法解析末尾寫入的信息了。
為何經過上傳后末尾的信息無法解析的問題,還有待研究!還望知道的朋友不吝賜教!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新竹县| 东兴市| 成都市| 丹凤县| 略阳县| 万载县| 庐江县| 岑巩县| 榆社县| 成都市| 奎屯市| 长治市| 河池市| 腾冲县| 青岛市| 宣城市| 高唐县| 通山县| 三门县| 葵青区| 金昌市| 高雄市| 玛曲县| 温泉县| 新建县| 彰武县| 兴义市| 万安县| 崇左市| 哈密市| 汉寿县| 边坝县| 法库县| 望江县| 田林县| 雷波县| 威信县| 五家渠市| 福海县| 象山县| 旌德县|