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();
}
資料下載