Android基礎-10

Android基礎-10 多媒體編程

圖片、音樂、視頻等; 多媒體:多種綜合;

01_計算機表示圖形的形式

.jpg 36.4 KB 255*340像素,位深度24.
  jpg這種工業圖形的壓縮算法,類似rar,把人言無法識別的顏色值壓縮掉了,會使用相鄰空間內的顏色表示同一種顏色。文件體積變小,失真。
.png 203 KB 255*340像素,位深度32.
  png這種工業圖形的壓縮算法,使用類似map的數據結構來存儲圖形的數據。圖片體積變小,不會失真。
.bmp 255 KB 255*340像素,位深度24.
    計算機在表示圖形的時候使用像素點來表示,每個像素點都是使用一個顏色來表示,每個顏色都是6個十六進制的數值來表示的,每個顏色都是使用24bit來表示;
    255*340*24+文件頭信息佔用的大小;

02_加載大圖片的OOM異常

java.lang.OutOfMemoryError:內存溢出、內存泄露。
ARGB 23.6m
堆內存空間主要是給類實例、數組分配空間。當圖片佔用的空間大於對內存空間時就會拋出內存溢出的異常。

03_縮放圖片並加載到內存中

縮放加載圖片:

1、得到設備屏幕的分辨率:
2、得到原圖的分辨率:
3、通過比較得到一個合適的比例值:
4、使用比例值縮放一張圖片,並加載到內存中:

代碼:

//      1、得到設備屏幕的分辨率:
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    //Display顯示器
        Display display = wm.getDefaultDisplay();
        long screenHeigth = display.getHeight();
        long screenWidth = display.getWidth();

//      2、得到原圖的分辨率:Options選項
        Options opts = new Options();
        //如果置爲true,表示只綁定圖片的大小
        opts.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/1.jpg", opts);
        long scrHeight = opts.outHeight;
        long scrWidth = opts.outWidth;

//      3、通過比較得到一個合適的比例值:
        int scale = 1;

        //3000/320  = 9 3000/480=6
        int sx = (int) (scrWidth/screenWidth);
        int sy = (int) (scrHeight/screenHeigth);
        if(sx>=sy&& sx>=1){
            scale = sx;
        }
        if(sy>sx&& sy>=1){
            scale = sy;
        }
//      4、使用比例值縮放一張圖片,並加載到內存中:
        opts.inJustDecodeBounds = false;
        //按照比例縮放原圖
        opts.inSampleSize = scale;
        Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/1.jpg", opts);

04_在內存中創建原圖的副本(重點)

在Android應用程序裏面不允許直接修改原圖,只能修改副本。

在處理圖形之前需要在內存裏面先創建一個原圖的副本。

臨摹畫畫步驟:

1、得到原圖
2、參考原圖創建一張空白的紙張
3、參考空白紙張創建一個畫板
4、創建一支畫筆
5、使用畫筆在畫板上畫畫

代碼:

//      1、得到原圖
        //加載資源目錄中的一個圖片
        Bitmap srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.meinv);
//      2、參考原圖創建一張空白的紙張
       Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig());
//      3、參考空白紙張創建一個畫板 canvas 帆布;油畫
       Canvas canvas = new Canvas(copyPic);
//      4、創建一支畫筆
       Paint paint = new Paint();
       //給畫筆設置默認的顏色,在畫畫的過程中會使用原圖的顏色來畫畫
       paint.setColor(Color.BLACK);
//      5、使用畫筆在畫板上畫畫
       //參看原圖畫畫
       //srcPic 原圖
       //matrix 表示圖形的矩陣對象
       //paint 畫畫時使用的畫筆
       canvas.drawBitmap(srcPic, new Matrix(), paint);

05_計算機圖形處理的原理

計算機在表示圖形的時候使用像素點來表示,每個像素點都是使用一個顏色來表示,每個顏色都是6個十六進制的數值來表示的,計算機在底層表示圖形時就是使用01001字符串來表示的,處理圖形時就是修改0101的序列。

06_計算機圖形處理的API(重點)

平移、縮放、旋轉,倒影、鏡面

代碼:

