標籤:
一.映像的兩種分類
位元影像:也被稱為點陣映像或者繪製映像,是由像素的一系列單個點組成的。這些點可以進行不同的排列和染色以構成圖樣。當放大位元影像時,從而使得線條和形狀顯得參差不齊。
向量圖:也被稱為物件導向的映像或繪圖映像,在數學上定義為一系列由先串連的點。也就是常說的數學函數的軌跡。
二.映像的載入
1.普通圖片載入到記憶體
先將一張小圖片拷貝到記憶卡中,布局就一個ImageView和Button,點擊Button載入出映像。
Button的點擊事件:
public void loadImage(View view){if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ String path=Environment.getExternalStorageDirectory()+"/img_small_1.jpg"; Bitmap bitmap =BitmapFactory.decodeFile(path); iv.setImageBitmap(bitmag); }}
2.大圖片載入
如今的圖片像素往往比手機螢幕還要大,若是將大圖片顯示到這樣的手機螢幕上容易記憶體溢出(以前),而且還不能完美的展示圖片的精度。這裡涉及到一個載入大圖片需要用到的“採樣率”。
我們需要先擷取當前裝置的螢幕資訊,再擷取需要載入的圖片的大小,計算出採樣率,載入圖片。
public void loadImage(View view){ if(Environment.getExternalStorageState() .equals(Environment.MEDIA_MOUNTED)){ String path=Environment.getExternalStorageDirectory()+"/img_big_1.jpg"; Options options=new Options(); //設定圖片的採樣率 //擷取螢幕的寬高 WindowManager windowManager=(WindowManager) getSystemService(WINDOW_SERVICE);// int screenwidth=windowManager.getDefaultDisplay().getWidth();// int screenheigh=windowManager.getDefaultDisplay().getHeight(); Display display=windowManager.getDefaultDisplay(); Point point=new Point(); display.getSize(point); int screenWidth=point.x; int screenHeigh=point.y; System.out.println(screenWidth); System.out.println(screenHeigh); //擷取原圖的寬高 try { ExifInterface exifInterface=new ExifInterface(path); int imageWidth=exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 0); int imageHeigth=exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, 0); int sampleWidth=(int)(imageWidth*1.0f/screenWidth+0.5f);//加0.5就是為了四捨五入 int sampleHeight=(int)(imageHeigth*1.0f/screenHeigh+0.5f); int sample=(int)(Math.sqrt(sampleWidth*sampleWidth+sampleHeight*sampleHeight)+0.5f);//採樣率公式 options.inSampleSize=sample;//原寬*1/4,原長*1/4 Bitmap bitmap=BitmapFactory.decodeFile(path,options); iv.setImageBitmap(bitmap); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } options.inSampleSize=2;//原寬*1/4,原長*1/4 } }
三.映像的操作處理
首先先講一下如何畫出和原來映像一模一樣的圖片:
private ImageView iv; //圖紙 private Bitmap baseBitmap,copyBitmap; //畫板 private Canvas canvas; //畫筆 private Paint paint; public void btn(View view){ //拿到原圖 baseBitmap =BitmapFactory.decodeResource(getResources(), R.drawable.img_small_1); //先拿到一張與原圖大小一樣的紙 copyBitmap=Bitmap.createBitmap(baseBitmap.getWidth(),baseBitmap.getHeight(),baseBitmap.getConfig()); //將這張紙固定在畫板上 canvas=new Canvas(copyBitmap); //找畫筆 paint=new Paint(); //按照一定規則處理圖片 Matrix matrix=new Matrix();//1:1縮放 matrix.setScale(0.5f, 1.0f);//寬和長不同縮放設定 matrix.setTranslate(100f, 50f);//平移操作設定 canvas.drawBitmap(baseBitmap, matrix, paint);參數分別表示參照圖片,處理效果,畫筆 //放到組件上 iv.setImageBitmap(copyBitmap);
在Android中對映像進行處理,那麼一定用到Matrix這個類。Matrix對映像的處理可分為五種基本變換。
1.映像的縮放處理
matrix.setScale(0.5f, 1.0f);
2.映像的位移處理
matrix.setTranslate(100f, 50f);//圖片在畫板中移動,原點是左上方,整數表示往右和下方移動
3.映像的旋轉處理
1.matrix.setRotate(-45);//順時針旋轉多少度,圓點是左上方,若是要逆時針旋轉,角度設定成負數 2.matrix.setRotate(45,baseBitmap.getWidth()/2,baseBitmap.getHeight()/2);//設定以某個圓點順時針(正數表示順時針方向)旋轉,後邊兩個參數分別表示x座標和y座標
4.映像的鏡面處理
matrix.setScale(-1f,1f);//縮放處理,翻轉,往左翻了了個(即把寬翻了個個),翻轉後圖片在畫布的左方,需要再次進行平移操作matrix.postTranslate(baseBitmap.getWidth(),0);//如果要對圖片進行多次操作,那麼要用postxxx方法,不能直接用setxxx方法追加
5.映像的倒影處理
matrix.setScale(1f,-1f);將圖片以y軸進行縮放處理,翻了個個,翻轉後圖片在畫布的上方,需要將其下移操作matrix.postTranslate(0, baseBitmap.getHeight());
Android多媒體映像的處理