当前位置:  编程技术>移动开发
本页文章导读:
    ▪【6.9】Broadcast的1点理解        【6.9】Broadcast的一点理解 Broadcast发出广播   首先定义Intent,然后sendBroadcast(intent);   由BroadcastReceiver接收,继承自BroadcastReceiver类   注意:   广播生命周期很短,而且是自动结束,不可以做.........
    ▪ 关于ByteArrayOutputStream(字节数组输出流)的一个例证,与ByteArrayInputStream作一比较        关于ByteArrayOutputStream(字节数组输出流)的一个例子,与ByteArrayInputStream作一比较 import java.io.*;public class test {/*** ByteArrayOutputStream是一个把字节数组当作输出流的实现。我认为是所流当作数.........
    ▪ RGB,YUV的来势及其相互转换       RGB,YUV的来历及其相互转换 转自:http://blog.sina.com.cn/s/blog_3f7c4db40100su2b.html在视频等相关的应用中,YUV是一个经常出现的格式。本文主要以图解的资料的形式详细描述YUV和RGB格式的来由,.........

[1]【6.9】Broadcast的1点理解
    来源: 互联网  发布时间: 2014-02-18
【6.9】Broadcast的一点理解

Broadcast发出广播

 

首先定义Intent,然后sendBroadcast(intent);

 

由BroadcastReceiver接收,继承自BroadcastReceiver类

 

注意:

 

广播生命周期很短,而且是自动结束,不可以做太过复杂的事情,复杂是事情应该由activity和service来做

 

BroadcastReceiver要在manifest.xml中注册<receiver>,android:name为包名+类名,切记


    
[2] 关于ByteArrayOutputStream(字节数组输出流)的一个例证,与ByteArrayInputStream作一比较
    来源: 互联网  发布时间: 2014-02-18
关于ByteArrayOutputStream(字节数组输出流)的一个例子,与ByteArrayInputStream作一比较
import java.io.*;

public class test {

/**

* ByteArrayOutputStream是一个把字节数组当作输出流的实现。我认为是所流当作数组来实现.它和ByteArrayInputStream不太一样。不能类比学习.

*

* java.lang.Object

继承者 java.io.OutputStream

继承者 java.io.ByteArrayOutputStream

所有已实现的接口:

Closeable, Flushable

public class ByteArrayOutputStream

extends OutputStream

此类实现了一个输出流,其中的数据被写入一个字节数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 检索数据。

关闭 ByteArrayOutputStream 无效。在关闭此流后且没有生成 IOException 时,可以调用此类中的该方法。

*

* 构造方法摘要

ByteArrayOutputStream()

    创建一个新的字节数组输出流。

ByteArrayOutputStream(int size)

    创建一个新的字节数组输出流,它具有指定大小的缓冲区容量(以字节为单位)。

* 字段摘要

protected  byte[]     buf

    存储数据的缓冲区。

protected  int     count

    缓冲区中的有效字节数。

*/

public static void main(String[] args) throws Exception {

// TODO Auto-generated method stub

ByteArrayOutputStream f = new ByteArrayOutputStream();

//String s = "This should end up in the array 汉字";

StringBuffer s = new StringBuffer("This should end up in the array 汉字");

s.append(" 我是append进来的 ");

byte buf[] = s.toString().getBytes();

f.write(buf);

/**

* write

public void write(byte[] b,

         int off,

         int len)

将指定字节数组中从偏移量 off 开始的 len 个字节写入此字节数组输出流。

*/

System.out.println("Buffer as a string");

System.out.println(f.toString());

/**

toString

public String toString()

将缓冲区的内容转换为字符串,根据平台的默认字符编码将字节转换成字符。

*/

System.out.println("Into array");

byte b[] = f.toByteArray();

/**

* toByteArray

public byte[] toByteArray()

创建一个新分配的字节数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。

*/

for (int i = 0; i < b.length; i++) {

System.out.print((char) b[i]);

}

System.out.println(" To an OutputStream()");

OutputStream f2 = new FileOutputStream("fiel");

f.writeTo(f2);

/**

* writeTo

public void writeTo(OutputStream out)

    throws IOException

将此字节数组输出流的全部内容写入到指定的输出流参数中,这与使用 out.write(buf, 0, count) 调用该输出流的 write 方法效果一样。

*/

f2.close();

System.out.println("Doing a reset");

f.reset();

/**

* reset

public void reset()

将此字节数组输出流的 count 字段重置为零,从而丢弃输出流中目前已累积的所有输出。通过重新使用已分配的缓冲区空间,可以再次使用该输出流。

*/

for (int i = 0; i < 10; i++) {

f.write('X');

}

System.out.println(f.toString());

}

}



