一、布局中顯示圖片
在布局的xml中布局圖片的時候用ImageView,用src去指定圖片所在位置。如下代碼所示,指定的就是工程目錄(/res/drawable)中文件名為unknown.png的圖片。
這里要注意的是Android Studio在布局時只認(rèn)png格式的圖片,即使是jpeg格式,僅把后綴改為png也不行,編譯時會不通過。
目前創(chuàng)新互聯(lián)建站已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、海棠網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
但是,也不等于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);//顯示圖片
}
二、拍照后顯示圖片
拍照流程為獲取緩存圖片路徑->進(jìn)入拍照界面->拍照界面拍照后自動存到緩存圖片路徑中->進(jìn)入回調(diào)函數(shù)->對緩存圖片進(jìn)行處理(如旋轉(zhuǎn)縮放等)并存儲到自己指定位置->刪除緩存路徑圖片。
具體代碼如下所示:
private String tmpfilename = "";
//調(diào)用拍照界面
private void photograph(){
try {
// 跳轉(zhuǎn)至拍照界面
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) {
//臨時添加一個拍照權(quán)限
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();// 創(chuàng)建文件夾
fileName = pathUrl + imagename;
return fileName;
}
//拍取照后的回調(diào)
@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; // 設(shè)置了此屬性一定要記得將值設(shè)置為false
Bitmap bitmap = BitmapFactory.decodeFile(tmpfilename);
// 防止OOM發(fā)生
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();
// 按照固定大小對圖片進(jìn)行縮放
matrix.postScale(0.3f, 0.3f);
System.out.println(mBitmap.getWidth() + mBitmap.getHeight());
if (mBitmap.getHeight() < mBitmap.getWidth()) {
matrix.postRotate(90); //翻轉(zhuǎn)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());//我在這邊偷偷給圖片結(jié)尾藏了一些信息
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
三、圖片的處理
旋轉(zhuǎn)、縮放等操作我們是通過Matrix來處理的,Matrix還有很多其他圖形處理的方法,可以另開一篇去講述。
Matrix matrix = new Matrix();
// 按照固定大小對圖片進(jìn)行縮放
matrix.postScale(0.3f, 0.3f);
if (mBitmap.getHeight() < mBitmap.getWidth()) {
matrix.postRotate(90); //翻轉(zhuǎn)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); //翻轉(zhuǎn)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的一半
保存圖片,并將字符存入圖片(有時候拍照后希望將一些信息與圖片綁定起來,直接記錄文件名又擔(dān)心被人篡改,就想到了這種在圖片文件末尾記錄一些信息的方式)
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();
}
//我在這邊偷偷給圖片結(jié)尾藏了一些信息
try {
fOut.write(("my secret message").getBytes());
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
四、圖片格式的差異png、jpeg因?yàn)楦袷降牟町?,在?nèi)部添加字符信息時會不一樣,比如png格式結(jié)尾處就是圖片信息,所以添加的話直接在末尾添加就可以;而jpeg不行,jpeg末尾是有固定格式信息的,直接加載末尾雖然不影響圖片顯示,但是在解析時就會因?yàn)槲恢闷平馕龀鰜淼淖址畔⒕筒粚α恕?/del>這一塊內(nèi)容還有待去深入研究下,當(dāng)時也只是試驗(yàn)了兩種格式,發(fā)現(xiàn)了這一問題。
更新于20190711,經(jīng)嘗試jpeg也可以再末尾寫入信息,且jpeg縮放的圖片大小僅占png格式縮放的圖片一半大小。
但是,此時jpeg格式的圖片直接解析是沒有問題的,一經(jīng)上傳就無法解析末尾寫入的信息了。
為何經(jīng)過上傳后末尾的信息無法解析的問題,還有待研究!還望知道的朋友不吝賜教!