本例演示了如何从相机preview缓冲区获取YCbCr模块,并且转化为ARGB。

1. 什么是YCbCr

  • y:像素的亮度。以范围从 0 到 255 的字节值形式返回(亮度值始终为正值)。

  • cr:像素的红色色差(色差)。以有符号值的形式返回,范围从 -128 到 127 的整数值。

  • cb:像素的蓝色色差(色差)。以有符号值的形式返回,范围从 -128 到 127 的整数值。

常见的3 个基本色彩模型是RGB,CMYKYUV

YCbCr是YUV压缩和偏移的版本,但是Cb,Cr 同样都指色彩,只是在表示方法上不同而已。在YUV 家族中,YCbCr 是在计算机系统中应用最多的成员,其应用领域很广泛,JPEGMPEG均采用此格式。

YCbCr是DVD、摄像机、数字电视等消费类视频产品中,常用的色彩编码方案。YCbCr 有时会称为 YCC.。Y'CbCr 在模拟分量视频(analog component video)中也常被称为 YPbPr。YCbCr不是一种绝对色彩空间,是YUV压缩和偏移的版本。

2. YCbCr与RGB的相互转换

主要的采样格式有: YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是Y值),每 2x2 个点保存一个 Cr 和Cb 值,图像在肉眼中的感觉不会起太大的变化。所以,原来用 RGB(R,G,B 都是 8bit unsigned) 模型,每个点需要 8x3=24 bits(如下图第一个图). 而现在仅需要 8+(8/4)+(8/4)=12bites,平均每个点占12bites。这样就把图像数据压缩了一半。

YCbCr与RGB的相互转换
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

3. WP中相机获取相机缓冲区

WP中,您可以采用编程方式访问设备相机。除了拍摄照片之外,您还可以访问相机预览缓冲区以实时处理相机帧。PhotoCamera 类的GetPreviewBuffer 方法采用两种格式(ARGB 和 YCbCr)提供相机预览缓冲区中的帧。ARGB 是用于描述应用程序 UI 中颜色的格式。YCbCr 启用高效的图形处理,但不能由 Silverlight 使用。如果您想在您的应用程序中操作某个 YCbCr 帧,则需要将该帧转换为 ARGB,然后该帧才能显示。

详细见:

http://technet.microsoft.com/zh-cn/subscriptions/hh394035

代码分析:

1. Rectangle由一个VideoBrush填充。

            <Rectangle.Fill>
<VideoBrush x:Name="viewfinderBrush">
<VideoBrush.RelativeTransform>
<RotateTransform CenterX="0.5" CenterY="0.5" x:Name="viewfinderBrushTransformation" />
</VideoBrush.RelativeTransform>
</VideoBrush>
</Rectangle.Fill>

VideoBrush 是一种类似于 LinearGradientBrush 或 ImageBrush 对象的 Brush 对象,可以用来填充Fill或者设置ForeGround,BackGround。

2. 为VideoBrush设置Srouce

                cam = new PhotoCamera();
cam.Initialized += new EventHandler<CameraOperationCompletedEventArgs>(cam_Initialized);
viewfinderBrush.SetSource(cam);

3. 在后台线程中处理 相机预览缓冲区的 Frame

            if (cam != null)
{
Dispatcher.BeginInvoke(delegate()
{
// Set the orientation of the viewfinder.
viewfinderBrushTransformation.Angle = cam.Orientation;
}); // Start the background worker thread that processes the camera preview buffer frames.
bgPleaseExit = false;
bgThread = new Thread(colorConversionBackgroundWorker);
bgThread.Start();
}

4. colorConversionBackgroundWorker函数 实现

        private void colorConversionBackgroundWorker()
{
// Grouping the property change notifications in a batch.
List<PropertyChangedEventArgs> changeCache = new List<PropertyChangedEventArgs>();
changeCache.Add(new PropertyChangedEventArgs("CbText"));
/*
// For binding from the color plane label.
public string CbText
{
get { return string.Format("Cb = {0}", Cb); }
} <TextBlock Canvas.Left="16" Canvas.Top="114" Text="{Binding CbText}" />
*/
changeCache.Add(new PropertyChangedEventArgs("CrText"));
changeCache.Add(new PropertyChangedEventArgs("CrOffset"));
changeCache.Add(new PropertyChangedEventArgs("CbOffset"));
changeCache.Add(new PropertyChangedEventArgs("YOffset"));
changeCache.Add(new PropertyChangedEventArgs("ArgbText"));
changeCache.Add(new PropertyChangedEventArgs("ArgbBrush")); // 获取相机YCbCr的像素布局. 它包含了cr, cb等offset, pitch等信息
var bufferLayout = cam.YCbCrPixelLayout; // 获取容纳YCbCr的一帧的缓冲区大小
byte[] currentPreviewBuffer = new byte[bufferLayout.RequiredBufferSize]; // 循环获取相机缓冲区
while (!bgPleaseExit)
{
// 取得当前相机的帧的YCbCr数据
cam.GetPreviewBufferYCbCr(currentPreviewBuffer); // The output parameters used in the following method.
byte y;
int cr;
int cb; // 从bufferLayout中获取 Y,Cb,Cr的值
// This location is estimated to be X=320, Y=240. Adjust as desired.
GetYCbCrFromPixel(bufferLayout, currentPreviewBuffer, , , out y, out cr, out cb); // Set page-level properties to the new YCbCr values.
Y = y;
Cb = cb;
Cr = cr; Dispatcher.BeginInvoke(delegate()
{
// not threadsafe, but unlikely to be a problem in this case // Consolidating change notifications
if (PropertyChanged != null)
{
foreach (var change in changeCache)
PropertyChanged(this, change);
}
});
}
}