import java.io.*;

public class test2 {

/**

* @param args

*/

public static void main(String[] args) throws IOException {

// TODO Auto-generated method stub

String tmp = "hello";

byte b[] = tmp.getBytes();

ByteArrayInputStream in = new ByteArrayInputStream(b);

for (int i = 0; i < 2; i++) {

int c;

while ((c = in.read()) != -1) {

if (i == 0) {

System.out.print((char) c);

} else {

System.out.print(Character.toUpperCase((char) c));

}

}

in.reset();//reset()方法两次读取同样的输入的方法:先从流中读取每个字符,并以小写字母形式打印,然后重轩设置流并比头读起,并在打印之前先将小写转换成大写字母。

}

}

}

文章转载自:http://blog.csdn.net/qq7187057/archive/2007/07/20/1700309.aspx



    
[3] RGB,YUV的来势及其相互转换
    来源: 互联网  发布时间: 2014-02-18
RGB,YUV的来历及其相互转换
转自:http://blog.sina.com.cn/s/blog_3f7c4db40100su2b.html

在视频等相关的应用中,YUV是一个经常出现的格式。本文主要以图解的资料的形式详细描述YUV和RGB格式的来由,相互关系以及转换方式,并对C语言实现的YUV转为RGB程序进行介绍。
    人类眼睛的色觉,具有特殊的特性,早在上世纪初,Young(1809)和Helmholtz(1824)就提出了视觉的三原色学说,即:视网膜存在三种视锥细胞,分别含有对红、绿、蓝三种光线敏感的视色素,当一定波长的光线作用于视网膜时,以一定的比例使三种视锥细胞分别产生不同程度的兴奋,这样的信息传至中枢,就产生某一种颜色的感觉。
    70年代以来,由于实验技术的进步,关于视网膜中有三种对不同波长光线特别敏感的视锥细胞的假说,已经被许多出色的实验所证实。 例如:①有人用不超过单个视锥直径的细小单色光束,逐个检查并绘制在体(最初实验是在金鱼和蝾螈等动物进行,以后是人)视锥细胞的光谱吸收曲线,发现所有绘制出来的曲线不外三种类型,分别代表了三类光谱吸收特性不同的视锥细胞,一类的吸收峰值在420nm处,一类在534nm处,一类在564nm处,差不多正好相当于蓝、绿、红三色光的波长。与上述视觉三原色学说的假设相符。②用微电极记录单个视锥细胞感受器电位的方法,也得到了类似的结果,即不同单色光所引起的不同视锥细胞的超极化型感受器电位的大小也不同,峰值出现的情况符合于三原色学说。

    于是,在彩色显示器还没有发明的时候,人类已经懂得使用三原色光调配出所有颜色的光。并不是说三原色混合后产生了新的频率的光,而是给人眼睛的感觉是这样。

    在显示器发明之后,从黑白显示器发展到彩色显示器,人们开始使用发出不同颜色的光的荧光粉(CRT,等离子体显示器),或者不同颜色的滤色片(LCD),或者不同颜色的半导体发光器件(OLED和LED大型全彩显示牌)来形成色彩,无一例外的选择了Red,Green,Blue这3种颜色的发光体作为基本的发光单元。通过控制他们发光强度,组合出了人眼睛能够感受到的大多数的自然色彩。
    计算机显示彩色图像的时候也不例外,最终显示的时候,要控制一个像素中Red,Green,Blue的值,来确定这个像素的颜色。计算机中无法模拟连续的存储从最暗到最亮的量值,而只能以数字的方式表示。于是,结合人眼睛的敏感程度,使用3个字节(3*8位)来分别表示一个像素里面的Red,Green和Blue的发光强度数值,这就是常见的RGB格式。我们可以打开画图板,在自定义颜色工具框中,输入r,g,b值,得到不同的颜色。


    但是对于视频捕获和编解码等应用来讲,这样的表示方式数据量太大了。需要想办法在不太影响感觉的情况下,对原始数据的表示方法进行更改,减少数据量。
    无论中间处理过程怎样,最终都是为了展示给人观看,这样的更改,也是从人眼睛的特性出发,和发明RGB三原色表示方法的出发点是一样的。
    于是我们使用Y,Cb,Cr模型来表示颜色。Iain的书中写道:The human visual system (HVS) is less sensitive to colour than to luminance (brightness).人类视觉系统(其实就是人的眼睛)对亮度的感觉比对颜色更加敏感。
    在RGB色彩空间中,三个颜色的重要程度相同,所以需要使用相同的分辨率进行存储,最多使用RGB565这样的形式减少量化的精度,但是3个颜色需要按照相同的分辨率进行存储,数据量还是很大的。所以,利用人眼睛对亮度比对颜色更加敏感,将图像的亮度信息和颜色信息分离,并使用不同的分辨率进行存储,这样可以在对主观感觉影响很小的前提下,更加有效的存储图像数据。
    YCbCr色彩空间和它的变形(有时被称为YUV)是最常用的有效的表示彩色图像的方法。Y是图像的亮度(luminance/luma)分量,使用以下公式计算,为R,G,B分量的加权平均值:
         Y = kr R + kgG + kbB
        其中k是权重因数。
    上面的公式计算出了亮度信息,还有颜色信息,使用色差(color difference/chrominance或chroma)来表示,其中每个色差分量为R,G,B值和亮度Y的差值:
  Cb = B - Y
  Cr = R - Y
    Cg = G - Y
