获取拍照图片,显示大图像
生活随笔
收集整理的這篇文章主要介紹了
获取拍照图片,显示大图像
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
獲取拍照?qǐng)D片
標(biāo)準(zhǔn)代碼:
關(guān)鍵是傳地址
顯示大圖像 加載并顯示一幅圖像對(duì)內(nèi)存使用情況具有顯著的影響。例如, HTC G1 電話帶有一個(gè) 320 萬(wàn)像素的攝像頭。 320 萬(wàn)像素的攝像頭通常會(huì)捕獲 2048×1536 像素的圖像。顯示如此 大小的 32 位圖像將需要超過(guò) 100 663kb 或大約 13MB 的內(nèi)存。雖然我們的應(yīng)用程序不一定 會(huì)因此而耗盡內(nèi)存,但是這肯定會(huì)使得內(nèi)存更加容易耗盡。 Android 提供了一個(gè)名為 BitmapFactory 的實(shí)用程序類,該程序類提供了一系列的靜態(tài) 方法,允許通過(guò)各種來(lái)源加載 Bitmap 圖像。針對(duì)我們的需求,將從文件加載圖像,并在最 初的活動(dòng)中顯示它。幸運(yùn)的是, BitmapFactory 中的可用方法將會(huì)調(diào)用 BitmapFactory.Options 類,這使得我們能夠定義如何將 Bitmap 讀入內(nèi)存。具體而言,當(dāng)加載圖像時(shí),可以設(shè)置 BitmapFactory 應(yīng)該使用的采樣大小。在 BitmapFactory.Options 中指定 inSampleSize 參數(shù), 這將表明一旦加載時(shí)結(jié)果 Bitmap 圖像所占的比例。例如,在這里將 inSampleSize 設(shè)置為 8, 這會(huì)產(chǎn)生一幅大小是原始圖像大小 1/8 的圖像。 BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); bmpFactoryOptions.inSampleSize = 8; Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions); imv.setImageBitmap(bmp); 這是一種快速加載大圖像的方法,但是沒(méi)有真正考慮圖像的原始大小,也沒(méi)有考慮屏 幕的大小。最好能夠?qū)D像縮放到剛好適合屏幕。 下面的代碼片段演示了如何使用顯示維度來(lái)確定在加載圖像時(shí)應(yīng)該發(fā)生的減采樣量。 當(dāng)使用這些方法時(shí),應(yīng)確保該圖像盡可能多地填充顯示范圍。但如果該圖像只是要在任何 一個(gè)維度中顯示 100 個(gè)像素,那么應(yīng)該使用這個(gè)值而不是顯示維度,可以通過(guò)如下方式獲 得該值。Display currentDisplay = getWindowManager().getDefaultDisplay(); int dw = currentDisplay.getWidth(); int dh = currentDisplay.getHeight(); 為了確定圖像的所有尺寸(用于計(jì)算),我們使用了 BitmapFactory 和 BitmapFactory. Options, Be From--http://bmbook.5d6d.com/第 1 章 Android 圖像概述 7 并將 BitmapFactory.Options.inJustDecodeBounds 變量設(shè)置為 true。這將通知 BitmapFactory 類只須返回該圖像的范圍,而無(wú)須嘗試解碼圖像本身。當(dāng)使用此方法時(shí), BitmapFactory. Options.outHeight 和 BitmapFactory.Options.outWidth 變量將會(huì)被賦值。 // 加載圖像的尺寸而不是圖像本身 BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); bmpFactoryOptions.inJustDecodeBounds = true; Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions); int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)dh); int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)dw); Log.v("HEIGHTRATIO",""+heightRatio); Log.v("WIDTHRATIO",""+widthRatio); 簡(jiǎn)單地將圖像的尺寸除以顯示的尺寸將獲得顯示的比率。然后,可以選擇是否使用高 度比率或?qū)挾缺嚷?#xff0c;這取決于它們當(dāng)中誰(shuí)更大。只須將這個(gè)比率作為 BitmapFactory.Options. inSampleSize 變量,這將產(chǎn)生一幅應(yīng)該加載到內(nèi)存中的圖像,其尺寸接近于我們?cè)谶@種情 況下所需要的尺寸,也接近于顯示本身的尺寸。 // 如果兩個(gè)比率都大于 1, // 那么圖像的一條邊將大于屏幕 if (heightRatio > 1 && widthRatio > 1) { if (heightRatio > widthRatio) { // 若高度比率更大,則根據(jù)它縮放 bmpFactoryOptions.inSampleSize = heightRatio; } else { // 若寬度比率更大,則根據(jù)它縮放 bmpFactoryOptions.inSampleSize = widthRatio; } } //對(duì)它進(jìn)行真正的解碼 bmpFactoryOptions.inJustDecodeBounds = false; bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions); 下面是通過(guò)一個(gè)意圖使用內(nèi)置攝像頭并顯示結(jié)果圖片的完整示例代碼。圖 1-3 顯示了 一幅由此示例生成的屏幕大小的結(jié)果圖像。 package com.apress.proandroidmedia.ch1.sizedcameraintent; import java.io.File; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.Display; import android.widget.ImageView; public class SizedCameraIntent extends Activity { final static int CAMERA_RESULT = 0; ImageView imv; String imageFilePath; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imageFilePath = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/myfavoritepicture.jpg"; File imageFile = new File(imageFilePath); Uri imageFileUri = Uri.fromFile(imageFile); Intent i = new Intent(android.provider.MediaStore. ACTION_IMAGE_CAPTURE); i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri); startActivityForResult(i, CAMERA_RESULT); } protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (resultCode == RESULT_OK) { // 獲取 ImageView 的引用 imv = (ImageView) findViewById(R.id.ReturnedImageView); Display currentDisplay = getWindowManager().getDefaultDisplay(); int dw = currentDisplay.getWidth(); int dh = currentDisplay.getHeight(); // 加載圖像的尺寸而不是圖像本身 BitmapFactory.Options bmpFactoryOptions = new BitmapFactory .Options(); bmpFactoryOptions.inJustDecodeBounds = true; Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions); int heightRatio = (int)Math.ceil(bmpFactoryOptions. outHeight/(float)dh); int widthRatio = (int)Math.ceil(bmpFactoryOptions. outWidth/(float)dw); Log.v("HEIGHTRATIO",""+heightRatio); Log.v("WIDTHRATIO",""+widthRatio); // 如果兩個(gè)比率都大于 1, // 那么圖像的一條邊將大于屏幕 if (heightRatio > 1 && widthRatio > 1) { if (heightRatio > widthRatio) { // 若高度比率更大,則根據(jù)它縮放 bmpFactoryOptions.inSampleSize = heightRatio; } else { // 若寬度比率更大,則根據(jù)它縮放 bmpFactoryOptions.inSampleSize = widthRatio; } } //對(duì)它進(jìn)行真正的解碼 bmpFactoryOptions.inJustDecodeBounds = false; bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions); // 顯示圖像 imv.setImageBitmap(bmp); } } }
上述代碼需要下列 layout/main.xml 文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/ReturnedImageView" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView> </LinearLayout>
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/mamamia/p/8583040.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的获取拍照图片,显示大图像的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 高通平台smd分析及smem共享内存的创
- 下一篇: Python包的相对导入时出现问题解决