例子:Camera Color Picker Sample (YCbCr->ARGB)的更多相关文章

  1. [wordpress]后台自定义菜单字段和使用wordpress color picker

    Wordpress Version 4.4.2 参考链接 插件使用wordpress color picker:Add A New Color Picker To WordPress 后台菜单自定义字 ...

  2. 【WPF/C#】图层筛选/拾取——Color Picker

    文章标题实在不懂怎么表述才清楚. 描述问题:多个图片(图层)重叠时,如何通过鼠标点击来拾取到相应的图层.因为图层中会有很多空白的地方(比如图片四周),要求是获取鼠标点击位置的像素颜色值,如果为空白时或 ...

  3. 使用canvas制作的移动端color picker

    使用canvas制作的移动端color picker 项目演示地址(用手机或者手机模式打开) 我在另一个中demo,需要用到color picker,但是找不到我需要的移动端color picker, ...

  4. NX二次开发-Block UI C++界面Object Color Picker(对象颜色拾取器)控件的获取(持续补充)

    Object Color Picker(对象颜色拾取器)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_obj.h> UF_init ...

  5. 例子:Execution Model Sample - 应用状态保存

    WP中,当你的应用被切换到后台 后,就进入了休眠状态,然后当一个应用从墓碑恢复时,如何恢复相应的状态,该例子就演示了如何保存和恢复UI以及APP相关状态. 这里有一篇很好的文章,请参见: http:/ ...

  6. 例子:RSS Reader Sample

    本例演示了Rss xml信息的获取,以及如何使用SyndicationFeed来进行符合Rss规范的xml进行解析. SyndicationFeed 解析完成后 可以得到SyndicationItem ...

  7. 例子:Basic Lens sample

    本例演示了如何自己扩展一个Camera Lens. 1. UI界面是一个MediaViewer <controls:MediaViewer x:Name="MediaViewer&qu ...

  8. [UE4] C++实现Delegate Event实例(例子、example、sample)

    转自:http://aigo.iteye.com/blog/2301010 虽然官方doc上说Event的Binding方式跟Multi-Cast用法完全一样,Multi-Cast论坛上也有很多例子, ...

  9. 颜色采集器colpick Color Picker

    简单 RGB.HSB.十六进制颜色选取器 jQuery 插件. 非常直观类似 Photoshop 的界面. 光明和黑暗很容易自定义 CSS3 外观. 28 KB 总由浏览器加载看起来不错甚至在 IE7 ...

随机推荐

  1. python成长之路【第十二篇】:RabbitMQ入门

    一.RabbitMQ介绍 解释RabbitMQ,就不得不提到AMQP(Advanced Message Queuing Protocol)协议. AMQP协议是一种基于网络的消息传输协议,它能够在应用 ...

  2. 手把手教你写Sublime中的Snippet

    手把手教你写Sublime中的Snippet Sublime Text号称最性感的编辑器, 并且越来越多人使用, 美观, 高效 关于如何使用Sublime text可以参考我的另一篇文章, 相信你会喜 ...

  3. 打包发布WinForm应用程序

    1:新建安装部署项目 打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点击确定.(详细见下图) 此主题相关图片如下: 2:安装向导 点击下一步, ...

  4. 控制移动端页面的缩放(meta)

    meta标签中的content属性里有一个width=device-width的值,这个值就是用来告诉浏览器,该页面将要使用设备的宽度来解析,后面的属性值则是告诉该页面: user-scalable= ...

  5. IP地址的组成

    IP地址的组成:是因特网上,为了每一台主机分配的,由32位二进制数组成的唯一标识符,包括网络地址和主机地址两部分,网络地址标识一个物理网络,主机地址标识这个网络下的一台主机,其表示形式如下  IP地址 ...

  6. error: Your local changes to the following files would be overwritten by checkout:

    在发布这个配置文件的时候,会发生代码冲突: error: Your local changes to the following files would be overwritten by merge ...

  7. 关于favicon.ico,shortcut icon,icon

    引入一篇文章.关于favicon.ico二三事. http://www.cnblogs.com/LoveJenny/archive/2012/05/22/2512683.html 一直对favicon ...

  8. CSS样式应用

    CSS样式应用的方法: (1)行内样式,将css样式直接放到标签当中,一般都是放入标签的style属性中,它是最方便的一种样式,也是最不方便修改的样式.如下: (2)内嵌式,通过将css写在网页源文件 ...

  9. webpack入门

    一,为什么用webpack 1.由于项目中资源的多样性和依赖性 2.js模块规范复杂化 3.开发与线上文件不一致性 二.webpack 特性 1.对CommonJS.AMD.ES6语法兼容 2.对js ...

  10. log4net RemotingAppender 的配置

    Before you even start trying any of the alternatives provided, ask yourself whether you really need ...