%title multi-meida
%toc
图片, 音频, 视频, 摄像头
= 图片 =
== 加载大图片到内存 ==
我们创建虚拟机时, 默认给每个应用分配的内存大小是16Mb, (VM Heap 16Mb).
如果我们加载大图片时, 很可能导致内存溢出.
但是我们会发现, 即使加载的图片只有2-3Mb, 也会溢出, 这是为什么?
位图图像加载到内存中时, 是采用数组来存放数据的. 一个图片其本身可能不是很大,
但是在内存中想要表示这张图片, 需要一个二维数组, 数组大小为图片宽X高(像素数),
这还没完, 一个数组元素大小要包含RGBA四个分量, 即4byte, 这样一乘, 就很大了.
如果我们想要加载大图片, 就要进行缩放, 需要下面几步:
# 获取屏幕的宽高
# 获取图片的宽高
# 获取水平缩放比例和垂直缩放比例
# 使用二者中较大的值对图片进行缩放
代码如下:
{{{class="brush:java"
public class MainActivity extends Activity {
private ImageView iv;
private int windowWidth ;
private int windowHeight ;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
//1. 获取手机屏幕的分辨率 宽高
Display  display =   getWindowManager().getDefaultDisplay();
// 下面的方法虽然过时了, 但是还是很经常用
windowWidth = display.getWidth();
windowHeight = display.getHeight();
// Point p = new Point();
// display.getSize(p);
// p.x; p.y;
System.out.println("窗体的宽度:"+windowWidth);
System.out.println("窗体的高度:"+windowHeight);
}
public void click(View view){
// 创建解析器选项
Options opts =  new Options();
// 设置解析器 不去真正的解析这个位图  而是解析这个图片的out输出信息,(宽度 高度)
// 不会为图片的每个点 申请内存空间
opts.inJustDecodeBounds = true;   
BitmapFactory.decodeFile("/sdcard/IMG_0017.JPG", opts);
// 得到图像的宽高
int picHeight = opts.outHeight;
int picWidth = opts.outWidth;
int scaleX = picWidth / windowWidth;
int scaleY = picHeight / windowHeight;
int scale = 1;
if(scaleX>scaleY &&  scaleY >1){
//按照水平缩放
scale = scaleX;
}
if(scaleY>scaleX &&  scaleX >1){
//按照竖直平缩放
scale = scaleY;
}
// 真正的解析这个位图
opts.inJustDecodeBounds = false;
// 设置缩放比例
opts.inSampleSize = scale;
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/IMG_0017.JPG",opts);
iv.setImageBitmap(bitmap);
}
}
}}}
== 图像的exif信息 ==
ExifInterface exif = new ExifInterface("/sdcard/IMG_0017.JPG");
System.out.println(exif.getAttribute(ExifInterface.TAG_DATETIME));
== 从图库选择图片 ==
这个比较简单, 我们只需要开启系统图库应用的activity, 让其返回数据即可.
{{{class="brush:java"
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 click(View view){
Intent intent = new Intent();
intent.setAction("android.intent.action.PICK");
intent.addCategory("android.intent.category.DEFAULT");
intent.setType("image/*");
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(data!=null){
Uri uri = data.getData();
try {
// 所有uri相关的操作都可以交给 ContentResolver
InputStream is = getContentResolver().openInputStream(uri);
Options opts = new Options();
opts.inSampleSize = 8;
Bitmap bitmap = BitmapFactory.decodeStream(is, new Rect(), opts);
iv.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
}}}
== 创建图像的内存拷贝 ==
在应用中, 我们经常会需要对一个图片进行处理, 如旋转, 缩放, 平移等等,
我们不能拿着一个图片的原图进行处理, 而是要创建一个原图的拷贝, 对这个拷贝的图像
进行处理. 下面的代码演示了如何创建图像的内存拷贝
{{{class="brush:java"
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (data != null) {
Uri uri = data.getData();
iv_src.setImageURI(uri);
try {
InputStream is = getContentResolver().openInputStream(uri);
//创建一个原图的拷贝, 把拷贝的图片 放在iv_dest
//原图对应的bitmap  注意:这个图片是只读的 不可以被修改.
Bitmap bitmap = BitmapFactory.decodeStream(is);
//创建一个可以被修改的位图资源,宽高信息 和 图片的类型 跟原图是一模一样
//下面的代码创建的图片 是一个空白的图片
                Bitmap  alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
// 拿着可以被修改的图片创建一个画布, 之后画的东西就要画在这块画布上了.
                Canvas canvas = new Canvas(alterBitmap);
// 创建一个画笔, 可以拿着它画东西
Paint paint = new Paint();
//创建图形的拷贝, 其实就是把原图按照 Matrix 定义的信息滑到之前的画布上.
                canvas.drawBitmap(bitmap, new Matrix(), paint);
// 再往上面写点字
paint.setColor(Color.BLACK);
canvas.drawText("美女", 10, 10, paint);
iv_dest.setImageBitmap(alterBitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
}}}
== 图像的简单处理 ==
有了图像的内存拷贝, 我们就可以方便的对图像进行处理了.
1. 缩放
{{{class="brush:java"
// 创建一个bitmap, 作为可以修改的图像, 为什么这里要搞成这个大小?
// 这将是我们创建的画布的大小, 无论图像怎么缩放, 画布就是这么大
Bitmap  alterBitmap = Bitmap.createBitmap(bitmap.getWidth()/2,
(int)(bitmap.getHeight()*1.2), bitmap.getConfig());
//拿着可以被修改的图片创建一个画布.
Canvas canvas = new Canvas(alterBitmap);
Paint paint = new Paint();
// Matrix 是一个坐标矩阵, 可以用来指定图像每个点的坐标计算方式
// matrix有一个计算公式, 参看图形学ppt
Matrix matrix = new Matrix();
// 这些参数是 X, Y , Z 轴
/*matrix.setValues(new float[] {
0.5f, 0, 0,
0, 1.2f, 0,
0, 0, 1
});*/
// 简单的方法设置缩放量, x轴, y轴
matrix.setScale(0.5f, 1.2f);
// 把原图按照设定好的 matrix 画到画布上
canvas.drawBitmap(bitmap, matrix, paint);
}}}
2. 旋转
{{{class="brush:java"
// 为什么宽度要加60? 旋转后图片可能超出原来的范围了, 所以要加宽一点.
Bitmap  alterBitmap = Bitmap.createBitmap(bitmap.getWidth()+60, bitmap.getHeight(), bitmap.getConfig());
Canvas canvas = new Canvas(alterBitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
Matrix matrix = new Matrix();
// 第一个参数指定旋转角度, 后面两个参数指定旋转中心
matrix.setRotate(30, bitmap.getWidth()/2, bitmap.getHeight()/2);
canvas.drawBitmap(bitmap, matrix, paint);
}}}
3. 平移
{{{class="brush:java"
Bitmap  alterBitmap = Bitmap.createBitmap(bitmap.getWidth()+60, bitmap.getHeight(), bitmap.getConfig());   
Canvas canvas = new Canvas(alterBitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
Matrix matrix = new Matrix();
// 设置偏移量, 第一个为x轴, 第二个为y轴
matrix.postTranslate(20, 0);
canvas.drawBitmap(bitmap, matrix, paint);
}}}
4. 镜面
{{{class="brush:java"
Bitmap  alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
Canvas canvas = new Canvas(alterBitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
Matrix matrix = new Matrix();
// 如果想让x轴变为负的, 第一个参数给-1, 算是缩放的另一种形式吧
matrix.setScale(-1, 1);
// x轴变成负的后, 还要在平移回来, 要不就看不见了.
matrix.postTranslate(bitmap.getWidth(),0);
canvas.drawBitmap(bitmap, matrix, paint);
}}}
5. 倒影
{{{class="brush:java"
Bitmap  alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
Canvas canvas = new Canvas(alterBitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
Matrix matrix = new Matrix();
// y轴变成负的即可
matrix.setScale(1, -1);
matrix.postTranslate(0,bitmap.getHeight());
canvas.drawBitmap(bitmap, matrix, paint);
}}}
谷歌: www.google.ie or www.google.fr
搜索: 图像处理 filetype:ppt
== 扒掉美女的衣服 ==
== 处理图片的颜色 ==
图像的位移, 旋转等需要的是 坐标矩阵, 修改图像的颜色则需要修改图片的颜色矩阵.
{{{class="brush:java"
alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
canvas = new Canvas(alterBitmap);
paint = new Paint();
paint.setAntiAlias(true);
Matrix matrix = new Matrix();
// 创建一个颜色矩阵, 这些参数为 R, G, B, A
ColorMatrix cm = new ColorMatrix();
// 把红色调成两倍
cm.set(new float[] {
2, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, 1, 0, 0,
0, 0, 0, 1, 0
});
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bitmap, matrix, paint);
}}}
== 图片合成/人脸识别 ==
face++
-------------------------------
SeekBar 是 ProgressBar 的子类
-------------
自己写个音乐播放器
多线程断线下载, 重写一遍
-------------
来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/ywq-come/p/5925287.html

7.多媒体☞图像图形拍照相关推荐

  1. 会议整理 | 2023年度国内外图像图形学术会议

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨董亚微 来源丨 一点人工一点智能 点击进入->3D视觉工坊学习交流群 会议名称:3CVIP ...

  2. 第三期CSIG图像图形学科前沿讲习班-详细日程

    主题:虚拟现实与增强现实 虚拟现实(VR)技术使得用户借助特殊的输入/输出设备,与虚拟世界进行自然的交互,提供用户关于视觉.听觉.触觉等感官的模拟.增强现实即在真实信息基础上叠加虚拟信息, 提升用户对 ...

  3. 数字媒体概论——2D图像图形

    一:色彩基础 1.1:色彩认知 色彩是能引起我们共同的审美愉悦的.最为敏感的形式要素.色彩是最有表现力的要素之一,因为它的性质直接影响人们的感情. 丰富多样的颜色可以分成两个大类:无彩色系和有彩色系. ...

  4. CSIG图像图形技术挑战赛重磅来袭!人体目标检测分赛道正式开放注册!

    点击蓝字 关注我们 "2021CSIG图像图形挑战赛-人体目标检测分赛道"是由中国图像图形学学会(CSIG)发起,由奥比中光3D视觉开发者社区与极市平台联合主办,于今日起正式全网开 ...

  5. 中国图像图形学报参考文献格式书写规范2020

    根据实际情况,大部分引用的文献都可以在***期刊和会议***找到,故参考文献使用这两种最安全. 官方给出的参考文献示范:中国图像图形学报参考文献格式 第一步:判断一篇文章属于什么类型 使用crossr ...

  6. IGTA 2018-第十三届图像图形技术与应用学术会议

    为促进图象图形科学技术的繁荣和发展,为加速实现我国社会主义现代化,北京图象图形学学会主办的第十三届图像图形技术与应用学术会议(IGTA 2018)将于2018年4月8日-4月10日在北京航空航天大学召 ...

  7. 计算机网络多媒体图像矢量图,13多媒体信息处理——图像处理(一)

    信息技术基础 教案(十三) 教学主题 适用年级 教 材 分 析 学 习 目 标 多媒体信息处理--图像处理(一) 高一年级 教学课时 1 课时 图像处理是多媒体素材采集和应用中的一个重要组成部分,要想 ...

  8. 多媒体应用: 图形、音频、视频

    多媒体应用是Android 中比较有趣的部分,本博客内容很长 一 图形 1 基本图形 绘制图形通常在android.view.View 或子类的onDraw 方法中进行.方法定义如下: protect ...

  9. 2020-2021学年——图像图形编程实践实验1_图像二值化

    图像二值化 实验目的 1.熟练掌握在MATLAB中如何读取图像. 2.掌握如何利用MATLAB来获取图像的大小.颜色.高度.宽度等等相关信息. 3.掌握如何在MATLAB中按照指定要求存储一幅图像的方 ...

最新文章

  1. pytorch实现BiLSTM+CRF用于NER(命名实体识别)
  2. python3项目-python3搭建Django项目
  3. 计算机考试一级考试基础知识,2016计算机一级考试msoffice基础知识
  4. JAVA WEB之Spring4.x JdbcTemplate
  5. 敏捷结果30天之第十二天:效率角色-你是启动者还是完成者
  6. 如何将对象拼接成get传值的形式
  7. 安卓怎么调用系统的ui_安卓逆向 | 为了反射调用我们怎么能拿到被HOOK函数的实例...
  8. bypass最新版d盾mysql_Bypass D盾_IIS防火墙SQL注入防御(多姿势) | CN-SEC 中文网
  9. Vue自定义组件封装及使用Excel
  10. FJUT Home_W的gcd(乱搞)题解
  11. es6 语法 (类与对象)
  12. 用python把unix格式转换成windows格式
  13. stm32串口传输数据第一个数据被吞_STM32串口发送第一个字符丢失解决之道
  14. 【java与智能设备】CH11 Android中常见数据格式解析
  15. 录屏软件推荐:bilibili哔哩哔哩直播姬录屏软件下载使用指南
  16. vs格式化代码快捷键_VisualStudio高效率快捷键设置建议
  17. 黑少微服务商店实战经验分享:从单体式架构迁移到微服务架构
  18. OpenCV制作一个类“全能扫描王”的简易扫描软件
  19. 添加远程连接 Linux数据库与Navicat数据库建立连接
  20. ​百度网盘批量转存分享增量更新软件工具助手

热门文章

  1. Tensorflow学习
  2. 【问链财经-区块链基础知识系列】 第二十一课 区块链应用于大宗商品供应链金融
  3. JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串
  4. java堆栈句柄,深入了解JVM—内存区域
  5. Matlab的Floor, Ceil, Fix, Round
  6. 思想开放-学数学之人必备的特质(转载)
  7. CCF OJ 1113-括号匹配[栈]
  8. codeblock 带mingw的版本_云顶之弈10.22新版本最强阵容排名 10.22版本吃鸡阵容推荐...
  9. java 远程udp_远程客户端不接收UDP数据包
  10. 多元函数概念思维导图_高等数学 多元函数微分学 知识技巧思维导图 [21考研上岸之旅]...