其中,Cb+Cr+Cg是一个常数(其实是一个关于Y的表达式),所以,只需要其中两个数值结合Y值就能够计算出原来的RGB值。所以,我们仅保存亮度和蓝色、红色的色差值,这就是(Y,Cb,Cr)。
相比RGB色彩空间,YCbCr色彩空间有一个显著的优点。Y的存储可以采用和原来画面一样的分辨率,但是Cb,Cr的存储可以使用更低的分辨率。这样可以占用更少的数据量,并且在图像质量上没有明显的下降。所以,将色彩信息以低于量度信息的分辨率来保存是一个简单有效的图像压缩方法。
在COLOUR SPACES .17 ITU-R recommendation BT.601 中,建议在计算Y时,权重选择为kr=0.299,kg=0.587,kb=0.114。于是常用的转换公式如下:
Y  = 0.299R + 0.587G + 0.114B
Cb = 0.564(B - Y )
Cr = 0.713(R - Y )

R = Y + 1.402Cr
G = Y - 0.344Cb - 0.714Cr
B = Y + 1.772Cb
    有了这个公式,我们就能够将一幅RGB画面转换成为YUV画面了,反过来也可以。下面将画面数据究竟是以什么形式存储起来的。
    在RGB24格式中,对于宽度为w,高度为h的画面,需要w*h*3个字节来存储其每个像素的rgb信息,画面的像素数据是连续排列的。按照r(0,0),g(0,0),b(0,0);r(0,1),g(0,1),b(0,1);…;r(w-1,0),g(w-1,0),b(w-1,0);…;r(w-1,h-1),g(w-1,h-1),b(w-1,h-1)这样的顺序存放起来。
    在YUV格式中,以YUV420格式为例。宽度为w高度为h的画面,其亮度Y数据需要w*h个字节来表示(每个像素点一个亮度)。而Cb和Cr数据则是画面中4个像素共享一个Cb,Cr值。这样Cb用w*h/4个字节,Cr用w*h/4个字节。
YUV文件中,把多个帧的画面连续存放。就是YUV YUV YUV…..这样的不断连续的形式,而其中每个YUV,就是一幅画面。
    在这单个YUV中,前w*h个字节是Y数据,接着的w*h/4个字节是Cb数据,再接着的w*h/4个字节为Cr数据。
在由这样降低了分辨率的数据还原出RGB数据的时候,就要依据像素的位置找到它对应的Y,Cb,Cr值,其中Y值最好找到,像素位置为x,y的话,Y数据中第y*width+x个数值就是它的Y值。Cb和Cr由于是每2x2像素的画面块拥有一个,这样Cb和Cr数据相当于两个分辨率为w/2 * h/2的画面,那么原来画面中的位置为x,y的像素,在这样的低分辨率画面中的位置是x/2,y/2,属于它的Cb,Cr值就在这个地方:(y/2)*(width/2)+(x/2)。
    为了直观起见,在下面的图中,分别将Y画面(Cb,Cr=0)和Cb,Cr画面(Y=128)显示出来,可见Cb,Cr画面的分辨率是Y画面的1/4。但是合成一个画面之后,我们的眼睛丝毫感觉不到4个像素是共用一个Cb,Cr的。

       Y画面

      Cb,Cr画面
将Cb,Cr画面放大观察,里面颜色相同的块都是2x2大小的。
附件为Windows Mobile上使用公式进行YUV到RGB转换的程序。其中需要注意的是Cb,Cr在计算过程中是会出现负数的,但是从-128到127这些数值都用一个字节表示,读取的时候就映射0到255这个区间,成为了无符号的值,所以要减去128,才能参与公式计算。这样的运算有浮点运算,效率是比较低的,所以要提高效率的话,一般在实用程序中使用整数计算或者查表法来代替。还有,运算后的r,g,b可能会超过0-255的区间,作一个判断进行调整就可以了。

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
linux iis7站长之家
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,