package com.itheima.copypic;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private ImageView iv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        iv = (ImageView) findViewById(R.id.iv);

    }

    public void trans(View view) {

        // 1、得到原圖
        // 加載資源目錄中的一個圖片
        Bitmap srcPic = BitmapFactory.decodeResource(getResources(),
                R.drawable.meinv);
        // 2、參考原圖創建一張空白的紙張
        Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth() + 200,
                srcPic.getHeight() + 200, srcPic.getConfig());
        // 3、參考空白紙張創建一個畫板
        Canvas canvas = new Canvas(copyPic);
        // 4、創建一支畫筆
        Paint paint = new Paint();
        // 給畫筆設置默認的顏色,在畫畫的過程中會使用原圖的顏色來畫畫
        paint.setColor(Color.BLACK);

        // 處理圖形
        Matrix matrix = new Matrix();
        // 平移圖片
        matrix.setTranslate(200, 200);
        // 5、使用畫筆在畫板上畫畫
        // 參看原圖畫畫
        // srcPic 原圖
        // matrix 表示圖形的矩陣對象,封裝了處理圖形的api
        // paint 畫畫時使用的畫筆
        canvas.drawBitmap(srcPic, matrix, paint);

        iv.setImageBitmap(copyPic);
    }

    public void scale(View view) {

        // 1、得到原圖
        // 加載資源目錄中的一個圖片
        Bitmap srcPic = BitmapFactory.decodeResource(getResources(),
                R.drawable.meinv);
        // 2、參考原圖創建一張空白的紙張
        Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(),
                srcPic.getHeight(), srcPic.getConfig());
        // 3、參考空白紙張創建一個畫板
        Canvas canvas = new Canvas(copyPic);
        // 4、創建一支畫筆
        Paint paint = new Paint();
        // 給畫筆設置默認的顏色,在畫畫的過程中會使用原圖的顏色來畫畫
        paint.setColor(Color.BLACK);

        // 處理圖形
        Matrix matrix = new Matrix();
        // 縮放圖片
        // matrix.setScale(0.5f, 0.5f);
        matrix.setScale(0.5f, 0.5f, srcPic.getWidth() / 2,
                srcPic.getHeight() / 2);
        // 5、使用畫筆在畫板上畫畫
        // 參看原圖畫畫
        // srcPic 原圖
        // matrix 表示圖形的矩陣對象,封裝了處理圖形的api
        // paint 畫畫時使用的畫筆
        canvas.drawBitmap(srcPic, matrix, paint);

        iv.setImageBitmap(copyPic);
    }

    public void rotate(View view) {

        // 1、得到原圖
        // 加載資源目錄中的一個圖片
        Bitmap srcPic = BitmapFactory.decodeResource(getResources(),
                R.drawable.meinv);
        // 2、參考原圖創建一張空白的紙張
        Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(),
                srcPic.getHeight(), srcPic.getConfig());
        // 3、參考空白紙張創建一個畫板
        Canvas canvas = new Canvas(copyPic);
        // 4、創建一支畫筆
        Paint paint = new Paint();
        // 給畫筆設置默認的顏色,在畫畫的過程中會使用原圖的顏色來畫畫
        paint.setColor(Color.BLACK);

        // 處理圖形
        Matrix matrix = new Matrix();
        // 旋轉圖片
        matrix.setRotate(90);

        //可以讓平移後的效果立即顯現出來
        matrix.postTranslate(srcPic.getHeight(), 0);
        // 5、使用畫筆在畫板上畫畫
        // 參看原圖畫畫
        // srcPic 原圖
        // matrix 表示圖形的矩陣對象,封裝了處理圖形的api
        // paint 畫畫時使用的畫筆
        canvas.drawBitmap(srcPic, matrix, paint);

        iv.setImageBitmap(copyPic);
    }


    public void jm(View view) {

        // 1、得到原圖
        // 加載資源目錄中的一個圖片
        Bitmap srcPic = BitmapFactory.decodeResource(getResources(),
                R.drawable.meinv);
        // 2、參考原圖創建一張空白的紙張
        Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(),
                srcPic.getHeight(), srcPic.getConfig());
        // 3、參考空白紙張創建一個畫板
        Canvas canvas = new Canvas(copyPic);
        // 4、創建一支畫筆
        Paint paint = new Paint();
        // 給畫筆設置默認的顏色,在畫畫的過程中會使用原圖的顏色來畫畫
        paint.setColor(Color.BLACK);

        // 處理圖形
        Matrix matrix = new Matrix();
        // 縮放圖片
        // 把x方向的數據編程負值
        matrix.setScale(-1.0f,1.0f);

        matrix.postTranslate(srcPic.getWidth(), 0);
        // 5、使用畫筆在畫板上畫畫
        // 參看原圖畫畫
        // srcPic 原圖
        // matrix 表示圖形的矩陣對象,封裝了處理圖形的api
        // paint 畫畫時使用的畫筆
        canvas.drawBitmap(srcPic, matrix, paint);

        iv.setImageBitmap(copyPic);
    }


    public void dy(View view) {

        // 1、得到原圖
        // 加載資源目錄中的一個圖片
        Bitmap srcPic = BitmapFactory.decodeResource(getResources(),
                R.drawable.meinv);
        // 2、參考原圖創建一張空白的紙張
        Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(),
                srcPic.getHeight(), srcPic.getConfig());
        // 3、參考空白紙張創建一個畫板
        Canvas canvas = new Canvas(copyPic);
        // 4、創建一支畫筆
        Paint paint = new Paint();
        // 給畫筆設置默認的顏色,在畫畫的過程中會使用原圖的顏色來畫畫
        paint.setColor(Color.BLACK);

        // 處理圖形
        Matrix matrix = new Matrix();
        // 縮放圖片
        // 把x方向的數據編程負值
        matrix.setScale(1.0f,-1.0f);

        matrix.postTranslate(0, srcPic.getHeight());
        // 5、使用畫筆在畫板上畫畫
        // 參看原圖畫畫
        // srcPic 原圖
        // matrix 表示圖形的矩陣對象,封裝了處理圖形的api
        // paint 畫畫時使用的畫筆
        canvas.drawBitmap(srcPic, matrix, paint);

        iv.setImageBitmap(copyPic);
    }
}

