简述WPF中的图像像素格式(PixelFormats)
原文:简述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)的更多相关文章
- 深入WPF中的图像画刷(ImageBrush)之2——ImageBrush的铺设方式
原文:深入WPF中的图像画刷(ImageBrush)之2--ImageBrush的铺设方式 ------------------------------------------------------ ...
- 深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例
原文:深入WPF中的图像画刷(ImageBrush)之1--ImageBrush使用举例 昨天我在<简述WPF中的画刷(Brush) >中简要介绍了WPF中的画刷的使用.现在接着深入研究 ...
- 简述WPF中的画刷(Brush)
原文:简述WPF中的画刷(Brush) -------------------------------------------------------------------------------- ...
- WPF中TimeSpan的坑
记一次在WPF中,在将格式为“DD.HH:mm:ss”字符串转换成TimeSpan时遇到的坑 如果字符串为:DD.HH:mm:ss,转换结果正确.例如: var currentValue = &quo ...
- .net下灰度模式图像在创建Graphics时出现:无法从带有索引像素格式的图像创建graphics对象 问题的解决方案。
在.net下,如果你加载了一副8位的灰度图像,然后想向其中绘制一些线条.或者填充一些矩形.椭圆等,都需要通过Grahpics.FromImage创建Grahphics对象,而此时会出现:无法从带有索引 ...
- C#中的bitmap类和图像像素值获取方法
一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...
- 对索引像素格式的图片进行Setpixel(具有索引像素格式的图像不支持SetPixel)解决方案
最近编写了一个验证码识别软件.其中对png.jpg图片进行二值化处理时,出现了错误:具有索引像素格式的图像不支持SetPixel解决方案.从字面上来看,这说明我对一个具有索引色的图片进行了直接RGB颜 ...
- OpenCV中图像的格式Mat 图像深度
opencv中图像的格式Mat 有图像的定义,图像深度.类型格式等,其中Mat的参数depth为深度,深度反应出图像颜色像素值: 关于数据的储存:(转) Mat_<uchar>对应的是CV ...
- 基于现有图像数据创建自定义像素格式的 BufferedImage
在最近的一个项目中,需要实现 Mac OS X 环境下的摄像头图像实时捕获并转换为 Java 中的 BufferedImage 对象.首先通过开发一个本地库实现 Mac OS X 的摄像头图像捕获,采 ...
随机推荐
- HINTERNET应包含的头文件
#include <afxinet.h> DWORD status=0;DWORD dwLen=sizeof(DWORD); if(!HttpQueryInfo(hRequest,HTTP ...
- C語言 rand函数 进阶探讨与实现
C语言中随机函数应用 可能大家都知道C语言中的随机函数random,但是random函数并非ANSI C标准,所以说.random函数不能在gcc,vc等编译器下编译通过. 那么怎么实现 ...
- 数据库中substring的用法 CONVERT(varchar(12) , getdate(), 112 )
Sqlserver中常常要操作一些时间类型的字段转换,我又不太记得住,所以搜集了下面的一些SqlserverConvertDateTime相关的资料发表在自己的小站里,方便自己以后要用的时候寻找,望对 ...
- Android怎样捕获应用的crash信息
转载请注明出处:http://blog.csdn.net/fishle123/article/details/50823358 我们的应用不可避免的会发生crash,假设是在调试阶段,我们能够使用Lo ...
- phoenixframe平台连接socketserver,并接收返回值的演示样例
package org.phoenix.cases.webservice; import java.util.LinkedList; import org.phoenix.action.WebElem ...
- php实现包含min函数的栈(这个题目用另外一个栈做单调栈的话时间复杂度会低很多)
php实现包含min函数的栈(这个题目用另外一个栈做单调栈的话时间复杂度会低很多) 一.总结 这个题目用另外一个栈做单调栈的话时间复杂度会低很多 二.php实现包含min函数的栈 题目描述 定义栈的数 ...
- Flink执行时之流处理程序生成流图
流处理程序生成流图 DataStream API所编写的流处理应用程序在生成作业图(JobGraph)并提交给JobManager之前,会预先生成流图(StreamGraph). 什么是流图 流图(S ...
- C++ 快速入门笔记:基本语法
数据类型 枚举类型 enum color { red, green, blue } colors; colors = blue; 默认情况下,第一个名称的值是 0,后面的依次加 1.也可以自定初始值: ...
- duplicate symbols for architecture
duplicate symbols for architecture XCODE编译的时候报错:duplicate symbols for architecture armv7 1.首先排查是 ...
- iOS中打电话、打开网址、发邮件、发短信等
常用小功能 小功能简介 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话-方法1 最简单最直接的方式:直接跳到拨号界面 NSURL *url = [ ...