原文:简述WPF中的图像像素格式(PixelFormats)

--------------------------------------------------------------------------------
引用或转载时请保留以下信息:
大可山 [MSN:a3news(AT)hotmail.com]
http://www.zpxp.com http://www.brawdraw.com
萝卜鼠在线图形图像处理
--------------------------------------------------------------------------------

WPF中,图像的像素格式较之于GDI+中有不少变化。比如新增了CMYK印刷通道的支持,对灰度图片的灰阶支持也有长足的进步,在颜色空间方面,新增了scRGB颜色空间,使图像的色彩处理能力有很大的提高。

为了方便加深了解,我将它们按格式性质和色彩空间大致进行了分类。比如将Gray类的放在一起,将Index类的又放在一起....

(1) BlackWhite
用于显示黑白两种色值的像素格式(非黑即白)。

(2) Gray2
2BPP(Bits Per Pixel,位/像素)的灰色通道。允许四种灰阶。

(3) Gray4
4BPP的灰度通道,允许16种灰阶值表示灰色。

(4) Gray8
显示8BPP的灰度通道,允许256种灰阶值表示灰色。

(5) Gray16
16BPP的灰色通道,最多允许65536种灰阶值表示灰色。这种格式的Gamma是1.0。

(6) Gray32Float
32BPP的灰度通道,允许超过40亿灰阶。此格式的Gamma值是1.0。

(7) Indexed1
指定2种颜色作为调色板的像素格式。

(8) Indexed2
指定4种颜色作为调色板的像素格式。

(9) Indexed4
指定16种颜色作为调色板的像素格式。

(10) Indexed8
指定256种颜色作为调色板的像素格式。

(11) Bgr24
Bgr24像素格式是一种采用24BPP的sRGB格式。 每个颜色通道(蓝色blue, 绿色green, 红色red)各占8BPP(位/像素)。

(12) Bgra32
Bgra32像素格式是一种32BPP的sRGB格式。每个颜色通道(蓝色blue, 绿色green, 红色red)各占8BPP(位/像素),与Bgr24不同的是,它还有用于表现不透明度的alpha通道(8BPP)。

(13) Bgr101010
Bgr101010像素格式是一种采用32BPP(位/像素)的sRGB格式。每个颜色通道(蓝色blue, 绿色green, 红色red)各占10BPP(位/像素)。

(14) Bgr32
Bgr32像素格式是一种采用32BPP(位/像素)的sRGB格式。与Bgr101010格式不同的是,它的每个颜色通道(蓝色blue, 绿色green, 红色red)各占8BPP(位/像素)。

(15) Bgr555
Bgr555也是一种sRGB格式,它采用16BPP(位/像素). 它的每个颜色通道(蓝色blue, 绿色green, 红色red)各占5BPP(位/像素)。

(16) Bgr565
Bgr565像素格式是一种16BPP(位/像素)的sRGB格式。它的每个颜色通道(蓝色blue, 绿色green, 红色red)分别占5BPP,6BPP,5BPP(位/像素)。

(17) Pbgra32
采用32BPP的一种基于sRGB的像素格式。每个颜色通道(蓝色blue, 绿色green, 红色red,Alpha通道)各占8BPP(位/像素)。每种颜色通道是经过与Alpha值预处理之后的。

(18) Prgba64
是一种基于sRGB格式,采用64BPP。每个颜色通道(蓝色blue, 绿色green, 红色red,Alpha通道)各占32BPP(位/像素)。每种颜色通道是经过与Alpha值预处理之后的。这种格式的Gamma是1.0。

(19) Rgb24
是一种基于sRGB格式,采用24BPP。每个颜色通道(蓝色blue, 绿色green, 红色red)各占8BPP(位/像素)。

(20) Rgb48
是一种基于sRGB格式,采用48BPP。每个颜色通道(蓝色blue, 绿色green, 红色red)各占16BPP(位/像素)。这种格式的Gamma是1.0。

(21) Rgba64
是一种基于sRGB格式,采用64BPP。每个颜色通道(蓝色blue, 绿色green, 红色red,Alpha通道)各占16BPP(位/像素)。这种格式的Gamma是1.0。 

(22) Rgb128Float
是一种基于ScRGB格式,采用128BPP。每个颜色通道各占32BPP(位/像素)。这种格式的Gamma是1.0。

(23) Rgba128Float
是一种基于ScRGB格式,采用128BPP。每个颜色通道(蓝色blue, 绿色green, 红色red,Alpha通道)各占32BPP(位/像素)。这种格式的Gamma是1.0。

(24) Prgba128Float
是一种基于ScRGB格式,采用128BPP。每个颜色通道(蓝色blue, 绿色green, 红色red,Alpha通道)各占32BPP(位/像素)。每种颜色通道是经过与Alpha值预处理之后的。这种格式的Gamma是1.0。