07_撕衣服

實現的原理:

使用兩個imageview顯示兩張圖片了,這兩個imageview是重疊顯示的,顯示在上面的imageview顯示的是穿衣服的圖片,顯示在下面的imageview顯示的沒穿衣服的圖片。
當手在上面的圖片上移動的過程中,在移動的過程中會把手所到之處的像素點改成透明色。

代碼:

package com.itheima.syf;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private ImageView iv;
    private Bitmap srcPic;
    private Bitmap copyPic;
    private Canvas canvas;
    private Paint paint;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        iv = (ImageView) findViewById(R.id.iv);

        srcPic = BitmapFactory.decodeResource(getResources(),
                R.drawable.pre7);
        copyPic = Bitmap.createBitmap(srcPic.getWidth(),
                srcPic.getHeight(), srcPic.getConfig());
        canvas = new Canvas(copyPic);
        paint = new Paint();
        // 給畫筆設置默認的顏色,在畫畫的過程中會使用原圖的顏色來畫畫
        paint.setColor(Color.BLACK);

        // 處理圖形
        Matrix matrix = new Matrix();
        // 5、使用畫筆在畫板上畫畫
        // 參看原圖畫畫
        // srcPic 原圖
        // matrix 表示圖形的矩陣對象,封裝了處理圖形的api
        // paint 畫畫時使用的畫筆
        canvas.drawBitmap(srcPic, matrix, paint);

        iv.setImageBitmap(copyPic);

        iv.setOnTouchListener(new OnTouchListener() {

            /**
             * 當觸摸到這控件時會調用這個方法
             */
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                int action = event.getAction();
                switch (action) {
                case MotionEvent.ACTION_DOWN: // 按下的事件類型

                    break;
                case MotionEvent.ACTION_MOVE: // 移動的事件類型

                    int newX = (int) event.getX();
                    int newY = (int) event.getY();
                    System.out.println("x="+newX+"; y="+newY);

                    for(int i=-10;i<10; i++){
                        for(int j=-10;j<10;j++){
                            if(Math.sqrt(i*i+j*j) <= 10){
                                //把當前像素點改成透明色  像素 Pixe  transparent  透明的;清澈的;易識破的;顯而易見的
                                copyPic.setPixel(newX + i, newY + j, Color.TRANSPARENT);
                                iv.setImageBitmap(copyPic);
                            }
                        }

                    }


                    break;

                case MotionEvent.ACTION_UP: // 離開的事件類型

                    break;

                default:
                    break;
                }

                //如果返回true表示當前時間已經消費掉了
                return true;
            }
        });

    }

}

08_畫畫板

代碼:

package com.itheima.painter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private ImageView iv;

    private Bitmap srcPic;
    private Bitmap copyPic;
    private Canvas canvas;
    private Paint paint;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        iv = (ImageView) findViewById(R.id.iv);

        srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
        copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(),
                srcPic.getConfig());
        canvas = new Canvas(copyPic);
        paint = new Paint();
        // 給畫筆設置默認的顏色,在畫畫的過程中會使用原圖的顏色來畫畫
        paint.setColor(Color.BLACK);

        // 處理圖形
        Matrix matrix = new Matrix();
        // 5、使用畫筆在畫板上畫畫
        // 參看原圖畫畫
        // srcPic 原圖
        // matrix 表示圖形的矩陣對象,封裝了處理圖形的api
        // paint 畫畫時使用的畫筆
        canvas.drawBitmap(srcPic, matrix, paint);

        iv.setImageBitmap(copyPic);

        // canvas.drawLine(0, 0, 200, 200, paint);

        iv.setOnTouchListener(new OnTouchListener() {

            private int startX;
            private int startY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                switch (action) {
                case MotionEvent.ACTION_DOWN:// 按下的事件類型

                    startX = (int) event.getX();
                    startY = (int) event.getY();
                    break;

                case MotionEvent.ACTION_MOVE:// 移動的事件類型

                    // 得到結束位置的座標點
                    int endX = (int) event.getX();
                    int endY = (int) event.getY();
                    // 從開始座標點畫到結束座標點
                    canvas.drawLine(startX, startY, endX, endY, paint);

                    iv.setImageBitmap(copyPic);
                    //得到新的開始座標點
                    startX = (int) event.getX();
                    startY = (int) event.getY();
                    break;

                case MotionEvent.ACTION_UP:// 移動的事件類型

                    break;

                }

                return true;
            }
        });

    }

    public void save(View view){

        try {
            FileOutputStream fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory()+"/paiter.jpg"));
            boolean flag = copyPic.compress(CompressFormat.JPEG, 100, fos);
            if(flag){
                System.out.println("保存成功.................");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void red(View view){
        paint.setColor(Color.RED);
    }
    public void green(View view){
        paint.setColor(Color.GREEN);
    }

    public void blue(View view){
        paint.setColor(Color.BLUE);
    }

    public void brush(View view){
        //改變刷子的寬度
        paint.setStrokeWidth(10);
    }



}

