01_计算机表示图形的形式
png:以高质量的形式保存图片,并将其应用于计算机或网络;203 KB ,255*340像素,位深度32;
png是计算机图形的工业压缩算法,使用类map的一种数据结构来存储文件。文件体积变小,颜色不会失真。
jpg:以良好的质量的保存图片,并将其应用于计算机、电子邮件、或者网络;36.4 KB , 255*340像素,位深度24;
jpg是计算机图形的工业压缩算法,类似RAR的算法,人眼的识别精度是有限,把人眼无法识别的像素都压缩掉了,使用相邻空间内的颜色来表示被压缩掉的颜色值。文件体积变小了,颜色也失真。
bmp:以高质量的形式保存图片,并将其应用于计算机; 255 KB,255*340像素,位深度24;
计算机使用像素点表示图形的,每个像素点都是使用一个颜色值来表示的,每个颜色值都是使用24bit来表示的;
计算公式:255*340*24 + 文件头信息占用的数据量=实际大小;
02_加载大图片的OOM异常
java.lang.OutOfMemoryError(oom):内存溢出,内存泄露;
VM heap:堆内存;主要是类实例和数组分配内存空间的。
Android应用程序一启动的时候系统就会创建一个dalvik虚拟机,dalvik虚拟机上会分配一个对内存空间,默认是16m。当程序加载一张图片的大小大于堆内存空间时,就抛出内存溢出的异常。
03_缩放图片并加载到内存中
解决办法:缩放显示图片
步骤:
1、得到原图的分辨率:
2、得到设备屏幕的分辨率:
3、通过比较得到一个合适的比例值:
4、根据比例缩放原图;
代码:
package com.itheima.loadpic;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Bundle;
import android.os.Environment;
import android.view.Display;
import android.view.WindowManager;
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);
// 1、得到原图的分辨率:
Options opts = new Options();
//只返回图片的分辨率,不把图片加载到内存中
opts.inJustDecodeBounds= true;
BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/1.jpg", opts);
//得到原图的分辨率
int srcPicHeight = opts.outHeight;
int srcPiWidth = opts.outWidth;
// 2、得到设备屏幕的分辨率:
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
int screenHeight = display.getHeight();
int screenWidth = display.getWidth();
// 3、通过比较得到一个合适的比例值:
//3000* 3000 320*480
//3000/320=9
int sy = srcPicHeight/screenHeight;
int sx = srcPiWidth/screenWidth;
int scale = 1;
if(sy>=sx && sy >= 1){
scale = sy;
}
if(sx>=sy && sx >= 1){
scale = sx;
}
// 4、根据比例缩放原图;
opts.inJustDecodeBounds= false;
opts.inSampleSize= scale;//宽和高都是原图的1/9;
Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/1.jpg", opts);
iv.setImageBitmap(bm);
}
}
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 = new Canvas(copyPic);
// 4、创建一支画笔:
Paint paint = new Paint();
//给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色
paint.setColor(Color.BLACK);
// 5、使用画笔在画板上临摹画画:
//srcPic 参考的原图
//Matrix 处理图形使用的矩阵对象
//paint 使用哪个画笔来画画
canvas.drawBitmap(srcPic, new Matrix(), paint);
05_计算机图形处理的原理
计算机使用像素点表示图形的,每个像素点都是使用一个颜色值来表示的,每个颜色值都是使用24bit来表示的;计算机在底层表示图形的时候都是使用01001的字符串来存储。计算机在处理图形的时候修改的是01001字符串的序列。
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 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);
// 5、使用画笔在画板上临摹画画:
Matrix matrix = new Matrix();
matrix.setRotate(90, 80, 80);
//srcPic 参考的原图
//Matrix 处理图形使用的矩阵对象
//paint 使用哪个画笔来画画
canvas.drawBitmap(srcPic, matrix, paint);
iv.setImageBitmap(copyPic);
}
public void trans(View view){
// 1、创建一张原图:
Bitmap srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.meinv);
// 2、参考原图创建一个空白纸张:
Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth()+100, srcPic.getHeight()+100, srcPic.getConfig());
// 3、参考空白纸张创建一个画板:
Canvas canvas = new Canvas(copyPic);
// 4、创建一支画笔:
Paint paint = new Paint();
//给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色
paint.setColor(Color.BLACK);
// 5、使用画笔在画板上临摹画画:
Matrix matrix = new Matrix();
matrix.setTranslate(100, 100);
//srcPic 参考的原图
//Matrix 处理图形使用的矩阵对象
//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);
// 5、使用画笔在画板上临摹画画:
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
//srcPic 参考的原图
//Matrix 处理图形使用的矩阵对象
//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);
// 5、使用画笔在画板上临摹画画:
Matrix matrix = new Matrix();
matrix.setScale(-1.0f, 1.0f);
//可以让图片平移的效果马上显现出来
matrix.postTranslate(srcPic.getWidth(), 0);
//srcPic 参考的原图
//Matrix 处理图形使用的矩阵对象
//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);
// 5、使用画笔在画板上临摹画画:
Matrix matrix = new Matrix();
matrix.setScale(1.0f, -1.0f);
//可以让图片平移的效果马上显现出来
matrix.postTranslate(0, srcPic.getHeight());
//srcPic 参考的原图
//Matrix 处理图形使用的矩阵对象
//paint 使用哪个画笔来画画
canvas.drawBitmap(srcPic, matrix, paint);
iv.setImageBitmap(copyPic);
}
}
07_撕衣服
代码:
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);
// 1、创建一张原图:
srcPic = BitmapFactory.decodeResource(getResources(),
R.drawable.pre7);
// 2、参考原图创建一个空白纸张:
copyPic = Bitmap.createBitmap(srcPic.getWidth(),
srcPic.getHeight(), srcPic.getConfig());
// 3、参考空白纸张创建一个画板:
canvas = new Canvas(copyPic);
// 4、创建一支画笔:
paint = new Paint();
// 给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色
paint.setColor(Color.BLACK);
// 5、使用画笔在画板上临摹画画:
Matrix matrix = new Matrix();
// srcPic 参考的原图
// Matrix 处理图形使用的矩阵对象
// 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:// 按下的事件类型
int startX = (int)event.getX();
int startY = (int)event.getY();
break;
case MotionEvent.ACTION_MOVE:// 移动的事件类型
//获得当前像素点的坐标
int newX = (int)event.getX();
int newY = (int)event.getY();
for(int i=-10;i<10; i++){
for(int j=-10;j<10;j++){
if(Math.sqrt(i*i+j*j) <=10){
//把当前像素点设置成透明色
copyPic.setPixel(newX+i, newY+j, Color.TRANSPARENT);
}
}
}
iv.setImageBitmap(copyPic);
break;
case MotionEvent.ACTION_UP:// 抬起的事件类型
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;
import android.widget.Toast;
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);
// 1、创建一张原图:
srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
// 2、参考原图创建一个空白纸张:
copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(),
srcPic.getConfig());
// 3、参考空白纸张创建一个画板:
canvas = new Canvas(copyPic);
// 4、创建一支画笔:
paint = new Paint();
// 给画笔设置默认的颜色,画画的时候会根据原图的颜色自动选择相应的颜色
paint.setColor(Color.BLACK);
// 5、使用画笔在画板上临摹画画:
Matrix matrix = new Matrix();
// srcPic 参考的原图
// Matrix 处理图形使用的矩阵对象
// paint 使用哪个画笔来画画
canvas.drawBitmap(srcPic, matrix, paint);
iv.setImageBitmap(copyPic);
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;
}
return true;
}
});
}
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);
}
public void save(View view) {
try {
FileOutputStream fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory()+"/bird.jpg"));
copyPic.compress(CompressFormat.JPEG, 100, fos);
fos.close();
Toast.makeText(this, "保存成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
09_视频播放器videoview(重点)
代码:
//初始化视频播放器
vv = (VideoView) findViewById(R.id.vv);
vv.setVideoPath("http://192.168.16.78:8080/11.mp4");
vv.start();
10_音乐播放器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;
public class MainActivity extends Activity {
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
String url = "http://192.168.16.78:8080/xpg.mp3"; // your URL here
mediaPlayer = new MediaPlayer();
//设置音频流的类型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//设置播放的资源文件
mediaPlayer.setDataSource(url);
//准备多媒体播放器对象
// mediaPlayer.prepare(); //适合加载本地一个资源文件
mediaPlayer.prepareAsync(); //适合加载网络上一个资源文件
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
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 mediaPlayer;
private int currentPosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void play(View view){
try {
String url = "http://192.168.16.78:8080/xpg.mp3"; // your URL here
mediaPlayer = new MediaPlayer();
//设置音频流的类型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//设置播放的资源文件
mediaPlayer.setDataSource(url);
//准备多媒体播放器对象
// mediaPlayer.prepare(); //适合加载本地一个资源文件
mediaPlayer.prepareAsync(); //适合加载网络上一个资源文件
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public void pause(View view){
if(mediaPlayer != null && mediaPlayer.isPlaying()){
currentPosition = mediaPlayer.getCurrentPosition();
mediaPlayer.pause();
}
}
public void resume(View view){
//从指定的位置开始播放
mediaPlayer.seekTo(currentPosition);
mediaPlayer.start();
}
public void restart(View view){
//从指定的位置开始播放
if(mediaPlayer != null){
mediaPlayer.seekTo(0);
mediaPlayer.start();
}else{
play(view);
}
}
public void stop(View view){
if(mediaPlayer != null){
mediaPlayer.stop();
//释放多媒体播放器对象
mediaPlayer.release();
//让垃圾回收期马上回收占用的资源
mediaPlayer = null;
}
}
}
12_影音播放器的生命周期函数
idle(空闲):new MediaPlayer()、reset();
initialized(初始化):setDataSource();
prepared(准备):prepare()、prepareAsync();
start(开始):start();
completed(完成):播放完成;
生命周期函数:
start()
prepare()、prepareAsync()
pause()
seekTo()
stop()
release()
reset()
13_照相机拍照(重点)
参考开发文档:
package com.itheima.cameraimg;
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){
//1、创建一个拍照的意图
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// create a file to save the image
Uri fileUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/123.jpg"));
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Toast.makeText(this, "拍照成功", 0).show();
}
}
14_录像机应用
参考开发文档
代码:
package com.itheima.cameraimg;
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 takeVideo(View view){
//1、创建一个录像的意图
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
// create a file to save the image
Uri fileUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/123.3gp"));
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Toast.makeText(this, "录像完成", 0).show();
}
}