7.多媒体☞图像图形拍照
生活随笔
收集整理的這篇文章主要介紹了
7.多媒体☞图像图形拍照
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
%title multi-meida%toc圖片, 音頻, 視頻, 攝像頭= 圖片 === 加載大圖片到內存 ==我們創建虛擬機時, 默認給每個應用分配的內存大小是16Mb, (VM Heap 16Mb).如果我們加載大圖片時, 很可能導致內存溢出.但是我們會發現, 即使加載的圖片只有2-3Mb, 也會溢出, 這是為什么?位圖圖像加載到內存中時, 是采用數組來存放數據的. 一個圖片其本身可能不是很大,但是在內存中想要表示這張圖片, 需要一個二維數組, 數組大小為圖片寬X高(像素數),這還沒完, 一個數組元素大小要包含RGBA四個分量, 即4byte, 這樣一乘, 就很大了.如果我們想要加載大圖片, 就要進行縮放, 需要下面幾步:# 獲取屏幕的寬高# 獲取圖片的寬高# 獲取水平縮放比例和垂直縮放比例# 使用二者中較大的值對圖片進行縮放代碼如下:{{{class="brush:java"public class MainActivity extends Activity {private ImageView iv;private int windowWidth ;private int windowHeight ;@SuppressWarnings("deprecation")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv = (ImageView) findViewById(R.id.iv);//1. 獲取手機屏幕的分辨率 寬高Display? display =?? getWindowManager().getDefaultDisplay();// 下面的方法雖然過時了, 但是還是很經常用windowWidth = display.getWidth();windowHeight = display.getHeight();// Point p = new Point();// display.getSize(p);// p.x; p.y;System.out.println("窗體的寬度:"+windowWidth);System.out.println("窗體的高度:"+windowHeight);}public void click(View view){// 創建解析器選項Options opts =? new Options();// 設置解析器 不去真正的解析這個位圖? 而是解析這個圖片的out輸出信息,(寬度 高度)// 不會為圖片的每個點 申請內存空間opts.inJustDecodeBounds = true;??? BitmapFactory.decodeFile("/sdcard/IMG_0017.JPG", opts);// 得到圖像的寬高int picHeight = opts.outHeight;int picWidth = opts.outWidth;int scaleX = picWidth / windowWidth;int scaleY = picHeight / windowHeight;int scale = 1;if(scaleX>scaleY &&? scaleY >1){//按照水平縮放scale = scaleX;}if(scaleY>scaleX &&? scaleX >1){//按照豎直平縮放scale = scaleY;}// 真正的解析這個位圖opts.inJustDecodeBounds = false;// 設置縮放比例opts.inSampleSize = scale;Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/IMG_0017.JPG",opts);iv.setImageBitmap(bitmap);}}}}}== 圖像的exif信息 ==ExifInterface exif = new ExifInterface("/sdcard/IMG_0017.JPG");System.out.println(exif.getAttribute(ExifInterface.TAG_DATETIME));== 從圖庫選擇圖片 ==這個比較簡單, 我們只需要開啟系統圖庫應用的activity, 讓其返回數據即可.{{{class="brush:java"public class MainActivity extends Activity {private ImageView iv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv = (ImageView) findViewById(R.id.iv);}public void click(View view){Intent intent = new Intent();intent.setAction("android.intent.action.PICK");intent.addCategory("android.intent.category.DEFAULT");intent.setType("image/*");startActivityForResult(intent, 0);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if(data!=null){Uri uri = data.getData();try {// 所有uri相關的操作都可以交給 ContentResolver InputStream is = getContentResolver().openInputStream(uri);Options opts = new Options();opts.inSampleSize = 8;Bitmap bitmap = BitmapFactory.decodeStream(is, new Rect(), opts);iv.setImageBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();}}super.onActivityResult(requestCode, resultCode, data);}}}}}== 創建圖像的內存拷貝 ==在應用中, 我們經常會需要對一個圖片進行處理, 如旋轉, 縮放, 平移等等, 我們不能拿著一個圖片的原圖進行處理, 而是要創建一個原圖的拷貝, 對這個拷貝的圖像進行處理. 下面的代碼演示了如何創建圖像的內存拷貝{{{class="brush:java"@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (data != null) {Uri uri = data.getData();iv_src.setImageURI(uri);try { InputStream is = getContentResolver().openInputStream(uri);//創建一個原圖的拷貝, 把拷貝的圖片 放在iv_dest//原圖對應的bitmap? 注意:這個圖片是只讀的 不可以被修改.Bitmap bitmap = BitmapFactory.decodeStream(is);//創建一個可以被修改的位圖資源,寬高信息 和 圖片的類型 跟原圖是一模一樣//下面的代碼創建的圖片 是一個空白的圖片??????????????? Bitmap? alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());// 拿著可以被修改的圖片創建一個畫布, 之后畫的東西就要畫在這塊畫布上了.??????????????? Canvas canvas = new Canvas(alterBitmap);// 創建一個畫筆, 可以拿著它畫東西Paint paint = new Paint();//創建圖形的拷貝, 其實就是把原圖按照 Matrix 定義的信息滑到之前的畫布上.??????????????? canvas.drawBitmap(bitmap, new Matrix(), paint);// 再往上面寫點字paint.setColor(Color.BLACK);canvas.drawText("美女", 10, 10, paint);iv_dest.setImageBitmap(alterBitmap);} catch (FileNotFoundException e) {e.printStackTrace();}}super.onActivityResult(requestCode, resultCode, data);}}}}}== 圖像的簡單處理 ==有了圖像的內存拷貝, 我們就可以方便的對圖像進行處理了.1. 縮放{{{class="brush:java"// 創建一個bitmap, 作為可以修改的圖像, 為什么這里要搞成這個大小? // 這將是我們創建的畫布的大小, 無論圖像怎么縮放, 畫布就是這么大Bitmap? alterBitmap = Bitmap.createBitmap(bitmap.getWidth()/2, (int)(bitmap.getHeight()*1.2), bitmap.getConfig());//拿著可以被修改的圖片創建一個畫布.Canvas canvas = new Canvas(alterBitmap);Paint paint = new Paint();// Matrix 是一個坐標矩陣, 可以用來指定圖像每個點的坐標計算方式// matrix有一個計算公式, 參看圖形學pptMatrix matrix = new Matrix();// 這些參數是 X, Y , Z 軸/*matrix.setValues(new float[] {0.5f, 0, 0,0, 1.2f, 0,0, 0, 1});*/// 簡單的方法設置縮放量, x軸, y軸matrix.setScale(0.5f, 1.2f);// 把原圖按照設定好的 matrix 畫到畫布上canvas.drawBitmap(bitmap, matrix, paint);}}}2. 旋轉{{{class="brush:java"// 為什么寬度要加60? 旋轉后圖片可能超出原來的范圍了, 所以要加寬一點.Bitmap? alterBitmap = Bitmap.createBitmap(bitmap.getWidth()+60, bitmap.getHeight(), bitmap.getConfig());Canvas canvas = new Canvas(alterBitmap);Paint paint = new Paint();paint.setAntiAlias(true);Matrix matrix = new Matrix();// 第一個參數指定旋轉角度, 后面兩個參數指定旋轉中心matrix.setRotate(30, bitmap.getWidth()/2, bitmap.getHeight()/2);canvas.drawBitmap(bitmap, matrix, paint);}}}3. 平移{{{class="brush:java"Bitmap? alterBitmap = Bitmap.createBitmap(bitmap.getWidth()+60, bitmap.getHeight(), bitmap.getConfig());??? Canvas canvas = new Canvas(alterBitmap);Paint paint = new Paint();paint.setAntiAlias(true);Matrix matrix = new Matrix();// 設置偏移量, 第一個為x軸, 第二個為y軸matrix.postTranslate(20, 0);canvas.drawBitmap(bitmap, matrix, paint);}}}4. 鏡面{{{class="brush:java"Bitmap? alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());Canvas canvas = new Canvas(alterBitmap);Paint paint = new Paint();paint.setAntiAlias(true);Matrix matrix = new Matrix();// 如果想讓x軸變為負的, 第一個參數給-1, 算是縮放的另一種形式吧matrix.setScale(-1, 1);// x軸變成負的后, 還要在平移回來, 要不就看不見了.matrix.postTranslate(bitmap.getWidth(),0);canvas.drawBitmap(bitmap, matrix, paint);}}}5. 倒影{{{class="brush:java"Bitmap? alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());Canvas canvas = new Canvas(alterBitmap);Paint paint = new Paint();paint.setAntiAlias(true);Matrix matrix = new Matrix();// y軸變成負的即可matrix.setScale(1, -1);matrix.postTranslate(0,bitmap.getHeight());canvas.drawBitmap(bitmap, matrix, paint);}}}谷歌: www.google.ie or www.google.fr搜索: 圖像處理 filetype:ppt== 扒掉美女的衣服 ==== 處理圖片的顏色 ==圖像的位移, 旋轉等需要的是 坐標矩陣, 修改圖像的顏色則需要修改圖片的顏色矩陣.{{{class="brush:java"alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());canvas = new Canvas(alterBitmap);paint = new Paint();paint.setAntiAlias(true);Matrix matrix = new Matrix();// 創建一個顏色矩陣, 這些參數為 R, G, B, AColorMatrix cm = new ColorMatrix();// 把紅色調成兩倍cm.set(new float[] {2, 0, 0, 0, 0,0, 1, 0, 0, 0,0, 0, 1, 0, 0,0, 0, 0, 1, 0});paint.setColorFilter(new ColorMatrixColorFilter(cm));canvas.drawBitmap(bitmap, matrix, paint);}}}== 圖片合成/人臉識別 ==face++-------------------------------SeekBar 是 ProgressBar 的子類-------------自己寫個音樂播放器多線程斷線下載, 重寫一遍-------------
來自為知筆記(Wiz)
來自為知筆記(Wiz)
轉載于:https://www.cnblogs.com/ywq-come/p/5925287.html
總結
以上是生活随笔為你收集整理的7.多媒体☞图像图形拍照的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式Linux学习笔记(0)基础命令。
- 下一篇: Codeforces Round #37