7.多媒体☞图像图形拍照
生活随笔
收集整理的這篇文章主要介紹了
7.多媒体☞图像图形拍照
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
%title multi-meida%toc圖片, 音頻, 視頻, 攝像頭= 圖片 === 加載大圖片到內(nèi)存 ==我們創(chuàng)建虛擬機(jī)時(shí), 默認(rèn)給每個(gè)應(yīng)用分配的內(nèi)存大小是16Mb, (VM Heap 16Mb).如果我們加載大圖片時(shí), 很可能導(dǎo)致內(nèi)存溢出.但是我們會(huì)發(fā)現(xiàn), 即使加載的圖片只有2-3Mb, 也會(huì)溢出, 這是為什么?位圖圖像加載到內(nèi)存中時(shí), 是采用數(shù)組來(lái)存放數(shù)據(jù)的. 一個(gè)圖片其本身可能不是很大,但是在內(nèi)存中想要表示這張圖片, 需要一個(gè)二維數(shù)組, 數(shù)組大小為圖片寬X高(像素?cái)?shù)),這還沒(méi)完, 一個(gè)數(shù)組元素大小要包含RGBA四個(gè)分量, 即4byte, 這樣一乘, 就很大了.如果我們想要加載大圖片, 就要進(jìn)行縮放, 需要下面幾步:# 獲取屏幕的寬高# 獲取圖片的寬高# 獲取水平縮放比例和垂直縮放比例# 使用二者中較大的值對(duì)圖片進(jìn)行縮放代碼如下:{{{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. 獲取手機(jī)屏幕的分辨率 寬高Display? display =?? getWindowManager().getDefaultDisplay();// 下面的方法雖然過(guò)時(shí)了, 但是還是很經(jīng)常用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){// 創(chuàng)建解析器選項(xiàng)Options opts =? new Options();// 設(shè)置解析器 不去真正的解析這個(gè)位圖? 而是解析這個(gè)圖片的out輸出信息,(寬度 高度)// 不會(huì)為圖片的每個(gè)點(diǎn) 申請(qǐng)內(nèi)存空間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;}// 真正的解析這個(gè)位圖opts.inJustDecodeBounds = false;// 設(shè)置縮放比例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));== 從圖庫(kù)選擇圖片 ==這個(gè)比較簡(jiǎn)單, 我們只需要開(kāi)啟系統(tǒng)圖庫(kù)應(yīng)用的activity, 讓其返回?cái)?shù)據(jù)即可.{{{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相關(guān)的操作都可以交給 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);}}}}}== 創(chuàng)建圖像的內(nèi)存拷貝 ==在應(yīng)用中, 我們經(jīng)常會(huì)需要對(duì)一個(gè)圖片進(jìn)行處理, 如旋轉(zhuǎn), 縮放, 平移等等, 我們不能拿著一個(gè)圖片的原圖進(jìn)行處理, 而是要?jiǎng)?chuàng)建一個(gè)原圖的拷貝, 對(duì)這個(gè)拷貝的圖像進(jìn)行處理. 下面的代碼演示了如何創(chuàng)建圖像的內(nèi)存拷貝{{{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);//創(chuàng)建一個(gè)原圖的拷貝, 把拷貝的圖片 放在iv_dest//原圖對(duì)應(yīng)的bitmap? 注意:這個(gè)圖片是只讀的 不可以被修改.Bitmap bitmap = BitmapFactory.decodeStream(is);//創(chuàng)建一個(gè)可以被修改的位圖資源,寬高信息 和 圖片的類型 跟原圖是一模一樣//下面的代碼創(chuàng)建的圖片 是一個(gè)空白的圖片??????????????? Bitmap? alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());// 拿著可以被修改的圖片創(chuàng)建一個(gè)畫(huà)布, 之后畫(huà)的東西就要畫(huà)在這塊畫(huà)布上了.??????????????? Canvas canvas = new Canvas(alterBitmap);// 創(chuàng)建一個(gè)畫(huà)筆, 可以拿著它畫(huà)東西Paint paint = new Paint();//創(chuàng)建圖形的拷貝, 其實(shí)就是把原圖按照 Matrix 定義的信息滑到之前的畫(huà)布上.??????????????? canvas.drawBitmap(bitmap, new Matrix(), paint);// 再往上面寫(xiě)點(diǎn)字paint.setColor(Color.BLACK);canvas.drawText("美女", 10, 10, paint);iv_dest.setImageBitmap(alterBitmap);} catch (FileNotFoundException e) {e.printStackTrace();}}super.onActivityResult(requestCode, resultCode, data);}}}}}== 圖像的簡(jiǎn)單處理 ==有了圖像的內(nèi)存拷貝, 我們就可以方便的對(duì)圖像進(jìn)行處理了.1. 縮放{{{class="brush:java"// 創(chuàng)建一個(gè)bitmap, 作為可以修改的圖像, 為什么這里要搞成這個(gè)大小? // 這將是我們創(chuàng)建的畫(huà)布的大小, 無(wú)論圖像怎么縮放, 畫(huà)布就是這么大Bitmap? alterBitmap = Bitmap.createBitmap(bitmap.getWidth()/2, (int)(bitmap.getHeight()*1.2), bitmap.getConfig());//拿著可以被修改的圖片創(chuàng)建一個(gè)畫(huà)布.Canvas canvas = new Canvas(alterBitmap);Paint paint = new Paint();// Matrix 是一個(gè)坐標(biāo)矩陣, 可以用來(lái)指定圖像每個(gè)點(diǎn)的坐標(biāo)計(jì)算方式// matrix有一個(gè)計(jì)算公式, 參看圖形學(xué)pptMatrix matrix = new Matrix();// 這些參數(shù)是 X, Y , Z 軸/*matrix.setValues(new float[] {0.5f, 0, 0,0, 1.2f, 0,0, 0, 1});*/// 簡(jiǎn)單的方法設(shè)置縮放量, x軸, y軸matrix.setScale(0.5f, 1.2f);// 把原圖按照設(shè)定好的 matrix 畫(huà)到畫(huà)布上canvas.drawBitmap(bitmap, matrix, paint);}}}2. 旋轉(zhuǎn){{{class="brush:java"// 為什么寬度要加60? 旋轉(zhuǎn)后圖片可能超出原來(lái)的范圍了, 所以要加寬一點(diǎn).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();// 第一個(gè)參數(shù)指定旋轉(zhuǎn)角度, 后面兩個(gè)參數(shù)指定旋轉(zhuǎn)中心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();// 設(shè)置偏移量, 第一個(gè)為x軸, 第二個(gè)為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軸變?yōu)樨?fù)的, 第一個(gè)參數(shù)給-1, 算是縮放的另一種形式吧matrix.setScale(-1, 1);// x軸變成負(fù)的后, 還要在平移回來(lái), 要不就看不見(jiàn)了.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軸變成負(fù)的即可matrix.setScale(1, -1);matrix.postTranslate(0,bitmap.getHeight());canvas.drawBitmap(bitmap, matrix, paint);}}}谷歌: www.google.ie or www.google.fr搜索: 圖像處理 filetype:ppt== 扒掉美女的衣服 ==== 處理圖片的顏色 ==圖像的位移, 旋轉(zhuǎn)等需要的是 坐標(biāo)矩陣, 修改圖像的顏色則需要修改圖片的顏色矩陣.{{{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();// 創(chuàng)建一個(gè)顏色矩陣, 這些參數(shù)為 R, G, B, AColorMatrix cm = new ColorMatrix();// 把紅色調(diào)成兩倍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);}}}== 圖片合成/人臉識(shí)別 ==face++-------------------------------SeekBar 是 ProgressBar 的子類-------------自己寫(xiě)個(gè)音樂(lè)播放器多線程斷線下載, 重寫(xiě)一遍-------------
來(lái)自為知筆記(Wiz)
來(lái)自為知筆記(Wiz)
轉(zhuǎn)載于:https://www.cnblogs.com/ywq-come/p/5925287.html
總結(jié)
以上是生活随笔為你收集整理的7.多媒体☞图像图形拍照的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 嵌入式Linux学习笔记(0)基础命令。
- 下一篇: Codeforces Round #37