(25) Cmyk32
用于表现印刷色格式,采用32BPP,共四个颜色通道即C、M、Y、K(青色Cyan, 品红Magenta, 黄色Yellow和黑色blacK),各占8PP。

如果你深入看看System.Windows.Media 下PixelFormats的公共属性时,你还会发现有一个PixelFormats.Default:它是用于系统根据不同的条件,选用最合适的像素格式操作(由系统判断)。

使用如下代码可以列出PixelFormats的一些细节:

        StringBuilder sb = new StringBuilder();
        void ListPixelFormats(object sender, RoutedEventArgs e)
        {
            foreach (PropertyInfo pi in typeof(PixelFormats).GetProperties())
            {
                PixelFormat myPixelFormat = (PixelFormat)pi.GetValue(pi, null);
                if (myPixelFormat != PixelFormats.Default)
                {
                    int bpp = myPixelFormat.BitsPerPixel;

                    sb.AppendLine("PixelFormats." + myPixelFormat.ToString());
                    sb.AppendLine("BPP:" + bpp.ToString());
                    /*
                    IList<PixelFormatChannelMask> myChannelMaskCollection = myPixelFormat.Masks;

                    foreach (PixelFormatChannelMask myMask in myChannelMaskCollection)
                    {
                        sb.AppendLine(myMask.ToString());
                        IList<byte> myBytesCollection = myMask.Mask;
                        foreach (byte myByte in myBytesCollection)
                        {
                            sb.AppendLine(myByte.ToString());
                        }
                    }
                    */
                }
                else
                {
                    sb.AppendLine("PixelFormats.Default");
                }

                sb.AppendLine("---------------------------------------");

            }

            this.txtBoxPixelFormatsList.Text = sb.ToString();
        }

下面给出一个将图像转换为灰色图片并在窗体中显示出来的例子:

显示效果图片如下:

XAML代码:
<Window
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 x:Class="ButtonSimple.PixelFormatsDemo"
 x:Name="Window"
 Title="PixelFormatsDemo"
 Width="400" Height="600">
<Canvas>
   <Canvas.Resources>
    <BitmapImage x:Key="masterImage" DecodePixelHeight="280"
     UriSource="33.jpg"/>
    <FormatConvertedBitmap x:Key="convertFormatImage" Source="{StaticResource masterImage}"
     DestinationFormat="Gray32Float" />    
  </Canvas.Resources>
 <Image Height="280" Canvas.Left="8" Canvas.Top="18" Source="33.jpg" Stretch="Fill"/>
 <Image Height="280" Canvas.Left="8" Canvas.Top="300" Source="{StaticResource convertFormatImage}" Stretch="Fill"/>
  </Canvas>
</Window>

上面是原始图片的显示效果,下面是变成Gray32Float像素格式后的样子。

C#代码:
        //将图片转灰度
        public FormatConvertedBitmapExample()
        {
            BitmapImage myBitmapImage = new BitmapImage();
            myBitmapImage.BeginInit();
            myBitmapImage.UriSource = new Uri(@"33.jpg",UriKind.Relative);
            myBitmapImage.DecodePixelHeight = 280;
            myBitmapImage.EndInit();
            FormatConvertedBitmap newFormatedBitmapSource = new FormatConvertedBitmap();
            newFormatedBitmapSource.BeginInit();
            newFormatedBitmapSource.Source = myBitmapImage;
            newFormatedBitmapSource.DestinationFormat = PixelFormats.Gray32Float;
            newFormatedBitmapSource.EndInit();
            Image myImage = new Image();
            myImage.Height = 280;
            myImage.Source = newFormatedBitmapSource;
            // 其他代码
        }

从上面代码看,WPF中对图像格式的转换显然比在GDI+中方便很多,代码量可用“超少”来形容。原因在于WPF中已经帮我们实现了大部分格式转换的功能。