09_視頻播放器videoview(重點)

代碼:

//得到視頻播放器

Video   磁帶錄像;錄像磁帶
vv = (VideoView) findViewById(R.id.vv);
//指定播放的視頻資源
vv.setVideoPath("http://192.168.1.254:8080/11.mp4");
//開始播放
vv.start();

10_音樂播放器API

代碼:

    //media 媒體  
    player = new MediaPlayer();
    //設置     audio 聲音信號
    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    //設置資源路徑
    player.setDataSource("http://192.168.1.254:8080/xpg.mp3");

    //使用同步的方式準備一個多媒體播放器,適合播放本地的資源文件
    //player.prepare();
    //使用異步的方式準備一個多媒體播放器,適合播放網絡上的資源文件
    player.prepareAsync();

    player.setOnPreparedListener(new OnPreparedListener() {

        /*
         *多媒體對象準備完成時調用這個方法
         */
        @Override
        public void onPrepared(MediaPlayer mp) {
            player.start();
        }
    });

11_影音播放器的常用API

代碼:

package com.itheima.mediaplayer;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

    private MediaPlayer player;
    private int currentPosition;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void play(View view){
        try {
            player = new MediaPlayer();

            player.setAudioStreamType(AudioManager.STREAM_MUSIC);

            player.setDataSource("http://192.168.1.254:8080/xpg.mp3");

            //使用同步的方式準備一個多媒體播放器,適合播放本地的資源文件
//          player.prepare();
            //使用異步的方式準備一個多媒體播放器,適合播放網絡上的資源文件
            player.prepareAsync();

            player.setOnPreparedListener(new OnPreparedListener() {

                /*
                 *多媒體對象準備完成時調用這個方法
                 */
                @Override
                public void onPrepared(MediaPlayer mp) {
                    player.start();
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void pause(View view){
        if(player != null && player.isPlaying()){
            //暫停
            player.pause();
            currentPosition = player.getCurrentPosition();
        }
    }

    public void resume(View view){
        if(player != null){
            //從指定的位置開始播放
            player.seekTo(currentPosition);
            player.start();
        }
    }

    public void restart(View view){
        if(player != null){
            //從指定的位置開始播放
            player.seekTo(0);
            player.start();
        }else{
            play(view);
        }
    }

    public void stop(View view){
        if(player != null){
            //從指定的位置開始播放
            player.stop();
            player.release();
            player = null;
        }
    }
}

12_影音播放器的生命週期函數

狀態:

1、空閒:調用reset方法、new MediaPlayer();
2、初始化:調用setDataSource();
3、準備:prepare()、prepareAsync();
4、開始:start();
5、完成:播放完成;

生命週期的方法:

start():開始播放;
pause:暫停;
resume:繼續播放;
seekTo():從指定的位置開始播放;
stop:停止;
reset:重置;
release():釋放多媒體對象;

13_照相機拍照(重點)

代碼:

package com.itheima.camera;

import java.io.File;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void takePhoto(View view){

        //創建拍照的意圖對象 image . 影像;肖像;概念,意向;鏡像,映像
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //指定照片的存儲位置
        Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/123456.jpg"));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        //開啓手機自帶的拍照功能
        startActivityForResult(intent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Toast.makeText(this, "拍照成功", 0).show();
    }

}

14_錄像機應用

代碼:

public void takeVideo(View view){

    //創建拍照的意圖對象
    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    //指定照片的存儲位置
    Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/123456.3gp"));
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    //開啓手機自帶的拍照功能
    startActivityForResult(intent, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Toast.makeText(this, "錄像完成", 0).show();
}
資料下載
發佈了81 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章