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();
}
时间: 2024-10-11 07:32:17