有时间我再将它们之间的图像像素格式转换写一些例子,分别讲解,这样更能加深图像颜色处理方面的印象。敬请关注我BLOG(http://blog.csdn.net/johnsuna)相关内容的更新。

简述WPF中的图像像素格式(PixelFormats)的更多相关文章

  1. 深入WPF中的图像画刷(ImageBrush)之2——ImageBrush的铺设方式

    原文:深入WPF中的图像画刷(ImageBrush)之2--ImageBrush的铺设方式 ------------------------------------------------------ ...

  2. 深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例

    原文:深入WPF中的图像画刷(ImageBrush)之1--ImageBrush使用举例 昨天我在<简述WPF中的画刷(Brush)  >中简要介绍了WPF中的画刷的使用.现在接着深入研究 ...

  3. 简述WPF中的画刷(Brush)

    原文:简述WPF中的画刷(Brush) -------------------------------------------------------------------------------- ...

  4. WPF中TimeSpan的坑

    记一次在WPF中,在将格式为“DD.HH:mm:ss”字符串转换成TimeSpan时遇到的坑 如果字符串为:DD.HH:mm:ss,转换结果正确.例如: var currentValue = &quo ...

  5. .net下灰度模式图像在创建Graphics时出现:无法从带有索引像素格式的图像创建graphics对象 问题的解决方案。

    在.net下,如果你加载了一副8位的灰度图像,然后想向其中绘制一些线条.或者填充一些矩形.椭圆等,都需要通过Grahpics.FromImage创建Grahphics对象,而此时会出现:无法从带有索引 ...

  6. C#中的bitmap类和图像像素值获取方法

    一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...

  7. 对索引像素格式的图片进行Setpixel(具有索引像素格式的图像不支持SetPixel)解决方案

    最近编写了一个验证码识别软件.其中对png.jpg图片进行二值化处理时,出现了错误:具有索引像素格式的图像不支持SetPixel解决方案.从字面上来看,这说明我对一个具有索引色的图片进行了直接RGB颜 ...

  8. OpenCV中图像的格式Mat 图像深度

    opencv中图像的格式Mat 有图像的定义,图像深度.类型格式等,其中Mat的参数depth为深度,深度反应出图像颜色像素值: 关于数据的储存:(转) Mat_<uchar>对应的是CV ...

  9. 基于现有图像数据创建自定义像素格式的 BufferedImage

    在最近的一个项目中,需要实现 Mac OS X 环境下的摄像头图像实时捕获并转换为 Java 中的 BufferedImage 对象.首先通过开发一个本地库实现 Mac OS X 的摄像头图像捕获,采 ...

随机推荐

  1. javascript进阶教程第三章--匿名和闭包--案例实战

    javascript进阶教程第三章--匿名和闭包--案例实战 一.学习任务 通过几个小练习回顾学过的知识点 二.实例 练习1: 实例描述:打开页面后规定时间内弹出一个新窗口,新窗口指定时间后自动关闭. ...

  2. 几款用jQuery写的h5小游戏

    人人都说前端用来做游戏是一件很困难的事情,遇到这些js的逻辑性问题,是不是有点懵?其实,做完一款游戏之后就会发现,没啥难的地方,差不多都是换汤不换药,作为爱玩游戏的我,也总结收集了几款比较流行的小软件 ...

  3. Jquery浅克隆与深克隆是什么

    Jquery浅克隆与深克隆是什么 一.总结 一句话总结:克隆的那些标签内容就是对应元素的html,事件就是那些绑定的事件. 1.jquery克隆的时候的注意事项是什么? 元素数据(data)内对象和数 ...

  4. stm32的DMA传输一半中断

    这里本想做一个录音程序 硬件很简单: MIC(麦克风)放大滤波电路---->stm32的ADC----->DMA通道----->一个数组缓存------->通过FATFS的  ...

  5. [Angular] Using InjectionToken

    Previously we have 'OpaqueToken', but it is DEPRECATED. The new one is called 'InjectionToken'. The ...

  6. Android 获取签名证书的具体信息(Eclipse和Android studio通用)

    今天要用到签名证书的MD5,可是这个仅仅有在第一次生成的时候我看到了,这可怎么办呢,幸亏我们有google,我们执行以下的命令就OK了. keytool -list -v -keystore 签名证书 ...

  7. ORA-00907: 缺失右括号问题整理解决

    ORA-00907: 缺失右括号 前言 近期在开发过程中使用oracle数据库,在程序中进行查询数据时遇到了"ORA-00907: 缺失右括号"的问题.可是假设直接把sql语句直接 ...

  8. .NET Framework基础知识(二)(转载)

    1.课外:为什么object数组可以赋值给object类型,int数组却不能赋值给int类型? 答:因为不管是什么什么数组都继承自Array,而Array又继承自object. 2.线程:是操作系统分 ...

  9. 小强的HTML5移动开发之路(52)——jquerymobile中的触控交互

    当使用移动设备进行触控操作时,最常用的就是轻击.按住屏幕或者手势操作,jQuery Mobile可以通过绑定的触控事件来响应使用者的特定触控行为. 一.轻击与按住 直接上代码(一切皆在代码中,细细品吧 ...

  10. html页面保存数的两种方式

    原文链接:https://blog.csdn.net/qq_37936542/article/details/78866755 需求:微信开发时,在某个页面授权获取用户的openid,但是每次刷新页面 ...